From: fennecdjay Date: Sat, 19 Jan 2019 19:45:09 +0000 (+0100) Subject: :bug: Fix builtin enums X-Git-Tag: nightly~2766 X-Git-Url: http://10.11.0.4:5575/?a=commitdiff_plain;h=e79b45f416e04ac73cf90c07ce57ddfb9c22a768;p=gwion.git :bug: Fix builtin enums --- diff --git a/src/lib/import.c b/src/lib/import.c index e127cf87..392a4675 100644 --- a/src/lib/import.c +++ b/src/lib/import.c @@ -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; } diff --git a/src/oo/nspc.c b/src/oo/nspc.c index 7be5c8f8..0b3c730a 100644 --- a/src/oo/nspc.c +++ b/src/oo/nspc.c @@ -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); diff --git a/src/oo/value.c b/src/oo/value.c index 4926262a..91afaa90 100644 --- a/src/oo/value.c +++ b/src/oo/value.c @@ -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) diff --git a/tests/test_plugins/enum.c b/tests/test_plugins/enum.c index 34a805ee..032d7855 100644 --- a/tests/test_plugins/enum.c +++ b/tests/test_plugins/enum.c @@ -10,61 +10,59 @@ 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;