]> Nishi Git Mirror - gwion.git/commitdiff
:art: Introduce interp
authorJérémie Astor <astor.jeremie@wanadoo.fr>
Sun, 23 Feb 2020 13:18:31 +0000 (14:18 +0100)
committerJérémie Astor <astor.jeremie@wanadoo.fr>
Sun, 23 Feb 2020 13:18:31 +0000 (14:18 +0100)
ast
include/opcode.h
src/emit/emit.c
src/parse/check.c
src/parse/scan1.c
src/parse/scan2.c
src/vm/vm.c

diff --git a/ast b/ast
index db1106db2e29341dff616e070530d0881a925c8f..15c110793cba16dc12855082ebf14794c5f16ea0 160000 (submodule)
--- a/ast
+++ b/ast
@@ -1 +1 @@
-Subproject commit db1106db2e29341dff616e070530d0881a925c8f
+Subproject commit 15c110793cba16dc12855082ebf14794c5f16ea0
index de85bdebb92d40eef0cb170b137ed93dd4871479..0634386d16c1f0e50ef4bbfcd844c5dd7858c11b 100644 (file)
@@ -169,8 +169,8 @@ enum {
   eGcIni,
   eGcAdd,
   eGcEnd,
-  eGack,
   eGackEnd,
+  eGack,
   eNoOp,
   eDotTmplVal,
   eOP_MAX,
@@ -345,8 +345,8 @@ enum {
 #define  GcIni               (f_instr)eGcIni
 #define  GcAdd               (f_instr)eGcAdd
 #define  GcEnd               (f_instr)eGcEnd
-#define  Gack                (f_instr)eGack
 #define  GackEnd             (f_instr)eGackEnd
+#define  Gack                (f_instr)eGack
 #define  NoOp                (f_instr)eNoOp
 #define  DotTmplVal          (f_instr)eDotTmplVal
 #define  OP_MAX              (f_instr)eOP_MAX
index 708a5b119cb4dbf00f21e963f7a897bf5f593e77..070515d035d2562fa60d1bea5c4cdcf67876081d 100644 (file)
@@ -598,9 +598,19 @@ ANN static m_bool emit_prim_str(const Emitter emit, const m_str *str) {
   return GW_OK;
 }
 
-ANN static m_bool emit_prim_hack(const Emitter emit, const Exp *exp) {
+ANN static m_bool emit_prim_unpack(const Emitter emit NUSED, const Tuple *tuple) {
+  if(prim_exp(tuple)->meta == ae_meta_var)
+    return GW_OK;
+  ERR_B(prim_pos(tuple), _("unused Tuple unpack"))
+}
+
+#define emit_prim_complex emit_prim_vec
+#define emit_prim_polar   emit_prim_vec
+#define emit_prim_nil     (void*)dummy_func
+
+ANN static m_bool emit_interp(const Emitter emit, const Exp exp) {
   regpushi(emit, 0);
-  Exp e = *exp, next = NULL;
+  Exp e = exp, next = NULL;
   do {
     next = e->next;
     e->next = NULL;
@@ -612,21 +622,16 @@ ANN static m_bool emit_prim_hack(const Emitter emit, const Exp *exp) {
     instr->m_val = (m_uint)e->type;
     instr->m_val2 = emit_code_offset(emit);
   } while((e = e->next = next));
-  if(!(emit->env->func && emit->env->func->def->base->xid == insert_symbol("@gack")))
-    emit_add_instr(emit, GackEnd);
   return GW_OK;
 }
 
-ANN static m_bool emit_prim_unpack(const Emitter emit NUSED, const Tuple *tuple) {
-  if(prim_exp(tuple)->meta == ae_meta_var)
-    return GW_OK;
-  ERR_B(prim_pos(tuple), _("unused Tuple unpack"))
+ANN static m_bool emit_prim_hack(const Emitter emit, const Exp *exp) {
+  CHECK_BB(emit_interp(emit, *exp))
+  if(!(emit->env->func && emit->env->func->def->base->xid == insert_symbol("@gack")))
+    emit_add_instr(emit, GackEnd);
+  return GW_OK;
 }
 
-#define emit_prim_complex emit_prim_vec
-#define emit_prim_polar   emit_prim_vec
-#define emit_prim_nil     (void*)dummy_func
-
 DECL_PRIM_FUNC(emit, m_bool , Emitter);
 ANN static m_bool emit_prim(const Emitter emit, Exp_Primary *const prim) {
   return emit_prim_func[prim->prim_type](emit, &prim->d);
@@ -1239,6 +1244,13 @@ ANN static m_bool emit_exp_typeof(const Emitter emit, const Exp_Typeof *exp) {
   return GW_OK;
 }
 
+ANN static m_bool emit_exp_interp(const Emitter emit, const Exp_Interp *exp) {
+  CHECK_BB(emit_interp(emit, exp->exp))
+  const Instr instr = emit_add_instr(emit, GackEnd);
+  instr->m_val = 1;
+  return GW_OK;
+}
+
 DECL_EXP_FUNC(emit, m_bool, Emitter)
 
 ANN2(1) static m_bool emit_exp(const Emitter emit, Exp exp, const m_bool ref) {
index ff2a78124be8fb02ddaa8c86438440db3eea778a..57e093bd7bd79918ee41ac4010d63644065170f3 100644 (file)
@@ -939,6 +939,11 @@ ANN static Type check_exp_typeof(const Env env, const Exp_Typeof *exp) {
   return v->type;
 }
 
+ANN static Type check_exp_interp(const Env env, const Exp_Interp* exp) {
+  CHECK_OO(check_exp(env, exp->exp))
+  return env->gwion->type[et_string];
+}
+
 DECL_EXP_FUNC(check, Type, Env)
 
 ANN Type check_exp(const Env env, const Exp exp) {
index 12acfb42006fbf902f63748f31ad8d980baddbe6..d1db4f31be97f32ad99670d60e4c534d68021d94 100644 (file)
@@ -197,6 +197,10 @@ ANN static inline m_bool scan1_exp_typeof(const restrict Env env, const Exp_Type
   return scan1_exp(env, exp->exp);
 }
 
+ANN static inline m_bool scan1_exp_interp(const restrict Env env, const Exp_Interp *exp) {
+  return scan1_exp(env, exp->exp);
+}
+
 #define scan1_exp_lambda dummy_func
 HANDLE_EXP_FUNC(scan1, m_bool, Env)
 
index fbb760282e5acf841e0f438af6c69831c6f153fd..ba453323fcb8b62a39596c0e2ed98158cb039134 100644 (file)
@@ -189,6 +189,10 @@ ANN static inline m_bool scan2_exp_typeof(const restrict Env env, const Exp_Type
   return scan2_exp(env, exp->exp);
 }
 
+ANN static inline m_bool scan2_exp_interp(const restrict Env env, const Exp_Interp *exp) {
+  return scan2_exp(env, exp->exp);
+}
+
 ANN static inline m_bool _scan2_stmt_match_case(const restrict Env env, const Stmt_Match stmt) {
   CHECK_BB(scan2_exp(env, stmt->cond))
   if(stmt->when)
index 7c8becf81b1b41fff6058e943169ed8a81ccf945..41169e68b6a991d93845f49826985496b8868c7f 100644 (file)
@@ -340,7 +340,7 @@ ANN void vm_run(const VM* vm) { // lgtm [cpp/use-of-goto]
     &&staticint, &&staticfloat, &&staticother,
     &&dotfunc, &&dotstaticfunc, &&pushstaticcode,
     &&gcini, &&gcadd, &&gcend,
-    &&gack, &&gackend, &&noop, &&regpushimm, &&other, &&eoc
+    &&gackend, &&gack, &&noop, &&regpushimm, &&other, &&eoc
   };
   const Shreduler s = vm->shreduler;
   register VM_Shred shred;
@@ -849,16 +849,20 @@ gcend:
   while((a.obj = (M_Object)vector_pop(&shred->gc)))
     _release(a.obj, shred);
   DISPATCH()
-gack:
-  VM_OUT
-  gack(shred, (Instr)VAL);
-  goto in;
 gackend:
 {
   m_str str = *(m_str*)(reg - SZ_INT);
-  gw_out("%s\n", str);
+  if(!VAL)
+    gw_out("%s\n", str);
+  else
+    *(M_Object*)(reg - SZ_INT)= new_string(vm->gwion->mp, shred, str);
   mp_free2(vm->gwion->mp, strlen(str), str);
+  DISPATCH();
 }
+gack:
+  VM_OUT
+  gack(shred, (Instr)VAL);
+  goto in;
 noop:
   DISPATCH();
 other: