]> Nishi Git Mirror - gwion.git/commitdiff
On dev: EffectIgnore+CtorStuff
authorJérémie Astor <fennecdjay@gmail.com>
Wed, 21 Jul 2021 16:55:26 +0000 (18:55 +0200)
committerJérémie Astor <fennecdjay@gmail.com>
Wed, 21 Jul 2021 16:55:26 +0000 (18:55 +0200)
1  2 
include/opcode.h
opcode.txt
src/emit/emit.c
src/lib/engine.c
src/lib/opfunc.c
src/parse/check.c
src/plug.c
src/vm/vm.c

index 3b2c28ed4bbdf2dc5978898b648f1f1bce336cf5,3b2c28ed4bbdf2dc5978898b648f1f1bce336cf5..281fc9cd921d661a72b459f29d8a04dee9b1df59
@@@ -30,6 -30,6 +30,7 @@@ enum 
    eRepeat,
    eRegPushMe,
    eRegPushMaybe,
++  eCtorReturn,
    eFuncReturn,
    eGoto,
    eAllocWord,
  #define  Repeat               (f_instr)eRepeat
  #define  RegPushMe            (f_instr)eRegPushMe
  #define  RegPushMaybe         (f_instr)eRegPushMaybe
++#define  CtorReturn           (f_instr)eCtorReturn
  #define  FuncReturn           (f_instr)eFuncReturn
  #define  Goto                 (f_instr)eGoto
  #define  AllocWord            (f_instr)eAllocWord
@@@ -601,6 -601,6 +603,10 @@@ ANN static inline void dump_opcodes(con
          gw_out("{Y}┃{0}{-}% 4lu{0}: RegPushMaybe", j);
          gw_out("\n");
          break;
++      case eCtorReturn:
++        gw_out("{Y}┃{0}{-}% 4lu{0}: CtorReturn  ", j);
++        gw_out("\n");
++        break;
        case eFuncReturn:
          gw_out("{Y}┃{0}{-}% 4lu{0}: FuncReturn  ", j);
          gw_out("\n");
diff --cc opcode.txt
index 2bd04b7514e6a757d18947d547ac7079d5e5f9ca,2bd04b7514e6a757d18947d547ac7079d5e5f9ca..b173ce4ca908ad03b44a5686c3fd45c2b01f654c
@@@ -27,6 -27,6 +27,7 @@@ RepeatIdx~pc~
  Repeat~pc
  RegPushMe
  RegPushMaybe
++CtorReturn
  FuncReturn
  Goto~pc
  AllocWord~u
diff --cc src/emit/emit.c
index f1ee3c5e83cca8ead2d1003d75f4ea007cfee751,f1ee3c5e83cca8ead2d1003d75f4ea007cfee751..e0a3f600367706fe0eb983a473f2d568c94149f5
@@@ -2560,7 -2560,7 +2560,8 @@@ ANN static VM_Code emit_internal(const 
  ANN static inline VM_Code _emit_func_def_code(const Emitter emit,
                                                const Func    func) {
    if(!strcmp(s_name(func->def->base->xid), "new"))
--    emit_add_instr(emit, RegPushMem);
++    return finalyze(emit, CtorReturn);
++//    emit_add_instr(emit, RegPushMem);
    return !fbflag(func->def->base, fbflag_internal) ? finalyze(emit, FuncReturn)
                                                     : emit_internal(emit, func);
  }
index a984cf3ae3c168514edefbcbe0d1be2c7f5ff8e1,a984cf3ae3c168514edefbcbe0d1be2c7f5ff8e1..3f6d8c2a126d082b6734674a6c1c72711e0822d9
@@@ -78,7 -78,7 +78,7 @@@ static INSTR(PredicateCheck) 
  
  ANN static m_bool import_core_libs(const Gwi gwi) {
    gwidoc(gwi, "one type to rule them all.");
--  const Type t_class = gwi_mk_type(gwi, "@Class", SZ_INT, NULL);
++  const Type t_class = gwi_mk_type(gwi, "Class", SZ_INT, NULL);
    set_tflag(t_class, tflag_infer);
    GWI_BB(gwi_set_global_type(gwi, t_class, et_class))
    GWI_BB(gwi_gack(gwi, t_class, gack_class))
    GWI_BB(import_ref(gwi))
  
    gwidoc(gwi, "Operators class types.");
--  GWI_BB(gwi_oper_ini(gwi, "@Class", "@Class", "int"))
++  GWI_BB(gwi_oper_ini(gwi, "Class", "Class", "int"))
    GWI_BB(gwi_oper_end(gwi, "==", int_eq))
    GWI_BB(gwi_oper_end(gwi, "!=", int_neq))
    GWI_BB(gwi_oper_end(gwi, ">=", instr_class_ge))
    GWI_BB(gwi_oper_end(gwi, "@dot", NULL))
  
    gwidoc(gwi, "allow static access.");
--  GWI_BB(gwi_oper_ini(gwi, "@Class", (m_str)OP_ANY_TYPE, NULL))
++  GWI_BB(gwi_oper_ini(gwi, "Class", (m_str)OP_ANY_TYPE, NULL))
    GWI_BB(gwi_oper_add(gwi, opck_object_dot))
    GWI_BB(gwi_oper_emi(gwi, opem_object_dot))
    GWI_BB(gwi_oper_end(gwi, "@dot", NULL))
  
    gwidoc(gwi, "Allow binary call to constructors.");
--  GWI_BB(gwi_oper_ini(gwi, (m_str)OP_ANY_TYPE, "@Class", NULL))
++  GWI_BB(gwi_oper_ini(gwi, (m_str)OP_ANY_TYPE, "Class", NULL))
    GWI_BB(gwi_oper_add(gwi, opck_class_call))
    GWI_BB(gwi_oper_end(gwi, "=>", NULL))
  
index ac3c17f9560e53d3bfddb6a52a7b879a483ec103,ac3c17f9560e53d3bfddb6a52a7b879a483ec103..0d3cfd7b121ed4fca2f7d5542fd061503246edfb
@@@ -101,8 -101,8 +101,9 @@@ OP_CHECK(opck_new) 
    DECL_ON(const Type, t, = known_type(env, unary->ctor.td));
    if(unary->ctor.exp) {
      const Exp self   = exp_self(unary);
--    const Exp args   = unary->ctor.exp;
--    const Exp base   = new_exp_unary2(env->gwion->mp, unary->op, unary->ctor.td, NULL, self->pos);
++    const Exp args   = cpy_exp(env->gwion->mp, unary->ctor.exp);
++    const Exp base   = new_exp_unary2(env->gwion->mp, unary->op, unary->ctor.td, unary->ctor.exp, self->pos);
++base->type = t;
      const Exp func   = new_exp_dot(env->gwion->mp, base, insert_symbol("new"), self->pos);
      self->d.exp_call.func = func;
      self->d.exp_call.args = args;
@@@ -127,6 -127,6 +128,9 @@@ OP_EMIT(opem_new) 
    const Exp_Unary *unary = (Exp_Unary *)data;
    CHECK_BB(emit_instantiate_object(emit, exp_self(unary)->type,
                                     unary->ctor.td->array, 0));
--  emit_gc(emit, -SZ_INT);
++// we don't need gc for arrays?
++// also when in rewrote exp
++//  if(!(unary->ctor.td->array || unary->ctor.exp))
++//    emit_gc(emit, -SZ_INT);
    return GW_OK;
  }
index 9b95ebd7a544c9f89b6ec3a3fab9f429778d5bdb,9b95ebd7a544c9f89b6ec3a3fab9f429778d5bdb..877a2608c41e8b501ae434c63099e0c0b06947cd
@@@ -1220,6 -1220,6 +1220,9 @@@ ANN static m_bool check_stmt_return(con
    if (!env->func)
      ERR_B(stmt_self(stmt)->pos,
            _("'return' statement found outside function definition"))
++  if (!strcmp(s_name(env->func->def->base->xid), "new"))
++    ERR_B(stmt_self(stmt)->pos,
++          _("'return' statement found inside constructor function"))
    if (env->scope->depth == 1) // so ops no dot set scope->depth ?
      set_fflag(env->func, fflag_return);
    DECL_OB(const Type, ret_type,
@@@ -1834,6 -1834,6 +1837,8 @@@ ANN static inline void check_unhandled(
    for (m_uint j = 0; j < m_vector_size(w); j++) {
      struct ScopeEffect eff;
      m_vector_get(w, j, &eff);
++    if(s_name(eff.sym)[0] == '!')
++      continue;
      gwerr_secondary("Unhandled effect", env->name, eff.pos);
      env->context->error = false;
    }
diff --cc src/plug.c
index 97303a1a13ad56536cf655588943f376bef99956,97303a1a13ad56536cf655588943f376bef99956..9b394e5d63a333a6483a1b8ec4bc24a202d42627
@@@ -115,6 -115,6 +115,9 @@@ ANN void set_module(const struct Gwion
        return;
      }
    }
++  const Plug plug  = new_plug(gwion->mp, name);
++  plug->self = ptr;
++  map_set(map, (m_uint)name, (m_uint)plug);
  }
  
  ANN void plug_run(const struct Gwion_ *gwion, const Map mod) {
diff --cc src/vm/vm.c
index 05b218edfc6cdfcd5b47fc0faa865e30e285a2cd,05b218edfc6cdfcd5b47fc0faa865e30e285a2cd..f1db7ba395f0a7df1b0d547d7d16c56da3848db3
@@@ -412,7 -412,7 +412,7 @@@ vm_run(const VM *vm) { // lgtm [cpp/use
        &&baseaddr, &&regtoreg, &&regtoregother, &&regtoregaddr, &&regtoregderef,
        &&structmember, &&structmemberfloat, &&structmemberother,
        &&structmemberaddr, &&memsetimm, &&memaddimm, &&repeatidx, &&repeat,
--      &&regpushme, &&regpushmaybe, &&funcreturn, &&_goto, &&allocint,
++      &&regpushme, &&regpushmaybe, &&ctorreturn, &&funcreturn, &&_goto, &&allocint,
        &&allocfloat, &&allocother,
        &&intplus, &&intminus, &&intmul, &&intdiv, &&intmod,
        &&intplusimm, &&intminusimm, &&intmulimm, &&intdivimm, &&intmodimm,
        *(m_uint *)reg = gw_rand((uint32_t *)vm->rand) > (UINT32_MAX / 2);
        reg += SZ_INT;
        DISPATCH();
++ctorreturn:
++*(M_Object*)(reg) = *(M_Object*)mem;
++reg += SZ_INT;
      funcreturn : {
        register frame_t frame = *(frame_t *)(mem - sizeof(frame_t));
        bytecode               = (code = frame.code)->bytecode;