2006-12-31 10:02:22 -05:00
/**********************************************************************
vm . h -
$ Author $
created at : 04 / 01 / 01 16 : 56 : 59 JST
* blockinlining.c, compile.c, compile.h, debug.c, debug.h,
id.c, insnhelper.h, insns.def, thread.c, thread_pthread.ci,
thread_pthread.h, thread_win32.ci, thread_win32.h, vm.h,
vm_dump.c, vm_evalbody.ci, vm_opts.h: fix comments and
copyright year.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@13920 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-11-13 17:13:04 -05:00
Copyright ( C ) 2004 - 2007 Koichi Sasada
2006-12-31 10:02:22 -05:00
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2008-11-18 19:06:38 -05:00
# ifndef RUBY_VM_EXEC_H
# define RUBY_VM_EXEC_H
2006-12-31 10:02:22 -05:00
typedef long OFFSET ;
2007-06-24 13:19:22 -04:00
typedef unsigned long lindex_t ;
2012-11-15 08:42:27 -05:00
typedef VALUE GENTRY ;
2007-08-06 07:36:30 -04:00
typedef rb_iseq_t * ISEQ ;
2007-06-24 13:19:22 -04:00
2006-12-31 10:02:22 -05:00
# ifdef __GCC__
/* TODO: machine dependent prefetch instruction */
# define PREFETCH(pc)
# else
# define PREFETCH(pc)
# endif
# if VMDEBUG > 0
# define debugs printf
# define DEBUG_ENTER_INSN(insn) \
2012-06-10 23:14:59 -04:00
rb_vmdebug_debug_print_pre ( th , GET_CFP ( ) ) ;
2006-12-31 10:02:22 -05:00
# if OPT_STACK_CACHING
# define SC_REGS() , reg_a, reg_b
# else
# define SC_REGS()
# endif
# define DEBUG_END_INSN() \
2012-06-10 23:14:59 -04:00
rb_vmdebug_debug_print_post ( th , GET_CFP ( ) SC_REGS ( ) ) ;
2006-12-31 10:02:22 -05:00
# else
# define debugs
2010-01-05 00:59:23 -05:00
# define DEBUG_ENTER_INSN(insn)
# define DEBUG_END_INSN()
2006-12-31 10:02:22 -05:00
# endif
# define throwdebug if(0)printf
* call_cfunc.ci, compile.c, compile.h, debug.h, eval.c,
eval_error.h, eval_jump.h, eval_load.c, eval_thread.c, gc.c,
insnhelper.h, insns.def, iseq.c, main.c, numeric.c, parse.y,
range.c, regenc.h, ruby.h, signal.c, thread.c, thread_win32.ci,
vm.c, vm.h, vm_dump.c, vm_evalbody.ci, yarvcore.c, yarvcore.h:
fixed indents and non-C90 comments.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@11620 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2007-02-02 11:26:04 -05:00
/* #define throwdebug printf */
2006-12-31 10:02:22 -05:00
/************************************************/
2012-07-25 02:49:35 -04:00
# if defined(DISPATCH_XXX)
2006-12-31 10:02:22 -05:00
error !
/************************************************/
# elif OPT_CALL_THREADED_CODE
2007-06-27 16:03:53 -04:00
# define LABEL(x) insn_func_##x
# define ELABEL(x)
# define LABEL_PTR(x) &LABEL(x)
2006-12-31 10:02:22 -05:00
# define INSN_ENTRY(insn) \
2007-06-27 04:21:21 -04:00
static rb_control_frame_t * \
2007-06-28 09:31:08 -04:00
FUNC_FASTCALL ( LABEL ( insn ) ) ( rb_thread_t * th , rb_control_frame_t * reg_cfp ) {
2006-12-31 10:02:22 -05:00
# define END_INSN(insn) return reg_cfp;}
# define NEXT_INSN() return reg_cfp;
/************************************************/
# elif OPT_TOKEN_THREADED_CODE || OPT_DIRECT_THREADED_CODE
/* threaded code with gcc */
# define LABEL(x) INSN_LABEL_##x
# define ELABEL(x) INSN_ELABEL_##x
# define LABEL_PTR(x) &&LABEL(x)
2007-12-23 14:03:23 -05:00
# define INSN_ENTRY_SIG(insn)
2006-12-31 10:02:22 -05:00
2007-12-23 14:03:23 -05:00
# define INSN_DISPATCH_SIG(insn)
2006-12-31 10:02:22 -05:00
# define INSN_ENTRY(insn) \
LABEL ( insn ) : \
INSN_ENTRY_SIG ( insn ) ; \
2013-04-22 15:40:10 -04:00
/* dispatcher */
2012-07-25 02:49:35 -04:00
# if defined(__GNUC__) && (defined(__i386__) || defined(__x86_64__)) && __GNUC__ == 3
2006-12-31 10:02:22 -05:00
# define DISPATCH_ARCH_DEPEND_WAY(addr) \
2013-02-10 01:39:30 -05:00
__asm__ __volatile__ ( " jmp *%0; \t # -- inserted by vm.h \t [length = 2] " : : " r " ( addr ) )
2006-12-31 10:02:22 -05:00
# else
# define DISPATCH_ARCH_DEPEND_WAY(addr) \
/* do nothing */
# endif
/**********************************/
# if OPT_DIRECT_THREADED_CODE
/* for GCC 3.4.x */
# define TC_DISPATCH(insn) \
INSN_DISPATCH_SIG ( insn ) ; \
2010-07-27 03:13:43 -04:00
goto * ( void const * ) GET_CURRENT_INSN ( ) ; \
2006-12-31 10:02:22 -05:00
;
# else
2013-04-22 15:40:10 -04:00
/* token threaded code */
2006-12-31 10:02:22 -05:00
# define TC_DISPATCH(insn) \
DISPATCH_ARCH_DEPEND_WAY ( insns_address_table [ GET_CURRENT_INSN ( ) ] ) ; \
INSN_DISPATCH_SIG ( insn ) ; \
goto * insns_address_table [ GET_CURRENT_INSN ( ) ] ; \
rb_bug ( " tc error " ) ;
# endif /* DISPATCH_DIRECT_THREADED_CODE */
# define END_INSN(insn) \
DEBUG_END_INSN ( ) ; \
2013-02-26 22:22:50 -05:00
TC_DISPATCH ( insn ) ;
2006-12-31 10:02:22 -05:00
# define INSN_DISPATCH() \
TC_DISPATCH ( __START__ ) \
{
# define END_INSNS_DISPATCH() \
2010-10-12 11:03:51 -04:00
rb_bug ( " unknown insn: % " PRIdVALUE , GET_CURRENT_INSN ( ) ) ; \
2006-12-31 10:02:22 -05:00
} /* end of while loop */ \
# define NEXT_INSN() TC_DISPATCH(__NEXT_INSN__)
/************************************************/
# else /* no threaded code */
/* most common method */
# define INSN_ENTRY(insn) \
case BIN ( insn ) :
# define END_INSN(insn) \
DEBUG_END_INSN ( ) ; \
break ;
# define INSN_DISPATCH() \
2012-12-29 07:22:04 -05:00
while ( 1 ) { \
switch ( GET_CURRENT_INSN ( ) ) {
2006-12-31 10:02:22 -05:00
# define END_INSNS_DISPATCH() \
default : \
SDR ( ) ; \
rb_bug ( " unknown insn: %ld " , GET_CURRENT_INSN ( ) ) ; \
} /* end of switch */ \
} /* end of while loop */ \
# define NEXT_INSN() goto first
# endif
2007-06-27 04:21:21 -04:00
# define VM_SP_CNT(th, sp) ((sp) - (th)->stack)
# if OPT_CALL_THREADED_CODE
# define THROW_EXCEPTION(exc) do { \
th - > errinfo = ( VALUE ) ( exc ) ; \
return 0 ; \
} while ( 0 )
# else
2007-06-27 07:33:01 -04:00
# define THROW_EXCEPTION(exc) return (VALUE)(exc)
2007-06-27 04:21:21 -04:00
# endif
2006-12-31 10:02:22 -05:00
# define SCREG(r) (reg_##r)
2013-07-26 06:28:26 -04:00
# define CHECK_VM_STACK_OVERFLOW_FOR_INSN(cfp, margin) \
if ( ( VALUE * ) ( ( char * ) ( ( ( VALUE * ) ( cfp ) - > sp ) + ( margin ) ) + sizeof ( rb_control_frame_t ) ) > = ( ( VALUE * ) ( cfp ) ) ) { \
rb_bug ( " CHECK_VM_STACK_OVERFLOW_FOR_INSN: should not overflow here. Please contact ruby-core/dev with your (a part of) script. This check will be removed soon. " ) ; \
} while ( 0 ) ;
2006-12-31 10:02:22 -05:00
2008-11-18 19:06:38 -05:00
# endif /* RUBY_VM_EXEC_H */