]> Nishi Git Mirror - gwion.git/commitdiff
:art: Imporve emit_except
authorJérémie Astor <astor.jeremie@wanadoo.fr>
Fri, 29 Nov 2019 10:35:50 +0000 (11:35 +0100)
committerJérémie Astor <astor.jeremie@wanadoo.fr>
Fri, 29 Nov 2019 10:35:50 +0000 (11:35 +0100)
include/opcode.h
opcode.txt
src/emit/emit.c
src/vm/vm.c

index d8d57041127ac3174d4147222c4198bd1507dcd4..730c3f38a78618c913688ae4d19fc729fe54793d 100644 (file)
@@ -153,6 +153,7 @@ enum {
   eObjectAssign,
   eAssign,
   eObjectRelease,
+  eSetObj,
   eGWOP_EXCEPT,
   eAllocMember4,
   eDotMember,
@@ -328,6 +329,7 @@ enum {
 #define  ObjectAssign        (f_instr)eObjectAssign
 #define  Assign              (f_instr)eAssign
 #define  ObjectRelease       (f_instr)eObjectRelease
+#define  SetObj              (f_instr)eSetObj
 #define  GWOP_EXCEPT         (f_instr)eGWOP_EXCEPT
 #define  AllocMember4        (f_instr)eAllocMember4
 #define  DotMember           (f_instr)eDotMember
index d3dea2a6d802d389663edb8b7fa6cec63132e4d7..ac8fb17434a8707e907e55528305821f1b3b438f 100644 (file)
@@ -150,6 +150,7 @@ RegAddRef
 ObjectAssign
 Assign
 ObjectRelease
+SetObj
 GWOP_EXCEPT
 AllocMember4
 DotMember
index 7767359ca99eb7662f3051e9aa1cd93def382cab..4894ed2d55aae99ef7ec5094bbb94fa46b2cc8a5 100644 (file)
@@ -477,6 +477,8 @@ ANN static inline m_bool _emit_indexes(const Emitter emit, struct ArrayAccessInf
 ANN void emit_except(const Emitter emit, const Type t) {
   if(!GET_FLAG(t, nonnull))
     emit_add_instr(emit, GWOP_EXCEPT);
+  else
+    emit_add_instr(emit, SetObj);
 }
 
 ANN static inline m_bool tuple_index(const Emitter emit, struct ArrayAccessInfo *const info) {
index 0c2fc5b88be6bce9b1079275dc659de16d057a4e..fa3dd6ba92b0c902fb0c0d4cde90b0564a93dd6e 100644 (file)
@@ -300,7 +300,7 @@ ANN void vm_run(const VM* vm) { // lgtm [cpp/use-of-goto]
     &&brancheqint, &&branchneint, &&brancheqfloat, &&branchnefloat,
     &&arrayappend, &&autoloop, &&autoloopptr, &&autoloopcount, &&arraytop, &&arrayaccess, &&arrayget, &&arrayaddr, &&arrayvalid,
     &&newobj, &&addref, &&objassign, &&assign, &&remref,
-    &&except, &&allocmemberaddr, &&dotmember, &&dotfloat, &&dotother, &&dotaddr,
+    &&setobj, &&except, &&allocmemberaddr, &&dotmember, &&dotfloat, &&dotother, &&dotaddr,
     &&staticint, &&staticfloat, &&staticother,
     &&dotfunc, &&dotstaticfunc, &&pushstaticcode,
     &&gcini, &&gcadd, &&gcend,
@@ -733,6 +733,9 @@ assign:
 remref:
   release(*(M_Object*)(mem + VAL), shred);
   DISPATCH()
+setobj:
+  a.obj  = *(M_Object*)(reg-SZ_INT-VAL);
+  DISPATCH();
 except:
 /* TODO: Refactor except instruction             *
  * so that                                       *