浏览代码

Added extract check to gravity_value_isobject and improved gravity_value_dump

Marco Bambini 6 年之前
父节点
当前提交
27f7f27a3f
共有 1 个文件被更改,包括 15 次插入3 次删除
  1. 15 3
      src/shared/gravity_value.c

+ 15 - 3
src/shared/gravity_value.c

@@ -1241,7 +1241,6 @@ uint32_t gravity_upvalue_size (gravity_vm *vm, gravity_upvalue_t *upvalue) {
 }
 
 void gravity_upvalue_blacken (gravity_vm *vm, gravity_upvalue_t *upvalue) {
-    #pragma unused(vm)
     gravity_vm_memupdate(vm, gravity_upvalue_size(vm, upvalue));
     gravity_gray_value(vm, upvalue->closed);
 }
@@ -1858,7 +1857,14 @@ bool gravity_value_isobject (gravity_value_t v) {
 
     if ((v.isa == NULL) || (v.isa == gravity_class_int) || (v.isa == gravity_class_float) ||
         (v.isa == gravity_class_bool) || (v.isa == gravity_class_null) || (v.p == NULL)) return false;
-    return true;
+    
+    // extra check to allow ONLY known objects
+    if ((v.isa == gravity_class_string) || (v.isa == gravity_class_object) || (v.isa == gravity_class_function) ||
+        (v.isa == gravity_class_closure) || (v.isa == gravity_class_fiber) || (v.isa == gravity_class_class) ||
+        (v.isa == gravity_class_instance) || (v.isa == gravity_class_module) || (v.isa == gravity_class_list) ||
+        (v.isa == gravity_class_map) || (v.isa == gravity_class_range) || (v.isa == gravity_class_upvalue)) return true;
+    
+    return false;
 }
 
 uint32_t gravity_value_size (gravity_vm *vm, gravity_value_t v) {
@@ -1921,6 +1927,12 @@ void gravity_value_dump (gravity_vm *vm, gravity_value_t v, char *buffer, uint16
         value = VALUE_AS_FUNCTION(v)->identifier;
         snprintf(buffer, len, "(%s) %s (%p)", type, value, VALUE_AS_FUNCTION(v));
         value = buffer;
+    } else if (v.isa == gravity_class_closure) {
+        type = "CLOSURE";
+        gravity_function_t *f = VALUE_AS_CLOSURE(v)->f;
+        value = (f->identifier) ? (f->identifier) : "anon";
+        snprintf(buffer, len, "(%s) %s (%p)", type, value, VALUE_AS_CLOSURE(v));
+        value = buffer;
     } else if (v.isa == gravity_class_class) {
         type = "CLASS";
         value = VALUE_AS_CLASS(v)->identifier;
@@ -1932,7 +1944,7 @@ void gravity_value_dump (gravity_vm *vm, gravity_value_t v, char *buffer, uint16
         snprintf(buffer, len, "(%s) %.*s (%p)", type, s->len, s->s, s);
         value = buffer;
     } else if (v.isa == gravity_class_instance) {
-        type = "INSTANCE OF CLASS";
+        type = "INSTANCE";
         gravity_instance_t *i = VALUE_AS_INSTANCE(v);
         gravity_class_t *c = i->objclass;
         value = c->identifier;