diff options
author | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-09-23 00:20:28 +0000 |
---|---|---|
committer | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2008-09-23 00:20:28 +0000 |
commit | 8cd252ac6f3fd2d2eb3524880bf45767490bed70 (patch) | |
tree | f7ab9657e81a7ea8b79696c2f0f1e0f9ca184d13 /vm_exec.c | |
parent | f398d750ea3450762c0ba10c5dea4522d4676360 (diff) |
* common.mk: clean up
- remove blockinlining.$(OBJEXT) to built
- make ENCODING_H_INCLDUES variable (include/ruby/encoding.h)
- make VM_CORE_H_INCLUDES variable (vm_core.h)
- simplify rules.
- make depends rule to output depend status using gcc -MM.
* include/ruby/mvm.h, include/ruby/vm.h: rename mvm.h to vm.h.
* include/ruby.h: ditto.
* load.c: add inclusion explicitly.
* enumerator.c, object.c, parse.y, thread.c, vm_dump.c:
remove useless inclusion.
* eval_intern.h: cleanup inclusion.
* vm_core.h: rb_thread_t should be defined in this file.
* vm_evalbody.c, vm_exec.c: rename vm_evalbody.c to vm_exec.c.
* vm.h, vm_exec.h: rename vm.h to vm_exec.h.
* insnhelper.h, vm_insnhelper.h: rename insnhelper.h to vm_insnhelper.h.
* vm.c, vm_insnhelper.c, vm_insnhelper.h:
- rename vm_eval() to vm_exec_core().
- rename vm_eval_body() to vm_exec().
- cleanup include order.
* vm_method.c: fix comment.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@19466 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'vm_exec.c')
-rw-r--r-- | vm_exec.c | 156 |
1 files changed, 156 insertions, 0 deletions
diff --git a/vm_exec.c b/vm_exec.c new file mode 100644 index 0000000000..392fde0cf7 --- /dev/null +++ b/vm_exec.c @@ -0,0 +1,156 @@ +/* -*-c-*- */ +/********************************************************************** + + vm_evalbody.c - + + $Author$ + + Copyright (C) 2004-2007 Koichi Sasada + +**********************************************************************/ + +#include <math.h> + +#if VMDEBUG > 0 +#define DECL_SC_REG(type, r, reg) register type reg_##r + +#elif __GNUC__ && __x86_64__ +#define DECL_SC_REG(type, r, reg) register type reg_##r __asm__("r" reg) + +#elif __GNUC__ && __i386__ +#define DECL_SC_REG(type, r, reg) register type reg_##r __asm__("e" reg) + +#else +#define DECL_SC_REG(type, r, reg) register type reg_##r +#endif +/* #define DECL_SC_REG(r, reg) VALUE reg_##r */ + +#if OPT_STACK_CACHING +static VALUE finish_insn_seq[1] = { BIN(finish_SC_ax_ax) }; +#elif OPT_CALL_THREADED_CODE +static VALUE const finish_insn_seq[1] = { 0 }; +#else +static VALUE finish_insn_seq[1] = { BIN(finish) }; +#endif + +#if !OPT_CALL_THREADED_CODE +static VALUE +vm_exec_core(rb_thread_t *th, VALUE initial) +{ + +#if OPT_STACK_CACHING +#if 0 +#elif __GNUC__ && __x86_64 + DECL_SC_REG(VALUE, a, "12"); + DECL_SC_REG(VALUE, b, "13"); +#else + register VALUE reg_a; + register VALUE reg_b; +#endif +#endif + +#if __GNUC__ && __i386__ + DECL_SC_REG(VALUE *, pc, "di"); + DECL_SC_REG(rb_control_frame_t *, cfp, "si"); +#define USE_MACHINE_REGS 1 + +#elif __GNUC__ && __x86_64__ + DECL_SC_REG(VALUE *, pc, "14"); + DECL_SC_REG(rb_control_frame_t *, cfp, "15"); +#define USE_MACHINE_REGS 1 + +#else + register rb_control_frame_t *reg_cfp; + VALUE *reg_pc; +#endif + +#if USE_MACHINE_REGS + +#undef RESTORE_REGS +#define RESTORE_REGS() \ +{ \ + REG_CFP = th->cfp; \ + reg_pc = reg_cfp->pc; \ +} + +#undef REG_PC +#define REG_PC reg_pc +#undef GET_PC +#define GET_PC() (reg_pc) +#undef SET_PC +#define SET_PC(x) (reg_cfp->pc = REG_PC = (x)) +#endif + +#if OPT_TOKEN_THREADED_CODE || OPT_DIRECT_THREADED_CODE +#include "vmtc.inc" + if (th == 0) { +#if OPT_STACK_CACHING + finish_insn_seq[0] = (VALUE)&&LABEL (finish_SC_ax_ax); +#else + finish_insn_seq[0] = (VALUE)&&LABEL (finish); +#endif + return (VALUE)insns_address_table; + } +#endif + reg_cfp = th->cfp; + reg_pc = reg_cfp->pc; + +#if OPT_STACK_CACHING + reg_a = initial; + reg_b = 0; +#endif + + first: + INSN_DISPATCH(); +/*****************/ + #include "vm.inc" +/*****************/ + END_INSNS_DISPATCH(); + + /* unreachable */ + rb_bug("vm_eval: unreachable"); + goto first; +} + +const void ** +vm_get_insns_address_table(void) +{ + return (const void **)vm_exec_core(0, 0); +} + +#else + +#include "vm.inc" +#include "vmtc.inc" + +const void *const * +vm_get_insns_address_table(void) +{ + return insns_address_table; +} + +static VALUE +vm_exec_core(rb_thread_t *th, VALUE initial) +{ + register rb_control_frame_t *reg_cfp = th->cfp; + VALUE ret; + + while (*GET_PC()) { + reg_cfp = ((rb_insn_func_t) (*GET_PC()))(th, reg_cfp); + + if (reg_cfp == 0) { + VALUE err = th->errinfo; + th->errinfo = Qnil; + return err; + } + } + + if (VM_FRAME_TYPE(th->cfp) != VM_FRAME_MAGIC_FINISH) { + rb_bug("cfp consistency error"); + } + + ret = *(th->cfp->sp-1); /* pop */ + th->cfp++; /* pop cf */ + return ret; +} +#endif |