woop! it works... 64bit cleanliness left.
authorCarsten Haitzler <raster@rasterman.com>
Fri, 26 Mar 2004 04:12:36 +0000 (04:12 +0000)
committerCarsten Haitzler <raster@rasterman.com>
Fri, 26 Mar 2004 04:12:36 +0000 (04:12 +0000)
SVN revision: 9483

legacy/embryo/examples/Makefile.am
legacy/embryo/examples/recurse.inc [new file with mode: 0644]
legacy/embryo/examples/recurse.sma [new file with mode: 0644]
legacy/embryo/src/bin/embryo_main.c
legacy/embryo/src/lib/Embryo.h
legacy/embryo/src/lib/embryo_amx.c

index 35bab0e..b273ace 100644 (file)
@@ -3,7 +3,9 @@ files_DATA = \
 test.inc \
 test.sma \
 example.inc \
-example.sma
+example.sma \
+recurse.inc \
+recurse.sma
 
 EXTRA_DIST = $(files_DATA)
 
diff --git a/legacy/embryo/examples/recurse.inc b/legacy/embryo/examples/recurse.inc
new file mode 100644 (file)
index 0000000..197b900
--- /dev/null
@@ -0,0 +1,7 @@
+#if defined EXAMPLE_INC
+#endinput
+#endif
+#define EXAMPLE_INC
+
+native printf(format[], ...);
+native native_rec(arg1, str[], arg2);
diff --git a/legacy/embryo/examples/recurse.sma b/legacy/embryo/examples/recurse.sma
new file mode 100644 (file)
index 0000000..4b4be56
--- /dev/null
@@ -0,0 +1,25 @@
+#include "recurse.inc"
+
+/* To compile: 
+ * embryo_cc ./recurse.sma -orecurse.amx
+ * 
+ * To test run:
+ * embryo ./recurse.amx
+ */
+
+main()
+{
+   new ret = 0;
+   
+   ret = rec1(1, "Recurse Test", 123);
+   return ret;
+}
+
+public rec1(arg1, str[], arg2)
+{
+   new ret = 0;
+   
+   printf("rec1(arg1=%i, str='%s', arg2=%i);\n", arg1, str, arg2);
+   ret = native_rec(arg1, str, arg2 * 2);
+   return ret;
+}
index ba85a96..88370ba 100644 (file)
@@ -127,6 +127,42 @@ exported_printf(Embryo_Program *ep, Embryo_Cell *params)
    return EMBRYO_ERROR_NONE;
 }
 
+static Embryo_Cell
+exported_rec(Embryo_Program *ep, Embryo_Cell *params)
+{
+   Embryo_Cell *cptr;
+   Embryo_Function fn;
+   Embryo_Cell ret, arg1, arg2;
+   
+   // params[0] = number of bytes of params passed 
+   if (params[0] != 3 * sizeof(Embryo_Cell)) return -1;
+   arg1 = params[1];
+   arg2 = params[3];
+   arg1++;
+
+   if (arg1 > 7)
+     {
+       printf("arg1 == %i\n", arg1);
+       return arg1;
+     }
+   
+   // call the rec1 again
+   fn = embryo_program_function_find(ep, "rec1");
+   if (fn != EMBRYO_FUNCTION_NONE)
+     {
+       char buf[128];
+       
+       printf("... recurse!\n");
+       snprintf(buf, sizeof(buf), "SMELLY %i", arg1);
+       embryo_parameter_cell_push(ep, arg1);
+       embryo_parameter_string_push(ep, buf);
+       embryo_parameter_cell_push(ep, arg2);
+       while (embryo_program_run(ep, fn) == EMBRYO_PROGRAM_SLEEP);
+       ret = embryo_program_return_value_get(ep);
+     }
+   return ret + 1;
+}
+
 /* another example native call */
 /*
 static Embryo_Cell
@@ -209,6 +245,7 @@ main(int argc,char *argv[])
        exit(-1);
      }
    embryo_program_native_call_add(ep, "printf", exported_printf);
+   embryo_program_native_call_add(ep, "native_rec", exported_rec);
    embryo_program_vm_push(ep);
 
    if (args > 0)
index 9027898..a3b0847 100644 (file)
@@ -1,10 +1,5 @@
 #ifndef _EMBRYO_H
 #define _EMBRYO_H
-/*
- * FIXME:
- * handle the case where:
- * [C] -> [vm] -> [native call] -> [same or other func in same vm]
- */
 
 #ifdef  __cplusplus
 extern "C" {
index db9f4a2..80826d7 100644 (file)
@@ -626,7 +626,7 @@ embryo_program_run(Embryo_Program *ep, Embryo_Function fn)
    Embryo_Header    *hdr;
    Embryo_Func_Stub *func;
    unsigned char    *code, *data;
-   Embryo_Cell      pri, alt, stk, frm, hea;
+   Embryo_Cell      pri, alt, stk, frm, hea, hea_start;
    Embryo_Cell      reset_stk, reset_hea, *cip;
    Embryo_UCell     codesize;
    int              i;
@@ -635,10 +635,8 @@ embryo_program_run(Embryo_Program *ep, Embryo_Function fn)
    int              num;
 
    if (!ep) return EMBRYO_PROGRAM_FAIL;
-   if (ep->run_count > 0) return EMBRYO_PROGRAM_BUSY;
    if (!(ep->flags & EMBRYO_FLAG_RELOC))
      {
-   
        ep->error = EMBRYO_ERROR_INIT;
        return EMBRYO_PROGRAM_FAIL;
      }
@@ -647,13 +645,19 @@ embryo_program_run(Embryo_Program *ep, Embryo_Function fn)
        ep->error = EMBRYO_ERROR_INIT;
        return EMBRYO_PROGRAM_FAIL;
      }
+   if (ep->run_count > 0)
+     {
+       /* return EMBRYO_PROGRAM_BUSY; */
+       /* FIXME: test C->vm->C->vm recursion more fully */
+       /* it seems to work... just fine!!! - strange! */
+     }
    
    /* set up the registers */
    hdr = (Embryo_Header *)ep->base;
    codesize = (Embryo_UCell)(hdr->dat - hdr->cod);
    code = ep->base + (int)hdr->cod;
    data = ep->base + (int)hdr->dat;
-   hea = ep->hea;
+   hea_start = hea = ep->hea;
    stk = ep->stk;
    reset_stk = stk;
    reset_hea = hea;
@@ -773,6 +777,7 @@ embryo_program_run(Embryo_Program *ep, Embryo_Function fn)
    /* check stack/heap before starting to run */
    CHKMARGIN();
 
+   /* track recursion depth */
    ep->run_count++;
    
    /* start running */
@@ -1500,6 +1505,10 @@ embryo_program_run(Embryo_Program *ep, Embryo_Function fn)
          }
      }
    ep->run_count--;
+   
+   //
+   ep->hea = hea_start;
+   
    return EMBRYO_PROGRAM_OK;
 }