]> Nishi Git Mirror - gwion.git/commitdiff
:art: update _flow
authorfennecdjay <fennecdjay@gmail.com>
Sat, 3 Sep 2022 10:30:34 +0000 (12:30 +0200)
committerfennecdjay <fennecdjay@gmail.com>
Sat, 3 Sep 2022 10:30:34 +0000 (12:30 +0200)
include/emit.h
src/emit/emit.c
src/lib/object_op.c

index 819506f8e278d598788257a30b580346f37f12ea..46c3dfbfc75cbe10aa9ff1ca76c799e89e56a96f 100644 (file)
@@ -95,11 +95,12 @@ ANN static inline Instr emit_compound_addref(const Emitter emit, const Type t,
                                  : emit_struct_addref(emit, t, size, emit_var);
 }
 
-ANN static inline bool is_static_call(const Exp e) {
+ANN static inline bool is_static_call(const Emitter emit, const Exp e) {
   if (e->exp_type != ae_exp_dot) return true;
   const Exp_Dot *member = &e->d.exp_dot;
   return GET_FLAG(e->type, final) ||
          GET_FLAG(member->base->type, final) ||
+         is_class(emit->gwion, member->base->type) ||
 //         GET_FLAG(e->type->info->func, static) ||
          member->base->exp_type == ae_exp_cast;
 }
index 774e479a96afb1e69accf07047a9976dd1b239c5..be54af1700c51b742f6b385b2821dac07f71afe7 100644 (file)
@@ -1317,7 +1317,7 @@ ANN static m_bool _emit_exp_call(const Emitter emit, const Exp_Call *exp_call) {
     CHECK_BB(emit_func_args(emit, exp_call));
   if (is_func(emit->gwion, t)) // is_callable needs type
     CHECK_BB(emit_exp_call1(emit, t->info->func,
-                            is_static_call(exp_call->func)));
+                            is_static_call(emit, exp_call->func)));
   else {
     struct Op_Import opi = {.op   = insert_symbol("@ctor"),
                             .rhs  = t,
@@ -1487,8 +1487,7 @@ ANN static void tmpl_prelude(const Emitter emit, const Func f) {
 
 ANN static Instr get_prelude(const Emitter emit, const Func f,
                              const bool is_static) {
-  if (f != emit->env->func || (!is_static && strcmp(s_name(f->def->base->xid), "new")) /* ||
-//      strstr(emit->code->name, "ork~")*/) {
+  if (f != emit->env->func || (!is_static && strcmp(s_name(f->def->base->xid), "new"))) {
     const Instr instr = emit_add_instr(emit, SetCode);
     instr->udata.one  = 1;
     return instr;
@@ -1816,19 +1815,18 @@ ANN static m_bool emit_implicit_cast(const Emitter       emit,
   return op_emit(emit, &opi);
 }
 
-ANN2(1,2) static Instr _flow(const Emitter emit, const Exp e, Instr *const instr, const bool b) {
-//  CHECK_BO(emit_exp_pop_next(emit, e));
+ANN2(1,2) static Instr _flow(const Emitter emit, const Exp e, Instr *const instr, /*const */bool b) {
   CHECK_BO(emit_exp(emit, e));
   {
     const Instr ex = (Instr)vector_back(&emit->code->instr);
-    if(ex->execute == fast_except) {
+    if(ex->opcode == eOP_MAX && ex->execute == fast_except) {
       vector_rem(&emit->code->instr, vector_size(&emit->code->instr) - 1);
       free_instr(emit->gwion, ex);
     }
   }
+
   if(instr)
     *instr = emit_add_instr(emit, NoOp);
-//  emit_exp_addref1(emit, e, -exp_size(e)); // ????
   struct Op_Import opi = {
       .op   = insert_symbol(b ? "@conditional" : "@unconditional"),
       .rhs  = e->type,
index 542abd6f0dfe8ee24206b65bf0eb90c3e2169b08..3f61a2dbcf0fe3b4189487c8bb49374de01cbd15 100644 (file)
@@ -147,7 +147,7 @@ ANN static void emit_member_func(const Emitter emit, const Exp_Dot *member) {
       instr->m_val = (m_uint)f;
       return;
     }
-  } else if (is_static_call(exp_self(member))) {
+  } else if (is_static_call(emit, exp_self(member))) {
     if (member->is_call && f == emit->env->func) return;
     const Instr func_i = emit_add_instr(emit, f->code ? RegPushImm : SetFunc);
     func_i->m_val      = (m_uint)f->code ?: (m_uint)f;