diff options
| author | mimaki <[email protected]> | 2012-04-20 09:39:03 +0900 |
|---|---|---|
| committer | mimaki <[email protected]> | 2012-04-20 09:39:03 +0900 |
| commit | e0d6430f63c4cbe0c71ce82ee23284671389a818 (patch) | |
| tree | 41abad7f12eced98d9ac14d141cea62464c3332f /src/minimain.c | |
| parent | 54ad561098ed353ada70205c39b2c42a2a2eb9e5 (diff) | |
| download | mruby-e0d6430f63c4cbe0c71ce82ee23284671389a818.tar.gz mruby-e0d6430f63c4cbe0c71ce82ee23284671389a818.zip | |
add mruby sources
Diffstat (limited to 'src/minimain.c')
| -rw-r--r-- | src/minimain.c | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/src/minimain.c b/src/minimain.c new file mode 100644 index 000000000..b1b70c2af --- /dev/null +++ b/src/minimain.c @@ -0,0 +1,117 @@ +#include "mruby.h" +#include "mruby/proc.h" + +#if 0 +#include "opcode.h" + +mrb_code fib_iseq[256]; + +int fib_syms[4]; + +mrb_irep fib_irep = { + 1, + MRB_IREP_NOFREE, + 2, + 5, + fib_iseq, + NULL, + fib_syms, + + 256, 0, 4, +}; + +mrb_code main_iseq[256]; + +int main_syms[2]; + +mrb_irep main_irep = { + 0, + MRB_IREP_NOFREE, + 1, + 3, + main_iseq, + NULL, + main_syms, + + 256, 0, 2, +}; + +int +main(int argc, char **argv) +{ + mrb_state *mrb = mrb_open(); + int sirep = mrb->irep_len; + int n; + + main_syms[0] = mrb_intern(mrb, "fib"); + main_syms[1] = mrb_intern(mrb, "p"); + n = 0; + + main_iseq[n++] = MKOP_AB(OP_LAMBDA, 1, 1); /* r1 := lambda(1) */ + main_iseq[n++] = MKOP_AB(OP_METHOD, 1, 0); /* defmethod(r1) */ + main_iseq[n++] = MKOP_AB(OP_MOVE, 1, 0); /* r1 := r0 */ + main_iseq[n++] = MKOP_AB(OP_MOVE, 2, 0); /* r2 := r0 */ + main_iseq[n++] = MKOP_AsBx(OP_LOADI, 3, 35); /* r3 := 20 */ + main_iseq[n++] = MKOP_ABC(OP_SEND, 2, 0, 1); /* r2 .fib r3 */ + main_iseq[n++] = MKOP_ABC(OP_SEND, 1, 1, 1); /* r1 .p r2 */ + main_iseq[n++] = MKOP_ABC(OP_STOP, 1, 1, 2); /* stop */ + main_irep.ilen = n; + main_irep.idx = sirep; + + fib_syms[0] = mrb_intern(mrb, "<"); + fib_syms[1] = mrb_intern(mrb, "-"); + fib_syms[2] = mrb_intern(mrb, "+"); + fib_syms[3] = mrb_intern(mrb, "fib"); + n = 0; + + fib_iseq[n++] = MKOP_AB(OP_MOVE, 2, 1); /* r2 := r1 */ + fib_iseq[n++] = MKOP_AsBx(OP_LOADI, 3, 3); /* r3 := 2 */ + fib_iseq[n++] = MKOP_ABC(OP_LT, 2, 0, 2); /* r2 .< r3 */ + fib_iseq[n++] = MKOP_AsBx(OP_JMPNOT, 2, 2); /* ifnot r2 :else */ + fib_iseq[n++] = MKOP_AsBx(OP_LOADI, 2, 1); /* r6 := 1 */ + fib_iseq[n++] = MKOP_A(OP_RETURN, 2); /* return r2 */ + fib_iseq[n++] = MKOP_AB(OP_MOVE, 3, 0); /* r3 := r0 :else */ + fib_iseq[n++] = MKOP_AB(OP_MOVE, 4, 1); /* r4 := r1 */ + fib_iseq[n++] = MKOP_ABC(OP_SUBI, 4, 1, 2); /* r4 .- 2 */ + fib_iseq[n++] = MKOP_ABC(OP_SEND, 3, 3, 1); /* r3 .fib r4 */ + fib_iseq[n++] = MKOP_AB(OP_MOVE, 4, 0); /* r4 := r0 */ + fib_iseq[n++] = MKOP_AB(OP_MOVE, 5, 1); /* r5 := r1 */ + fib_iseq[n++] = MKOP_ABC(OP_SUBI, 5, 1, 1); /* r5 .- 1 */ + fib_iseq[n++] = MKOP_ABC(OP_SEND, 4, 3, 1); /* r4 .fib :r5 */ + fib_iseq[n++] = MKOP_ABC(OP_ADD, 3, 2, 1); /* r3 .+ r4 */ + fib_iseq[n++] = MKOP_A(OP_RETURN, 3); /* return r3 */ + fib_irep.ilen = n; + fib_irep.idx = sirep+1; + + mrb_add_irep(mrb, sirep+2); + mrb->irep[sirep ] = &main_irep; + mrb->irep[sirep+1] = &fib_irep; + + mrb_run(mrb, mrb_proc_new(mrb, &main_irep), mrb_nil_value()); +} + +#else +#include "compile.h" + +int +main() +{ + mrb_state *mrb = mrb_open(); + int n; + + n = mrb_compile_string(mrb, "\ +def fib(n)\n\ + if n<2\n\ + n\n\ + else\n\ + fib(n-2)+fib(n-1)\n\ + end\n\ +end\n\ +p(fib(30), \"\\n\")\n\ +"); + mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_nil_value()); + + return 0; +} + +#endif |
