pike.git/
src/
interpret_functions.h
Branch:
Tag:
Non-build tags
All tags
No tags
2000-04-19
2000-04-19 14:14:29 by Henrik Grubbström (Grubba) <grubba@grubba.org>
bac71b2408441c3eea8100431b5a7b541e298960 (
605
lines) (+
313
/-
292
)
[
Show
|
Annotate
]
Branch:
7.9
More opcodes converted.
Rev: src/interpret_functions.h:1.8
Rev: src/lex.c:1.72
1:
/*
-
* $Id: interpret_functions.h,v 1.
7
2000/04/
18
20
:
23
:
59
grubba Exp $
+
* $Id: interpret_functions.h,v 1.
8
2000/04/
19
14
:
14
:
12
grubba Exp $
* * Opcode definitions for the interpreter. */
543:
break; }
-
CASE
(F_INC)
;
+
OPCODE0
(F_INC
, "++x"
)
{ union anything *u=get_pointer_if_this_type(Pike_sp-2, PIKE_T_INT); if(u
555:
instr=++ u->integer; pop_n_elems(2); push_int(u->integer);
-
break;
-
}
+
}
else
{
lvalue_to_svalue_no_free(Pike_sp, Pike_sp-2); Pike_sp++; push_int(1); f_add(2); assign_lvalue(Pike_sp-3, Pike_sp-1); assign_svalue(Pike_sp-3, Pike_sp-1); pop_n_elems(2);
-
break;
+
}
-
+
}
+
BREAK;
-
CASE
(F_DEC)
;
+
OPCODE0
(F_DEC
, "--x"
)
{ union anything *u=get_pointer_if_this_type(Pike_sp-2, PIKE_T_INT); if(u
578:
instr=-- u->integer; pop_n_elems(2); push_int(u->integer);
-
break;
-
}
+
}
else
{
lvalue_to_svalue_no_free(Pike_sp, Pike_sp-2); Pike_sp++; push_int(1); o_subtract(); assign_lvalue(Pike_sp-3, Pike_sp-1); assign_svalue(Pike_sp-3, Pike_sp-1); pop_n_elems(2);
-
break;
+
}
-
+
}
+
BREAK;
-
CASE
(F_DEC_AND_POP)
;
+
OPCODE0
(F_DEC_AND_POP
, "x-- and pop"
)
{ union anything *u=get_pointer_if_this_type(Pike_sp-2, PIKE_T_INT); if(u
607:
assign_lvalue(Pike_sp-3, Pike_sp-1); pop_n_elems(3); }
-
break;
+
}
-
+
BREAK;
-
CASE
(F_INC_AND_POP)
;
+
OPCODE0
(F_INC_AND_POP
, "x++ and pop"
)
{ union anything *u=get_pointer_if_this_type(Pike_sp-2, PIKE_T_INT); if(u
621:
{ instr=++ u->integer; pop_n_elems(2);
-
break;
-
}
+
}
else
{
lvalue_to_svalue_no_free(Pike_sp, Pike_sp-2); Pike_sp++; push_int(1); f_add(2); assign_lvalue(Pike_sp-3, Pike_sp-1); pop_n_elems(3);
-
break;
+
}
-
+
}
+
BREAK;
-
CASE
(F_POST_INC)
;
+
OPCODE0
(F_POST_INC
, "x++"
)
{ union anything *u=get_pointer_if_this_type(Pike_sp-2, PIKE_T_INT); if(u
643:
instr=u->integer ++; pop_n_elems(2); push_int(instr);
-
break;
-
}
+
}
else
{
lvalue_to_svalue_no_free(Pike_sp, Pike_sp-2); Pike_sp++; assign_svalue_no_free(Pike_sp,Pike_sp-1); Pike_sp++; push_int(1);
652:
assign_lvalue(Pike_sp-4, Pike_sp-1); assign_svalue(Pike_sp-4, Pike_sp-2); pop_n_elems(3);
-
break;
+
}
-
+
}
+
BREAK;
-
CASE
(F_POST_DEC)
;
+
OPCODE0
(F_POST_DEC
, "x--"
)
{ union anything *u=get_pointer_if_this_type(Pike_sp-2, PIKE_T_INT); if(u
667:
instr=u->integer --; pop_n_elems(2); push_int(instr);
-
break;
-
}
+
}
else
{
lvalue_to_svalue_no_free(Pike_sp, Pike_sp-2); Pike_sp++; assign_svalue_no_free(Pike_sp,Pike_sp-1); Pike_sp++; push_int(1);
676:
assign_lvalue(Pike_sp-4, Pike_sp-1); assign_svalue(Pike_sp-4, Pike_sp-2); pop_n_elems(3);
-
break;
+
}
-
+
}
+
BREAK;
-
CASE
(F_ASSIGN)
;
+
OPCODE0
(F_ASSIGN
, "assign"
)
assign_lvalue(Pike_sp-3,Pike_sp-1); free_svalue(Pike_sp-3); free_svalue(Pike_sp-2); Pike_sp[-3]=Pike_sp[-1]; Pike_sp-=2;
-
break
;
+
BREAK
;
-
CASE
(F_ASSIGN_AND_POP
);
-
assign_lvalue(Pike_sp-3,Pike_sp-1);
+
OPCODE0
(F_ASSIGN_AND_POP
,
"assign
and
pop")
+
assign_lvalue(Pike_sp-3,
Pike_sp-1);
pop_n_elems(3);
-
break
;
+
BREAK
;
CASE(F_APPLY_ASSIGN_LOCAL); strict_apply_svalue(Pike_fp->context.prog->constants + GET_ARG(), Pike_sp - *--Pike_mark_sp );
711:
Pike_sp--; break;
-
CASE
(F_ASSIGN_GLOBAL)
+
OPCODE1
(F_ASSIGN_GLOBAL
, "assign global"
)
{ struct identifier *i;
-
INT32 tmp=
GET_ARG()
+ Pike_fp->context.identifier_level;
+
INT32 tmp=
arg1
+ Pike_fp->context.identifier_level;
if(!Pike_fp->current_object->prog) error("Cannot access global variables in destructed object.\n");
730:
Pike_sp-1); } }
-
break
;
+
BREAK
;
-
CASE
(F_ASSIGN_GLOBAL_AND_POP)
+
OPCODE1
(F_ASSIGN_GLOBAL_AND_POP
, "assign global and pop"
)
{ struct identifier *i;
-
INT32 tmp=
GET_ARG()
+ Pike_fp->context.identifier_level;
+
INT32 tmp=
arg1
+ Pike_fp->context.identifier_level;
if(!Pike_fp->current_object->prog) error("Cannot access global variables in destructed object.\n");
756:
pop_stack(); } }
-
break
;
+
BREAK
;
/* Stack machine stuff */
-
CASE
(F_POP_VALUE)
;
pop_stack();
break
;
-
CASE
(F_POP_N_ELEMS)
;
pop_n_elems(
GET_ARG(
)
)
;
break
;
+
+
OPCODE0
(F_POP_VALUE
, "pop"
)
+
pop_stack();
+
BREAK
;
+
+
OPCODE1
(F_POP_N_ELEMS
, "pop_n_elems"
)
+
pop_n_elems(
arg1
);
+
BREAK
;
+
CASE(F_MARK2); *(Pike_mark_sp++)=Pike_sp; CASE(F_MARK); *(Pike_mark_sp++)=Pike_sp; break;
-
CASE(F_MARK_X); *(Pike_mark_sp++)=Pike_sp-GET_ARG(); break;
-
CASE(F_POP_MARK); --Pike_mark_sp; break;
+
-
CASE
(F_CLEAR_STRING_SUBTYPE)
;
+
OPCODE1(F_MARK_X,
"mark
sp-X")
+
*(Pike_mark_sp++)=Pike_sp-arg1;
+
BREAK;
+
+
OPCODE0(F_POP_MARK,
"pop
mark")
+
--Pike_mark_sp;
+
BREAK;
+
+
OPCODE0
(F_CLEAR_STRING_SUBTYPE
, "clear string subtype"
)
if(Pike_sp[-1].type==PIKE_T_STRING) Pike_sp[-1].subtype=0;
-
break
;
+
BREAK
;
/* Jumps */ CASE(F_BRANCH);
908:
pc+=EXTRACT_INT(pc); break;
-
CASE
(F_THROW_ZERO)
;
+
OPCODE0
(F_THROW_ZERO
, "throw(0
)
")
push_int(0); f_throw(1);
-
break
;
+
BREAK
;
-
CASE
(F_SWITCH)
+
OPCODE1
(F_SWITCH
, "switch"
)
{ INT32 tmp; tmp=switch_lookup(Pike_fp->context.prog->
-
constants[
GET_ARG()
].sval.u.array,Pike_sp-1);
+
constants[
arg1
].sval.u.array,Pike_sp-1);
pc=(unsigned char *)DO_ALIGN(pc,sizeof(INT32)); pc+=(tmp>=0 ? 1+tmp*2 : 2*~tmp) * sizeof(INT32); if(*(INT32*)pc < 0) fast_check_threads_etc(7); pc+=*(INT32*)pc; pop_stack();
-
break;
+
}
-
+
BREAK;
/* FIXME: Does this need bignum tests? /Fixed - Hubbe */ LOOP(F_INC_LOOP, 1, <, is_lt);
1030:
CASE(F_DUMB_RETURN); return -1;
-
CASE
(F_NEGATE
);
+
OPCODE0
(F_NEGATE
, "unary minus"
)
if(Pike_sp[-1].type == PIKE_T_INT) { #ifdef AUTO_BIGNUM
1049:
}else{ o_negate(); }
-
break
;
+
BREAK
;
-
CASE
(F_COMPL)
;
o_compl();
break
;
+
OPCODE0
(F_COMPL
, "~"
)
+
o_compl();
+
BREAK
;
-
CASE
(F_NOT)
;
+
OPCODE0
(F_NOT
, "!"
)
switch(Pike_sp[-1].type) { case PIKE_T_INT:
1077:
Pike_sp[-1].type=PIKE_T_INT; Pike_sp[-1].u.integer=0; }
-
break
;
+
BREAK
;
-
CASE
(F_LSH
);
o_lsh(
)
; break;
-
CASE(F_RSH);
o_
rsh
();
break
;
+
OPCODE0
(F_LSH
,
"<<"
)
+
o_
lsh
();
+
BREAK
;
-
+
OPCODE0(F_RSH, ">>")
+
o_rsh();
+
BREAK;
+
COMPARISMENT(F_EQ, is_eq(Pike_sp-2,Pike_sp-1)); COMPARISMENT(F_NE,!is_eq(Pike_sp-2,Pike_sp-1)); COMPARISMENT(F_GT, is_gt(Pike_sp-2,Pike_sp-1));
1232:
f_cast(); BREAK;
-
CASE
(F_SOFT_CAST)
;
+
OPCODE0
(F_SOFT_CAST
, "soft cast"
)
/* Stack: type_string, value */ #ifdef PIKE_DEBUG if (Pike_sp[-2].type != T_STRING) {
1293:
} stack_swap(); pop_stack();
-
break
;
+
BREAK
;
OPCODE0(F_RANGE, "range") o_range();