]> Nishi Git Mirror - gwion.git/commitdiff
:art: Introduce super and change specialid emit signature
authorfennecdjay <fennecdjay@gmail.com>
Wed, 7 Dec 2022 13:19:51 +0000 (14:19 +0100)
committerfennecdjay <fennecdjay@gmail.com>
Wed, 7 Dec 2022 13:19:51 +0000 (14:19 +0100)
include/specialid.h
src/emit/emit.c
src/lib/object.c
tests/plug/specialid_emit.c

index c707944ed054f1d5cc945860d4cf96a2f8ecd81a..b1c4e0e307f57cc81af3ca9eb0ec1e39e9c88753 100644 (file)
@@ -2,7 +2,7 @@
 #define __SPECIALID
 
 typedef Type (*idck)(const Env, const Exp_Primary *);
-typedef struct Instr_ *(*idem)(const Emitter, const Exp_Primary *);
+typedef m_bool (*idem)(const Emitter, const Exp_Primary *);
 
 struct SpecialId_ {
   Type    type;
@@ -15,7 +15,7 @@ struct SpecialId_ {
 #define ID_CHECK(a)                                                            \
   ANN Type a(const Env env NUSED, const Exp_Primary *prim NUSED)
 #define ID_EMIT(a)                                                             \
-  ANN Instr a(const Emitter emit NUSED, const Exp_Primary *prim NUSED)
+  ANN m_bool a(const Emitter emit NUSED, const Exp_Primary *prim NUSED)
 
 ANN static inline Type specialid_type(const Env env, struct SpecialId_ *spid,
                                       const Exp_Primary *prim) {
index e6d5069301a88366b8a31404f6e322de53ff0e85..8afbecaba5002f2937222618bb7f70b7992d5a7d 100644 (file)
@@ -731,18 +731,18 @@ ANN static m_bool emit_exp_slice(const Emitter emit, const Exp_Slice *range) {
   return GW_OK;
 }
 
-ANN static inline Instr specialid_instr(const Emitter      emit,
+ANN static m_bool specialid_instr(const Emitter      emit,
                                         struct SpecialId_ *spid,
                                         const Exp_Primary *prim) {
-  return spid->exec ? emit_add_instr(emit, spid->exec) : spid->em(emit, prim);
+  if(spid->exec) emit_add_instr(emit, spid->exec);
+  else if (spid->em) spid->em(emit, prim);
+  return GW_OK;
 }
 
-ANN static m_bool    emit_prim_id(const Emitter emit, const Symbol *data) {
-  const Exp_Primary *prim = prim_self(data);
+ANN static m_bool emit_prim_id(const Emitter emit, const Symbol *data) {
   struct SpecialId_ *spid = specialid_get(emit->gwion, *data);
   if (unlikely(spid))
-    return specialid_instr(emit, spid, prim_self(data)) ? GW_OK : GW_ERROR;
-  if(vflag(prim->value, vflag_fglobal)) exp_self(prim)->acquire = 1;
+    return specialid_instr(emit, spid, prim_self(data));
   return emit_symbol(emit, prim_self(data));
 }
 
index 490089fe975541dcd7d6b3c95d6d0fa3a58e018a..1193ed0662592822ec6adfc6daae98618da90583 100644 (file)
@@ -112,11 +112,30 @@ static ID_EMIT(opem_this) {
       tflag(exp_self(prim)->type, tflag_struct)) {
     const Instr instr = emit_add_instr(emit, RegPushMemDeref);
     instr->m_val2     = emit->env->class_def->size;
-    return (Instr)GW_OK;
+    return GW_OK;
   }
   const Instr instr = emit_add_instr(emit, RegPushMem);
   instr->m_val      = emit->status.this_offset;
-  return instr;
+  return GW_OK;
+}
+
+static ID_CHECK(opck_super) {
+  const Exp self = exp_self(prim);
+  if(!env->func)
+    ERR_O(self->pos, "can't use 'super' outside of constructor");
+// move in emit?
+//  if(!self->is_call)
+//    ERR_O(self->pos, "'super' can only be used as a call");
+  const Type parent = env->class_def->info->parent;
+  DECL_OO(const Value, v, = find_value(parent, insert_symbol("new")));
+  SET_FLAG(env->func, const);
+  return v->type;
+}
+
+static ID_EMIT(opem_super) {
+  emit_regpushmem(emit, 0, SZ_INT, false);
+  emit_pushimm(emit, (m_uint)exp_self(prim)->type);
+  return GW_OK;
 }
 
 GWION_IMPORT(object) {
@@ -124,7 +143,9 @@ GWION_IMPORT(object) {
   gwi_set_global_type(gwi, t_object, et_object);
   set_tflag(t_object, tflag_compound);
   t_object->nspc = new_nspc(gwi->gwion->mp, "Object");
-  struct SpecialId_ spid = {.ck = opck_this, .em = opem_this, .is_const = 1};
-  gwi_specialid(gwi, "this", &spid);
+  struct SpecialId_ spid_this = {.ck = opck_this, .em = opem_this, .is_const = 1};
+  gwi_specialid(gwi, "this", &spid_this);
+  struct SpecialId_ spid_super = {.ck = opck_super, .em = opem_super, .is_const = 1};
+  gwi_specialid(gwi, "super", &spid_super);
   return GW_OK;
 }
index 7a5ffef140d4dc6690ef45ea4ee44d6a067890ff..4ed3043095705ee994e9feaeeef3e1fff93108d3 100644 (file)
@@ -14,7 +14,7 @@
 static ID_EMIT(spidem) {
   const Instr instr = emit_add_instr(emit, RegPushImm);
   instr->m_val      = 1234;
-  return instr;
+  return GW_OK;
 }
 
 GWION_IMPORT(spid_test) {