/********************************************************************** node.h - $Author$ $Date$ created at: Fri May 28 15:14:02 JST 1993 Copyright (C) 1993-2003 Yukihiro Matsumoto **********************************************************************/ #ifndef NODE_H #define NODE_H #if defined(__cplusplus) extern "C" { #endif enum node_type { NODE_METHOD, NODE_FBODY, NODE_CFUNC, NODE_SCOPE, NODE_BLOCK, NODE_IF, NODE_CASE, NODE_WHEN, NODE_OPT_N, NODE_WHILE, NODE_UNTIL, NODE_ITER, NODE_FOR, NODE_BREAK, NODE_NEXT, NODE_REDO, NODE_RETRY, NODE_BEGIN, NODE_RESCUE, NODE_RESBODY, NODE_ENSURE, NODE_AND, NODE_OR, NODE_NOT, NODE_MASGN, NODE_LASGN, NODE_DASGN, NODE_DASGN_CURR, NODE_GASGN, NODE_IASGN, NODE_CDECL, NODE_CVASGN, NODE_CVDECL, NODE_OP_ASGN1, NODE_OP_ASGN2, NODE_OP_ASGN_AND, NODE_OP_ASGN_OR, NODE_CALL, NODE_FCALL, NODE_VCALL, NODE_SUPER, NODE_ZSUPER, NODE_ARRAY, NODE_ZARRAY, NODE_VALUES, NODE_HASH, NODE_RETURN, NODE_YIELD, NODE_LVAR, NODE_DVAR, NODE_GVAR, NODE_IVAR, NODE_CONST, NODE_CVAR, NODE_NTH_REF, NODE_BACK_REF, NODE_MATCH, NODE_MATCH2, NODE_MATCH3, NODE_LIT, NODE_STR, NODE_DSTR, NODE_XSTR, NODE_DXSTR, NODE_EVSTR, NODE_DREGX, NODE_DREGX_ONCE, NODE_ARGS, NODE_POSTARG, NODE_ARGSCAT, NODE_ARGSPUSH, NODE_SPLAT, NODE_TO_ARY, NODE_BLOCK_ARG, NODE_BLOCK_PASS, NODE_DEFN, NODE_DEFS, NODE_ALIAS, NODE_VALIAS, NODE_UNDEF, NODE_CLASS, NODE_MODULE, NODE_SCLASS, NODE_COLON2, NODE_COLON3, NODE_CREF, NODE_DOT2, NODE_DOT3, NODE_FLIP2, NODE_FLIP3, NODE_ATTRSET, NODE_SELF, NODE_NIL, NODE_TRUE, NODE_FALSE, NODE_ERRINFO, NODE_DEFINED, NODE_POSTEXE, NODE_ALLOCA, NODE_BMETHOD, NODE_MEMO, NODE_IFUNC, NODE_DSYM, NODE_ATTRASGN, NODE_PRELUDE, NODE_LAMBDA, NODE_LAST }; typedef struct RNode { unsigned long flags; char *nd_file; union { struct RNode *node; ID id; VALUE value; VALUE (*cfunc)(ANYARGS); ID *tbl; } u1; union { struct RNode *node; ID id; long argc; VALUE value; } u2; union { struct RNode *node; ID id; long state; struct global_entry *entry; long cnt; VALUE value; } u3; } NODE; extern NODE *ruby_cref; extern NODE *ruby_top_cref; #define RNODE(obj) (R_CAST(RNode)(obj)) /* 0..4:T_TYPES, 5:FL_MARK, 6:reserved, 7:NODE_NEWLINE */ #define NODE_NEWLINE (1<<7) #define NODE_TYPESHIFT 8 #define NODE_TYPEMASK (0x7f<flags & NODE_TYPEMASK)>>NODE_TYPESHIFT)) #define nd_set_type(n,t) \ RNODE(n)->flags=((RNODE(n)->flags&~NODE_TYPEMASK)|(((t)<flags>>NODE_LSHIFT)&NODE_LMASK)) #define nd_set_line(n,l) \ RNODE(n)->flags=((RNODE(n)->flags&~(-1< #define USE_CONTEXT #endif #include #include "st.h" #ifdef USE_CONTEXT typedef struct { ucontext_t context; volatile int status; } rb_jmpbuf_t[1]; #else typedef jmp_buf rb_jmpbuf_t; #endif enum thread_status { THREAD_TO_KILL, THREAD_RUNNABLE, THREAD_STOPPED, THREAD_KILLED, }; typedef struct thread * rb_thread_t; struct thread { struct thread *next, *prev; rb_jmpbuf_t context; #if (defined _WIN32 && !defined _WIN32_WCE) || defined __CYGWIN__ unsigned long win32_exception_list; #endif VALUE result; long stk_len; long stk_max; VALUE *stk_ptr; VALUE *stk_pos; #ifdef __ia64 long bstr_len; long bstr_max; VALUE *bstr_ptr; VALUE *bstr_pos; #endif struct FRAME *frame; struct SCOPE *scope; struct RVarmap *dyna_vars; struct BLOCK *block; struct iter *iter; struct tag *tag; VALUE wrapper; NODE *cref; struct ruby_env *anchor; int flags; /* misc. states (rb_trap_immediate/raised) */ NODE *node; int tracing; VALUE errinfo; VALUE last_status; VALUE last_line; VALUE last_match; int safe; enum thread_status status; int wait_for; int fd; rb_fdset_t readfds; rb_fdset_t writefds; rb_fdset_t exceptfds; int select_value; double delay; rb_thread_t join; int abort; int priority; VALUE thgroup; st_table *locals; VALUE thread; VALUE sandbox; }; extern VALUE (*ruby_sandbox_save)(struct thread *); extern VALUE (*ruby_sandbox_restore)(struct thread *); extern rb_thread_t curr_thread; extern rb_thread_t main_thread; #if defined(__cplusplus) } /* extern "C" { */ #endif #endif