7951942000-04-20Fredrik Hübinette (Hubbe) 
7d7d7e1999-01-31Fredrik Hübinette (Hubbe) #undef GET_ARG #undef GET_ARG2 #ifdef PIKE_DEBUG #define GET_ARG() (backlog[backlogp].arg=(\ instr=prefix,\ prefix=0,\ instr+=EXTRACT_UCHAR(pc++),\ (t_flag>3 ? sprintf(trace_buffer,"- Arg = %ld\n",(long)instr),write_to_stderr(trace_buffer,strlen(trace_buffer)) : 0),\ instr))
a96ce92000-04-19Fredrik Hübinette (Hubbe) 
c7ef072000-04-21Fredrik Hübinette (Hubbe) #define GET_ARG2() (backlog[backlogp].arg2=(\
a96ce92000-04-19Fredrik Hübinette (Hubbe)  instr=prefix2,\ prefix2=0,\ instr+=EXTRACT_UCHAR(pc++),\
7d7d7e1999-01-31Fredrik Hübinette (Hubbe)  (t_flag>3 ? sprintf(trace_buffer,"- Arg2= %ld\n",(long)instr),write_to_stderr(trace_buffer,strlen(trace_buffer)) : 0),\
c7ef072000-04-21Fredrik Hübinette (Hubbe)  instr))
7d7d7e1999-01-31Fredrik Hübinette (Hubbe)  #else #define GET_ARG() (instr=prefix,prefix=0,instr+EXTRACT_UCHAR(pc++))
a96ce92000-04-19Fredrik Hübinette (Hubbe) #define GET_ARG2() (instr=prefix2,prefix2=0,instr+EXTRACT_UCHAR(pc++))
7d7d7e1999-01-31Fredrik Hübinette (Hubbe) #endif static int eval_instruction(unsigned char *pc) {
a96ce92000-04-19Fredrik Hübinette (Hubbe)  unsigned INT32 prefix2=0,instr, prefix=0;
a2ad152000-02-16Fredrik Hübinette (Hubbe)  debug_malloc_touch(Pike_fp);
7d7d7e1999-01-31Fredrik Hübinette (Hubbe)  while(1) {
a2ad152000-02-16Fredrik Hübinette (Hubbe)  Pike_fp->pc = pc;
7d7d7e1999-01-31Fredrik Hübinette (Hubbe)  instr=EXTRACT_UCHAR(pc++); #ifdef PIKE_DEBUG if(d_flag) {
dcbfa71999-05-07Fredrik Hübinette (Hubbe) #ifdef _REENTRANT
c91f892000-04-19Martin Stjernholm  CHECK_INTERPRETER_LOCK();
f077582000-07-06Fredrik Hübinette (Hubbe)  if(OBJ2THREAD(Pike_interpreter.thread_id)->state.thread_id != Pike_interpreter.thread_id) fatal("Arglebargle glop glyf, thread swap problem!\n"); if(d_flag>1 && thread_for_id(th_self()) != Pike_interpreter.thread_id) fatal("thread_for_id() (or Pike_interpreter.thread_id) failed in interpreter.h! %p != %p\n",thread_for_id(th_self()),Pike_interpreter.thread_id);
dcbfa71999-05-07Fredrik Hübinette (Hubbe) #endif
a2ad152000-02-16Fredrik Hübinette (Hubbe)  Pike_sp[0].type=99; /* an invalid type */ Pike_sp[1].type=99; Pike_sp[2].type=99; Pike_sp[3].type=99;
7d7d7e1999-01-31Fredrik Hübinette (Hubbe) 
17f08c2000-07-06Fredrik Hübinette (Hubbe)  if(Pike_sp<Pike_interpreter.evaluator_stack || Pike_mark_sp < Pike_interpreter.mark_stack || Pike_fp->locals>Pike_sp)
a4a1722000-12-05Per Hedbor  fatal("Stack error (generic) sp=%p/%p mark_sp=%p/%p locals=%p.\n",
c7ef072000-04-21Fredrik Hübinette (Hubbe)  Pike_sp,
f077582000-07-06Fredrik Hübinette (Hubbe)  Pike_interpreter.evaluator_stack,
17f08c2000-07-06Fredrik Hübinette (Hubbe)  Pike_mark_sp,
f077582000-07-06Fredrik Hübinette (Hubbe)  Pike_interpreter.mark_stack,
c7ef072000-04-21Fredrik Hübinette (Hubbe)  Pike_fp->locals);
7d7d7e1999-01-31Fredrik Hübinette (Hubbe) 
17f08c2000-07-06Fredrik Hübinette (Hubbe)  if(Pike_mark_sp > Pike_interpreter.mark_stack+Pike_stack_size)
a4a1722000-12-05Per Hedbor  fatal("Mark Stack error (overflow).\n");
f077582000-07-06Fredrik Hübinette (Hubbe) 
17f08c2000-07-06Fredrik Hübinette (Hubbe)  if(Pike_mark_sp < Pike_interpreter.mark_stack)
a4a1722000-12-05Per Hedbor  fatal("Mark Stack error (underflow).\n");
f077582000-07-06Fredrik Hübinette (Hubbe)  if(Pike_sp > Pike_interpreter.evaluator_stack+Pike_stack_size)
a4a1722000-12-05Per Hedbor  fatal("stack error (overflow).\n");
7d7d7e1999-01-31Fredrik Hübinette (Hubbe) 
a96ce92000-04-19Fredrik Hübinette (Hubbe)  if(/* Pike_fp->fun>=0 && */ Pike_fp->current_object->prog &&
a2ad152000-02-16Fredrik Hübinette (Hubbe)  Pike_fp->locals+Pike_fp->num_locals > Pike_sp)
a4a1722000-12-05Per Hedbor  fatal("Stack error (stupid!).\n");
7d7d7e1999-01-31Fredrik Hübinette (Hubbe) 
f077582000-07-06Fredrik Hübinette (Hubbe)  if(Pike_interpreter.recoveries && Pike_sp-Pike_interpreter.evaluator_stack < Pike_interpreter.recoveries->stack_pointer)
a4a1722000-12-05Per Hedbor  fatal("Stack error (underflow).\n");
7d7d7e1999-01-31Fredrik Hübinette (Hubbe) 
17f08c2000-07-06Fredrik Hübinette (Hubbe)  if(Pike_mark_sp > Pike_interpreter.mark_stack && Pike_mark_sp[-1] > Pike_sp)
a4a1722000-12-05Per Hedbor  fatal("Stack error (underflow?)\n");
7d7d7e1999-01-31Fredrik Hübinette (Hubbe)  if(d_flag > 9) do_debug(); backlogp++; if(backlogp >= BACKLOG) backlogp=0; if(backlog[backlogp].program) free_program(backlog[backlogp].program);
a2ad152000-02-16Fredrik Hübinette (Hubbe)  backlog[backlogp].program=Pike_fp->context.prog; add_ref(Pike_fp->context.prog);
7d7d7e1999-01-31Fredrik Hübinette (Hubbe)  backlog[backlogp].instruction=instr; backlog[backlogp].pc=pc;
f077582000-07-06Fredrik Hübinette (Hubbe)  backlog[backlogp].stack = Pike_sp - Pike_interpreter.evaluator_stack;
17f08c2000-07-06Fredrik Hübinette (Hubbe)  backlog[backlogp].mark_stack = Pike_mark_sp - Pike_interpreter.mark_stack;
8eaef52000-04-21Fredrik Hübinette (Hubbe) #ifdef _REENTRANT
f077582000-07-06Fredrik Hübinette (Hubbe)  backlog[backlogp].thread_id=Pike_interpreter.thread_id;
8eaef52000-04-21Fredrik Hübinette (Hubbe) #endif
e1fed61999-09-09Fredrik Hübinette (Hubbe) 
a2ad152000-02-16Fredrik Hübinette (Hubbe)  debug_malloc_touch(Pike_fp->current_object);
b040a21999-09-14Fredrik Hübinette (Hubbe)  switch(d_flag) { default: case 3:
a2ad152000-02-16Fredrik Hübinette (Hubbe)  check_object(Pike_fp->current_object);
8f29a31999-09-15Fredrik Hübinette (Hubbe) /* break; */
b040a21999-09-14Fredrik Hübinette (Hubbe)  case 2:
a2ad152000-02-16Fredrik Hübinette (Hubbe)  check_object_context(Pike_fp->current_object, Pike_fp->context.prog,
60d9872000-03-23Fredrik Hübinette (Hubbe)  CURRENT_STORAGE);
b040a21999-09-14Fredrik Hübinette (Hubbe)  case 1: case 0: break; }
7d7d7e1999-01-31Fredrik Hübinette (Hubbe)  } if(t_flag > 2) { char *file, *f; INT32 linep;
a2ad152000-02-16Fredrik Hübinette (Hubbe)  file=get_line(pc-1,Pike_fp->context.prog,&linep);
7d7d7e1999-01-31Fredrik Hübinette (Hubbe)  while((f=STRCHR(file,'/'))) file=f+1; fprintf(stderr,"- %s:%4ld:(%lx): %-25s %4ld %4ld\n", file,(long)linep,
1330e12000-08-10Henrik Grubbström (Grubba)  DO_NOT_WARN((long)(pc-Pike_fp->context.prog->program-1)),
7d7d7e1999-01-31Fredrik Hübinette (Hubbe)  get_f_name(instr + F_OFFSET),
1330e12000-08-10Henrik Grubbström (Grubba)  DO_NOT_WARN((long)(Pike_sp-Pike_interpreter.evaluator_stack)), DO_NOT_WARN((long)(Pike_mark_sp-Pike_interpreter.mark_stack)));
7d7d7e1999-01-31Fredrik Hübinette (Hubbe)  } if(instr + F_OFFSET < F_MAX_OPCODE) ADD_RUNNED(instr + F_OFFSET); #endif switch(instr) { /* Support to allow large arguments */ CASE(F_PREFIX_256); prefix+=256; break; CASE(F_PREFIX_512); prefix+=512; break; CASE(F_PREFIX_768); prefix+=768; break; CASE(F_PREFIX_1024); prefix+=1024; break; CASE(F_PREFIX_24BITX256); prefix+=EXTRACT_UCHAR(pc++)<<24; CASE(F_PREFIX_WORDX256); prefix+=EXTRACT_UCHAR(pc++)<<16; CASE(F_PREFIX_CHARX256); prefix+=EXTRACT_UCHAR(pc++)<<8; break;
a96ce92000-04-19Fredrik Hübinette (Hubbe)  /* Support to allow large arguments */ CASE(F_PREFIX2_256); prefix2+=256; break; CASE(F_PREFIX2_512); prefix2+=512; break; CASE(F_PREFIX2_768); prefix2+=768; break; CASE(F_PREFIX2_1024); prefix2+=1024; break; CASE(F_PREFIX2_24BITX256); prefix2+=EXTRACT_UCHAR(pc++)<<24; CASE(F_PREFIX2_WORDX256); prefix2+=EXTRACT_UCHAR(pc++)<<16; CASE(F_PREFIX2_CHARX256); prefix2+=EXTRACT_UCHAR(pc++)<<8; break;
7d7d7e1999-01-31Fredrik Hübinette (Hubbe) 
87c7592000-04-18Fredrik Hübinette (Hubbe) #define INTERPRETER
7d7d7e1999-01-31Fredrik Hübinette (Hubbe) 
87c7592000-04-18Fredrik Hübinette (Hubbe) #define OPCODE0(OP,DESC) CASE(OP); { #define OPCODE1(OP,DESC) CASE(OP); { \ INT32 arg1=GET_ARG();
7d7d7e1999-01-31Fredrik Hübinette (Hubbe) 
87c7592000-04-18Fredrik Hübinette (Hubbe) #define OPCODE2(OP,DESC) CASE(OP); { \ INT32 arg1=GET_ARG(); \
c117392000-04-18Henrik Grubbström (Grubba)  INT32 arg2=GET_ARG2();
7d7d7e1999-01-31Fredrik Hübinette (Hubbe) 
7951942000-04-20Fredrik Hübinette (Hubbe) 
87c7592000-04-18Fredrik Hübinette (Hubbe) #define OPCODE0_TAIL(OP,DESC) CASE(OP); #define OPCODE1_TAIL(OP,DESC) CASE(OP); #define OPCODE2_TAIL(OP,DESC) CASE(OP);
7d7d7e1999-01-31Fredrik Hübinette (Hubbe) 
7951942000-04-20Fredrik Hübinette (Hubbe) #define OPCODE0_JUMP(OP,DESC) CASE(OP); {
d157762000-08-31Henrik Grubbström (Grubba) #define OPCODE0_TAILJUMP(OP,DESC) } CASE(OP) {;
7951942000-04-20Fredrik Hübinette (Hubbe)  /* These are something of a special case as they * requires a POINTER stored explicitly after * the instruction itself. */ #define OPCODE1_JUMP(OP,DESC) CASE(OP); { \ INT32 arg1=GET_ARG(); \ #define OPCODE2_JUMP(OP,DESC) CASE(OP); { \ INT32 arg1=GET_ARG(); \ INT32 arg2=GET_ARG2();
b8c5cc2000-08-07Henrik Grubbström (Grubba) #define OPCODE1_TAILJUMP(OP,DESC) } CASE(OP) {; #define OPCODE2_TAILJUMP(OP,DESC) } CASE(OP) {;
7951942000-04-20Fredrik Hübinette (Hubbe) 
87c7592000-04-18Fredrik Hübinette (Hubbe) #define BREAK break; }
a64f6b2001-01-12Martin Stjernholm #define DONE break
87c7592000-04-18Fredrik Hübinette (Hubbe) #include "interpret_functions.h"
7d7d7e1999-01-31Fredrik Hübinette (Hubbe)  default: fatal("Strange instruction %ld\n",(long)instr); } } }
7965d72001-01-24Fredrik Hübinette (Hubbe)