Browse Source

Fiber is now allocated in gravity_vm_new, added new gravity_vm_loadclosure function, renamed gravity_vm_run to gravity_vm_runmain

Marco Bambini 8 years ago
parent
commit
b49703eb81
4 changed files with 29 additions and 15 deletions
  1. 2 7
      src/cli/gravity.c
  2. 8 1
      src/cli/unittest.c
  3. 17 6
      src/runtime/gravity_vm.c
  4. 2 1
      src/runtime/gravity_vm.h

+ 2 - 7
src/cli/gravity.c

@@ -11,6 +11,7 @@
 #include "gravity_vm.h"
 
 #define DEFAULT_OUTPUT "gravity.json"
+
 typedef enum  {
 	OP_COMPILE,			// just compile source code and exit
 	OP_RUN,				// just run an already compiled file
@@ -38,11 +39,6 @@ static void report_error (error_type_t error_type, const char *message, error_de
 	printf("%s\n", message);
 }
 
-static void report_log (const char *message, void *xdata) {
-	#pragma unused(xdata)
-	printf("LOG: %s\n", message);
-}
-
 static const char *load_file (const char *file, size_t *size, uint32_t *fileid, void *xdata) {
 	#pragma unused(fileid, xdata)
 	
@@ -153,7 +149,6 @@ int main (int argc, const char* argv[]) {
 	
 	// setup compiler/VM delegate
 	gravity_delegate_t delegate = {
-		.log_callback = report_log,
 		.error_callback = report_error,
 		.loadfile_callback = load_file
 	};
@@ -201,7 +196,7 @@ int main (int argc, const char* argv[]) {
 	// sanity check
 	assert(closure);
 	
-	if (gravity_vm_run(vm, closure)) {
+	if (gravity_vm_runmain(vm, closure)) {
 		gravity_value_t result = gravity_vm_result(vm);
 		double t = gravity_vm_time(vm);
 		

+ 8 - 1
src/cli/unittest.c

@@ -87,6 +87,13 @@ static void test_folder (const char *folder_path, test_data *data) {
 	
 	const char *target_file;
 	while ((target_file = directory_read(dir))) {
+		
+		#ifdef WIN32
+		const char winbuffer[MAX_PATH];
+		WideCharToMultiByte (CP_UTF8, 0, (LPCWSTR)target_file, -1, winbuffer, sizeof(winbuffer), NULL, NULL );
+		target_file = (const char *)winbuffer;
+		#endif
+		
 		// if file is a folder then start recursion
 		const char *full_path = file_buildpath(target_file, folder_path);
 		if (is_directory(full_path)) {
@@ -125,7 +132,7 @@ static void test_folder (const char *folder_path, test_data *data) {
 		gravity_compiler_free(compiler);
 		
 		if (closure) {
-			if (gravity_vm_run(vm, closure)) {
+			if (gravity_vm_runmain(vm, closure)) {
 				data->processed = true;
 				gravity_value_t result = gravity_vm_result(vm);
 				if (gravity_value_equals(result, data->expected_value)) {

+ 17 - 6
src/runtime/gravity_vm.c

@@ -1268,6 +1268,9 @@ gravity_vm *gravity_vm_new (gravity_delegate_t *delegate/*, uint32_t context_siz
 	vm->transfer = gravity_gc_transfer;
 	vm->cleanup = gravity_gc_cleanup;
 	
+	// allocate default fiber
+	vm->fiber = gravity_fiber_new(vm, NULL, 0, 0);
+	
 	vm->pc = 0;
 	vm->delegate = delegate;
 	vm->context = gravity_hash_create(/*(context_size) ? context_size : */DEFAULT_CONTEXT_SIZE, gravity_value_hash, gravity_value_equals, NULL, NULL);
@@ -1393,6 +1396,17 @@ static void gravity_vm_stats (gravity_vm *vm) {
 }
 #endif
 
+void gravity_vm_loadclosure (gravity_vm *vm, gravity_closure_t *closure) {
+	// closure MUST BE $moduleinit so sanity check here
+	if (string_cmp(closure->f->identifier, INITMODULE_NAME) != 0) return;
+	
+	// re-use main fiber
+	gravity_fiber_reassign(vm->fiber, closure, 0);
+	
+	// execute $moduleinit in order to initialize VM
+	gravity_vm_exec(vm);
+}
+
 bool gravity_vm_runclosure (gravity_vm *vm, gravity_closure_t *closure, gravity_value_t selfvalue, gravity_value_t params[], uint16_t nparams) {
 	if (vm->aborted) return false;
 	
@@ -1480,12 +1494,9 @@ bool gravity_vm_runclosure (gravity_vm *vm, gravity_closure_t *closure, gravity_
 	return result;
 }
 
-bool gravity_vm_run (gravity_vm *vm, gravity_closure_t *closure) {
-	// f is $moduleinit (first function to be executed)
-	vm->fiber = gravity_fiber_new(vm, closure, 0, 0);
-	
-	// execute $moduleinit in order to initialize VM
-	gravity_vm_exec(vm);
+bool gravity_vm_runmain (gravity_vm *vm, gravity_closure_t *closure) {
+	// first load closure into vm
+	if (closure) gravity_vm_loadclosure(vm, closure);
 	
 	// lookup main function
 	gravity_value_t main = gravity_vm_getvalue(vm, MAIN_FUNCTION, (uint32_t)strlen(MAIN_FUNCTION));

+ 2 - 1
src/runtime/gravity_vm.h

@@ -22,7 +22,8 @@ void				gravity_vm_set_callbacks (gravity_vm *vm, vm_transfer_cb vm_transfer, vm
 void				gravity_vm_free (gravity_vm *vm);
 void				gravity_vm_reset (gravity_vm *vm);
 bool				gravity_vm_runclosure (gravity_vm *vm, gravity_closure_t *closure, gravity_value_t selfvalue, gravity_value_t params[], uint16_t nparams);
-bool				gravity_vm_run (gravity_vm *vm, gravity_closure_t *closure);
+bool				gravity_vm_runmain (gravity_vm *vm, gravity_closure_t *closure);
+void				gravity_vm_loadclosure (gravity_vm *vm, gravity_closure_t *closure);
 void				gravity_vm_setvalue (gravity_vm *vm, const char *key, gravity_value_t value);
 gravity_value_t		gravity_vm_lookup (gravity_vm *vm, gravity_value_t key);
 gravity_value_t		gravity_vm_getvalue (gravity_vm *vm, const char *key, uint32_t keylen);