]> Nishi Git Mirror - gwion.git/commitdiff
:bug: Fix builtin enums
authorfennecdjay <astor.jeremie@wanadoo.fr>
Sat, 19 Jan 2019 19:45:09 +0000 (20:45 +0100)
committerfennecdjay <astor.jeremie@wanadoo.fr>
Sat, 19 Jan 2019 19:45:09 +0000 (20:45 +0100)
src/lib/import.c
src/oo/nspc.c
src/oo/value.c
tests/test_plugins/enum.c

index e127cf8786266c215a9eb84cafb679adcaf3d7d9..392a46759a17bd5f26a85137575b185b504a0527 100644 (file)
@@ -610,12 +610,16 @@ ANN m_int gwi_enum_add(const Gwi gwi, const m_str name, const m_uint i) {
   return list ? 1 : -1;
 }
 
-ANN static void import_enum_end(DL_Enum* d, const Vector v) {
+ANN static void import_enum_end(const Gwi gwi, const Vector v) {
+  DL_Enum* d = &gwi->enum_data;
   for(m_uint i = 0; i < vector_size(v); i++) {
     Value value = (Value)vector_at(v, i);
     const m_uint addr = vector_at(&d->addr, i);
     SET_FLAG(value, builtin);
-    value->d.ptr = (m_uint*)(addr ? addr : i);
+    if(!gwi->env->class_def)
+      value->d.ptr = (m_uint*)(addr ? addr : i);
+    else
+      value->d.ptr = (m_uint*)(addr ? *(m_uint*)addr : i);
   }
   d->t = NULL;
   d->base = NULL;
@@ -629,7 +633,7 @@ ANN m_int gwi_enum_end(const Gwi gwi) {
     free_id_list(d->base);
     return GW_ERROR;
   }
-  import_enum_end(d, &stmt->d.stmt_enum.values);
+  import_enum_end(gwi, &stmt->d.stmt_enum.values);
   free_stmt(stmt);
   return GW_OK;
 }
index 7be5c8f86621c4dde4ab385ef58e49d5c870c0c3..0b3c730a83ca9c3d5cc70e43d6ec4238cf61f02e 100644 (file)
@@ -47,7 +47,7 @@ ANN static void free_nspc_value(const Nspc a) {
   while(scope_iter(&iter, &v) > 0) {
     if(isa(v->type, t_object) > 0  ||
         (isa(v->type, t_union) > 0 &&
-        (GET_FLAG(v, static) ||GET_FLAG(v, global)))) {
+        (GET_FLAG(v, static) || GET_FLAG(v, global)))) {
       nspc_release_object(a, v);
     }
     REM_REF(v);
index 4926262a425ec1ca86fec069ff344b07795fe871..91afaa90f3bf0f0490a84286128956547f026266 100644 (file)
@@ -15,7 +15,10 @@ ANN Value new_value(struct Gwion_* gwion, const Type type, const m_str name) {
   return a;
 }
 ANN void free_value(Value a) {
-  if(!GET_FLAG(a, func) && !GET_FLAG(a, constprop) && a->d.ptr && isa(a->type, t_object) < 0)
+//  if(!GET_FLAG(a, func) && !GET_FLAG(a, constprop) && a->d.ptr && isa(a->type, t_object) < 0)
+  if(!GET_FLAG(a, func) && !GET_FLAG(a, constprop) && a->d.ptr &&
+!(GET_FLAG(a, enum) && GET_FLAG(a, builtin) && a->owner_class)
+&& isa(a->type, t_object) < 0)
     _mp_free(a->type->size, a->d.ptr);
   if(isa(a->type, t_class) > 0 || isa(a->type, t_function) > 0)
     REM_REF(a->type)
index 34a805ee78c4f0d0d4fb4de82ee9733d1e42c804..032d7855f2e8ff080b822ee398f7d4710d1699c7 100644 (file)
 
 GWION_IMPORT(enum_test) {
   CHECK_BB(gwi_enum_ini(gwi, NULL))
-  CHECK_BB(gwi_enum_add(gwi, "ENUM0", 0))
-  CHECK_BB(gwi_enum_add(gwi, "ENUM1", 0))
-  CHECK_BB(gwi_enum_add(gwi, "ENUM2", 0))
-  CHECK_BB(gwi_enum_add(gwi, "ENUM3", 0))
-  CHECK_BB(gwi_enum_add(gwi, "ENUM4", 0))
-  CHECK_BB(gwi_enum_add(gwi, "ENUM5", 0))
-  CHECK_BB(gwi_enum_add(gwi, "ENUM6", 0))
-  CHECK_BB(gwi_enum_add(gwi, "ENUM7", 0))
-  CHECK_BB(gwi_enum_add(gwi, "ENUM8", 0))
-  CHECK_BB(gwi_enum_add(gwi, "ENUM9", 0))
+    CHECK_BB(gwi_enum_add(gwi, "ENUM0", 0))
+    CHECK_BB(gwi_enum_add(gwi, "ENUM1", 1))
+    CHECK_BB(gwi_enum_add(gwi, "ENUM2", 2))
+    CHECK_BB(gwi_enum_add(gwi, "ENUM3", 3))
+    CHECK_BB(gwi_enum_add(gwi, "ENUM4", 4))
+    CHECK_BB(gwi_enum_add(gwi, "ENUM5", 5))
+    CHECK_BB(gwi_enum_add(gwi, "ENUM6", 6))
+    CHECK_BB(gwi_enum_add(gwi, "ENUM7", 7))
+    CHECK_BB(gwi_enum_add(gwi, "ENUM8", 8))
+    CHECK_BB(gwi_enum_add(gwi, "ENUM9", 9))
   CHECK_BB(gwi_enum_end(gwi))
 
   CHECK_BB(gwi_enum_ini(gwi, "test"))
-  CHECK_BB(gwi_enum_add(gwi, "TYPED_ENUM0", 0))
-  CHECK_BB(gwi_enum_add(gwi, "TYPED_ENUM1", 0))
-  CHECK_BB(gwi_enum_add(gwi, "TYPED_ENUM2", 0))
-  CHECK_BB(gwi_enum_add(gwi, "TYPED_ENUM3", 0))
-  CHECK_BB(gwi_enum_add(gwi, "TYPED_ENUM4", 0))
-  CHECK_BB(gwi_enum_add(gwi, "TYPED_ENUM5", 0))
-  CHECK_BB(gwi_enum_add(gwi, "TYPED_ENUM6", 0))
-  CHECK_BB(gwi_enum_add(gwi, "TYPED_ENUM7", 0))
-  CHECK_BB(gwi_enum_add(gwi, "TYPED_ENUM8", 0))
-  CHECK_BB(gwi_enum_add(gwi, "TYPED_ENUM9", 0))
+    CHECK_BB(gwi_enum_add(gwi, "TYPED_ENUM0", 0))
+    CHECK_BB(gwi_enum_add(gwi, "TYPED_ENUM1", 1))
+    CHECK_BB(gwi_enum_add(gwi, "TYPED_ENUM2", 2))
+    CHECK_BB(gwi_enum_add(gwi, "TYPED_ENUM3", 3))
+    CHECK_BB(gwi_enum_add(gwi, "TYPED_ENUM4", 4))
+    CHECK_BB(gwi_enum_add(gwi, "TYPED_ENUM5", 5))
+    CHECK_BB(gwi_enum_add(gwi, "TYPED_ENUM6", 6))
+    CHECK_BB(gwi_enum_add(gwi, "TYPED_ENUM7", 7))
+    CHECK_BB(gwi_enum_add(gwi, "TYPED_ENUM8", 8))
+    CHECK_BB(gwi_enum_add(gwi, "TYPED_ENUM9", 9))
   CHECK_BB(gwi_enum_end(gwi))
-  
+
   Type t_enum;
-  CHECK_OB((t_enum = gwi_mk_type(gwi, "Enum", SZ_INT, NULL)))
-  CHECK_BB(gwi_class_ini(gwi, t_enum, 0, NULL))
-  
+  CHECK_OB((t_enum = gwi_mk_type(gwi, "Enum", 0, NULL)))
+  CHECK_BB(gwi_class_ini(gwi, t_enum, NULL, NULL))
     CHECK_BB(gwi_enum_ini(gwi, 0))
-    CHECK_BB(gwi_enum_add(gwi, "ENUM0", 0))
-    CHECK_BB(gwi_enum_add(gwi, "ENUM1", 0))
-    CHECK_BB(gwi_enum_add(gwi, "ENUM2", 0))
-    CHECK_BB(gwi_enum_add(gwi, "ENUM3", 0))
-    CHECK_BB(gwi_enum_add(gwi, "ENUM4", 0))
-    CHECK_BB(gwi_enum_add(gwi, "ENUM5", 0))
-    CHECK_BB(gwi_enum_add(gwi, "ENUM6", 0))
-    CHECK_BB(gwi_enum_add(gwi, "ENUM7", 0))
-    CHECK_BB(gwi_enum_add(gwi, "ENUM8", 0))
-    CHECK_BB(gwi_enum_add(gwi, "ENUM9", 0))
+      CHECK_BB(gwi_enum_add(gwi, "ENUM0", 0))
+      CHECK_BB(gwi_enum_add(gwi, "ENUM1", 1))
+      CHECK_BB(gwi_enum_add(gwi, "ENUM2", 2))
+      CHECK_BB(gwi_enum_add(gwi, "ENUM3", 3))
+      CHECK_BB(gwi_enum_add(gwi, "ENUM4", 4))
+      CHECK_BB(gwi_enum_add(gwi, "ENUM5", 5))
+      CHECK_BB(gwi_enum_add(gwi, "ENUM6", 6))
+      CHECK_BB(gwi_enum_add(gwi, "ENUM7", 7))
+      CHECK_BB(gwi_enum_add(gwi, "ENUM8", 8))
+      CHECK_BB(gwi_enum_add(gwi, "ENUM9", 9))
     CHECK_BB(gwi_enum_end(gwi))
 
-    CHECK_BB(gwi_enum_ini(gwi, "test"))
-    CHECK_BB(gwi_enum_add(gwi, "TYPED_ENUM0", 0))
-    CHECK_BB(gwi_enum_add(gwi, "TYPED_ENUM1", 0))
-    CHECK_BB(gwi_enum_add(gwi, "TYPED_ENUM2", 0))
-    CHECK_BB(gwi_enum_add(gwi, "TYPED_ENUM3", 0))
-    CHECK_BB(gwi_enum_add(gwi, "TYPED_ENUM4", 0))
-    CHECK_BB(gwi_enum_add(gwi, "TYPED_ENUM5", 0))
-    CHECK_BB(gwi_enum_add(gwi, "TYPED_ENUM6", 0))
-    CHECK_BB(gwi_enum_add(gwi, "TYPED_ENUM7", 0))
-    CHECK_BB(gwi_enum_add(gwi, "TYPED_ENUM8", 0))
-    CHECK_BB(gwi_enum_add(gwi, "TYPED_ENUM9", 0))
+    CHECK_BB(gwi_enum_ini(gwi, "Enumtest"))
+      CHECK_BB(gwi_enum_add(gwi, "TYPED_ENUM0", 0))
+      CHECK_BB(gwi_enum_add(gwi, "TYPED_ENUM1", 1))
+      CHECK_BB(gwi_enum_add(gwi, "TYPED_ENUM2", 2))
+      CHECK_BB(gwi_enum_add(gwi, "TYPED_ENUM3", 3))
+      CHECK_BB(gwi_enum_add(gwi, "TYPED_ENUM4", 4))
+      CHECK_BB(gwi_enum_add(gwi, "TYPED_ENUM5", 5))
+      CHECK_BB(gwi_enum_add(gwi, "TYPED_ENUM6", 6))
+      CHECK_BB(gwi_enum_add(gwi, "TYPED_ENUM7", 7))
+      CHECK_BB(gwi_enum_add(gwi, "TYPED_ENUM8", 8))
+      CHECK_BB(gwi_enum_add(gwi, "TYPED_ENUM9", 9))
     CHECK_BB(gwi_enum_end(gwi))
-  
   CHECK_BB(gwi_class_end(gwi))
 
   return GW_OK;