]> Nishi Git Mirror - gwion.git/commitdiff
:art: Use vmcode_callback
authorJérémie Astor <fennecdjay@gmail.com>
Thu, 11 Feb 2021 18:43:16 +0000 (19:43 +0100)
committerJérémie Astor <fennecdjay@gmail.com>
Thu, 11 Feb 2021 18:43:16 +0000 (19:43 +0100)
include/vm.h
src/vm/vm_code.c

index 9da8493ca51e1d51f4963a0fe065cd0c9f9ea016..502a1c20beddb936fb187d407afe10a48586f4b1 100644 (file)
@@ -73,6 +73,7 @@ struct VM_Shred_ {
 };
 REF_FUNC(VM_Code, vmcode)
 ANN2(1,5) ANEW VM_Code new_vmcode(MemPool p, const Vector instr, const m_uint stack_depth, const int builtin, const m_str name);
+ANN ANEW VM_Code vmcode_callback(MemPool p, const VM_Code code);
 
 ANN VM_Shred shreduler_get(const Shreduler s) __attribute__((hot));
 ANN void shreduler_remove(const Shreduler s, const VM_Shred out, const m_bool erase)__attribute__((hot));
index e30fbe00f12db784becd31ac615d5a0e05152622..11ea745b12fac2d890fe5e6d330a49e23133b0bd 100644 (file)
@@ -151,3 +151,16 @@ VM_Code new_vmcode(MemPool p, const Vector instr, const m_uint stack_depth,
   code->ref = 1;
   return code;
 }
+
+// TODO: handle native code
+// TODO: do not re-create if code exists
+VM_Code vmcode_callback(MemPool mp, VM_Code base) {
+  char name[strlen(base->name) + 11];
+  sprintf(name, "%s(callback)", base->name);
+  const Instr instr = (Instr)vector_back(base->instr);
+  instr->opcode = eEOC;
+  VM_Code code = new_vmcode(mp, base->instr, base->stack_depth, base->builtin, name);
+  code->callback = 1;
+  instr->opcode = eFuncReturn;
+  return code;
+}