فهرست منبع

Fixed an issue that could occur when the VM is used without the compiler.

Marco Bambini 6 سال پیش
والد
کامیت
42088eac92
3فایلهای تغییر یافته به همراه6 افزوده شده و 2 حذف شده
  1. 1 1
      src/runtime/gravity_core.c
  2. 1 0
      src/runtime/gravity_core.h
  3. 4 1
      src/runtime/gravity_vm.c

+ 1 - 1
src/runtime/gravity_core.c

@@ -2862,7 +2862,7 @@ void computed_property_free (gravity_class_t *c, const char *name, bool remove_f
     if (remove_flag) gravity_hash_remove(c->htable, key);
 }
 
-static void gravity_core_init (void) {
+void gravity_core_init (void) {
     // this function must be executed ONCE
     if (core_inited) return;
     core_inited = true;

+ 1 - 0
src/runtime/gravity_core.h

@@ -16,6 +16,7 @@ extern "C" {
 #endif
 
 // core functions
+GRAVITY_API void gravity_core_init (void);
 GRAVITY_API void gravity_core_register (gravity_vm *vm);
 GRAVITY_API bool gravity_iscore_class (gravity_class_t *c);
 GRAVITY_API void gravity_core_free (void);

+ 4 - 1
src/runtime/gravity_vm.c

@@ -1433,6 +1433,8 @@ static bool gravity_vm_exec (gravity_vm *vm) {
 }
 
 gravity_vm *gravity_vm_new (gravity_delegate_t *delegate) {
+    gravity_core_init();
+    
     gravity_vm *vm = mem_alloc(NULL, sizeof(gravity_vm));
     if (!vm) return NULL;
 
@@ -1466,6 +1468,7 @@ gravity_vm *gravity_vm_new (gravity_delegate_t *delegate) {
 }
 
 gravity_vm *gravity_vm_newmini (void) {
+    gravity_core_init();
     gravity_vm *vm = mem_alloc(NULL, sizeof(gravity_vm));
     return vm;
 }
@@ -1588,7 +1591,7 @@ bool gravity_vm_runclosure (gravity_vm *vm, gravity_closure_t *closure, gravity_
 
     // do not waste cycles on empty functions
     gravity_function_t *f = closure->f;
-    if ((f->tag == EXEC_TYPE_NATIVE) && ((!f->bytecode) || (f->ninsts == 0))) return true;
+    if (f && (f->tag == EXEC_TYPE_NATIVE) && ((!f->bytecode) || (f->ninsts == 0))) return true;
 
     // current execution fiber
     gravity_fiber_t     *fiber = vm->fiber;