Browse Source

Merge remote-tracking branch 'refs/remotes/marcobambini/master'

Saša Barišić 8 years ago
parent
commit
ec6b7f73a0
3 changed files with 21 additions and 12 deletions
  1. 3 3
      src/compiler/gravity_ast.c
  2. 9 6
      src/runtime/gravity_vm.c
  3. 9 3
      src/utils/gravity_utils.c

+ 3 - 3
src/compiler/gravity_ast.c

@@ -265,9 +265,9 @@ bool gnode_is_equal (gnode_t *node1, gnode_t *node2) {
 		gnode_literal_expr_t *e2 = (gnode_literal_expr_t *)node2;
 		gnode_literal_expr_t *e2 = (gnode_literal_expr_t *)node2;
 		if (e1->type != e2->type) return false;
 		if (e1->type != e2->type) return false;
 		// LITERAL_STRING, LITERAL_FLOAT, LITERAL_INT, LITERAL_BOOL
 		// LITERAL_STRING, LITERAL_FLOAT, LITERAL_INT, LITERAL_BOOL
-		if (e1->type == LITERAL_BOOL) return (e1->value.n64 == e1->value.n64);
-		if (e1->type == LITERAL_INT) return (e1->value.n64 == e1->value.n64);
-		if (e1->type == LITERAL_FLOAT) return (e1->value.d == e1->value.d);
+		if (e1->type == LITERAL_BOOL) return (e1->value.n64 == e2->value.n64);
+		if (e1->type == LITERAL_INT) return (e1->value.n64 == e2->value.n64);
+		if (e1->type == LITERAL_FLOAT) return (e1->value.d == e2->value.d);
 		if (e1->type == LITERAL_STRING) return (strcmp(e1->value.str, e2->value.str)==0);
 		if (e1->type == LITERAL_STRING) return (strcmp(e1->value.str, e2->value.str)==0);
 	}
 	}
 	return false;
 	return false;

+ 9 - 6
src/runtime/gravity_vm.c

@@ -343,13 +343,14 @@ static bool gravity_vm_exec (gravity_vm *vm) {
 					} break;
 					} break;
 						
 						
 					case EXEC_TYPE_INTERNAL: {
 					case EXEC_TYPE_INTERNAL: {
-						SETVALUE(r1, VALUE_FROM_NULL);
+						// backup register r1 because it can be overwrite to return a closure
+						gravity_value_t r1copy = STACK_GET(r1);
 						if (!closure->f->internal(vm, &stackstart[rwin], 2, r1)) {
 						if (!closure->f->internal(vm, &stackstart[rwin], 2, r1)) {
 							
 							
 							// check for special getter trick
 							// check for special getter trick
 							if (VALUE_ISA_CLOSURE(STACK_GET(r1))) {
 							if (VALUE_ISA_CLOSURE(STACK_GET(r1))) {
 								closure = VALUE_AS_CLOSURE(STACK_GET(r1));
 								closure = VALUE_AS_CLOSURE(STACK_GET(r1));
-								SETVALUE(r1, VALUE_FROM_NULL);
+								SETVALUE(r1, r1copy);
 								goto execute_load_function;
 								goto execute_load_function;
 							}
 							}
 							
 							
@@ -470,12 +471,13 @@ static bool gravity_vm_exec (gravity_vm *vm) {
 					} break;
 					} break;
 						
 						
 					case EXEC_TYPE_INTERNAL: {
 					case EXEC_TYPE_INTERNAL: {
-						SETVALUE(r1, VALUE_FROM_NULL);
+						// backup register r1 because it can be overwrite to return a closure
+						gravity_value_t r1copy = STACK_GET(r1);
 						if (!closure->f->internal(vm, &stackstart[rwin], 2, r1)) {
 						if (!closure->f->internal(vm, &stackstart[rwin], 2, r1)) {
 							// check for special getter trick
 							// check for special getter trick
 							if (VALUE_ISA_CLOSURE(STACK_GET(r1))) {
 							if (VALUE_ISA_CLOSURE(STACK_GET(r1))) {
 								closure = VALUE_AS_CLOSURE(STACK_GET(r1));
 								closure = VALUE_AS_CLOSURE(STACK_GET(r1));
-								SETVALUE(r1, VALUE_FROM_NULL);
+								SETVALUE(r1, r1copy);
 								goto execute_store_function;
 								goto execute_store_function;
 							}
 							}
 							
 							
@@ -1021,12 +1023,13 @@ static bool gravity_vm_exec (gravity_vm *vm) {
 					} break;
 					} break;
 						
 						
 					case EXEC_TYPE_INTERNAL: {
 					case EXEC_TYPE_INTERNAL: {
-						SETVALUE(r1, VALUE_FROM_NULL);
+						// backup register r1 because it can be overwrite to return a closure
+						gravity_value_t r1copy = STACK_GET(r1);
 						if (!closure->f->internal(vm, &stackstart[rwin], r3, r1)) {
 						if (!closure->f->internal(vm, &stackstart[rwin], r3, r1)) {
 							// check for special getter trick
 							// check for special getter trick
 							if (VALUE_ISA_CLOSURE(STACK_GET(r1))) {
 							if (VALUE_ISA_CLOSURE(STACK_GET(r1))) {
 								closure = VALUE_AS_CLOSURE(STACK_GET(r1));
 								closure = VALUE_AS_CLOSURE(STACK_GET(r1));
-								SETVALUE(r1, VALUE_FROM_NULL);
+								SETVALUE(r1, r1copy);
 								goto execute_call_function;
 								goto execute_call_function;
 							}
 							}
 							
 							

+ 9 - 3
src/utils/gravity_utils.c

@@ -220,11 +220,11 @@ DIRREF directory_init (const char *dirpath) {
 	MultiByteToWideChar(CP_UTF8, 0, dirpath, -1, dirpathW, MAX_PATH);
 	MultiByteToWideChar(CP_UTF8, 0, dirpath, -1, dirpathW, MAX_PATH);
 	
 	
 	// in this way I can be sure that the first file returned (and lost) is .
 	// in this way I can be sure that the first file returned (and lost) is .
-	PathCombine(path, dirpathW, _T("*"));
+	PathCombineW(path, dirpathW, _T("*"));
 	
 	
 	// if the path points to a symbolic link, the WIN32_FIND_DATA buffer contains
 	// if the path points to a symbolic link, the WIN32_FIND_DATA buffer contains
 	// information about the symbolic link, not the target
 	// information about the symbolic link, not the target
-	return FindFirstFile(path, &findData);
+	return FindFirstFileW(path, &findData);
 	#else
 	#else
 	return opendir(dirpath);
 	return opendir(dirpath);
 	#endif
 	#endif
@@ -236,6 +236,8 @@ const char *directory_read (DIRREF ref) {
 	while (1) {
 	while (1) {
 		#ifdef WIN32
 		#ifdef WIN32
 		WIN32_FIND_DATA findData;
 		WIN32_FIND_DATA findData;
+		const char 			*file_name;
+		
 		if (FindNextFile(ref, &findData) == 0) {
 		if (FindNextFile(ref, &findData) == 0) {
 			FindClose(ref);
 			FindClose(ref);
 			return NULL;
 			return NULL;
@@ -243,7 +245,11 @@ const char *directory_read (DIRREF ref) {
 		if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) continue;
 		if (findData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) continue;
 		if (findData.cFileName == NULL) continue;
 		if (findData.cFileName == NULL) continue;
 		if (findData.cFileName[0] == '.') continue;
 		if (findData.cFileName[0] == '.') continue;
-		return (const char *)findData.cFileName;
+
+		file_name = malloc(MAX_PATH);
+		strncpy(file_name, findData.cFileName, MAX_PATH);
+
+		return (const char *)file_name;
 		#else
 		#else
 		struct dirent *d;
 		struct dirent *d;
 		if ((d = readdir(ref)) == NULL) {
 		if ((d = readdir(ref)) == NULL) {