diff --git a/src/Makefile.in b/src/Makefile.in index 1e8738a8fa25895f9551a9364dedab2569311d39..0e15f9e0dc5ffe18fb6d4bd79629432f21f974d9 100644 --- a/src/Makefile.in +++ b/src/Makefile.in @@ -1,5 +1,5 @@ # -# $Id: Makefile.in,v 1.219 2000/11/30 20:13:38 grubba Exp $ +# $Id: Makefile.in,v 1.220 2000/12/01 03:19:00 hubbe Exp $ # # This line is needed on some machines. @@ -611,10 +611,12 @@ module_objects: $(MODULE_REQUIREMENTS) touch modules/modlist.h interpret_protos.h: $(SRCDIR)/interpret_functions.h - egrep '^OPCODE' <$(SRCDIR)/interpret_functions.h >interpret_protos.h + egrep '^OPCODE' <$(SRCDIR)/interpret_functions.h >$(SRCDIR)/interpret_protos.h lex.o: $(SRCDIR)/lex.c interpret_protos.h +interpret.o: $(SRCDIR)/lex.c interpret_protos.h + lex_t.o: $(SRCDIR)/lex_t.c interpret_protos.h language.o: $(SRCDIR)/language.c $(SRCDIR)/object.h $(SRCDIR)/interpret.h $(SRCDIR)/program.h diff --git a/src/interpret_functions.h b/src/interpret_functions.h index 73952d83337293611d94aa41916d652b16cb53b5..b98d36a195510e34de5bbbea4d2091bd3c15ee0d 100644 --- a/src/interpret_functions.h +++ b/src/interpret_functions.h @@ -1,5 +1,5 @@ /* - * $Id: interpret_functions.h,v 1.32 2000/09/25 23:41:33 hubbe Exp $ + * $Id: interpret_functions.h,v 1.33 2000/12/01 03:19:00 hubbe Exp $ * * Opcode definitions for the interpreter. */ @@ -873,6 +873,36 @@ OPCODE1(F_SWITCH, "switch") } BREAK; +OPCODE1(F_SWITCH_ON_INDEX, "switch on index") +{ + INT32 tmp; + struct svalue s; + index_no_free(&s,Pike_sp-2,Pike_sp-1); + Pike_sp++[0]=s; + + tmp=switch_lookup(Pike_fp->context.prog-> + constants[arg1].sval.u.array,Pike_sp-1); + pop_n_elems(3); + 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; +} +BREAK; + +OPCODE2(F_SWITCH_ON_LOCAL, "switch on local") +{ + INT32 tmp; + tmp=switch_lookup(Pike_fp->context.prog-> + constants[arg2].sval.u.array,Pike_fp->locals + arg1); + 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; +} +BREAK; + + /* FIXME: Does this need bignum tests? /Fixed - Hubbe */ LOOP(F_INC_LOOP, 1, <, is_lt); LOOP(F_DEC_LOOP, -1, >, is_gt); diff --git a/src/opcodes.h b/src/opcodes.h index c53034c6ef34df5e47da75dca0d822508b79cd1f..5527fb2ba5115df1a4a5a139a68187cbb107540d 100644 --- a/src/opcodes.h +++ b/src/opcodes.h @@ -5,7 +5,7 @@ \*/ /* - * $Id: opcodes.h,v 1.7 2000/12/01 01:13:44 hubbe Exp $ + * $Id: opcodes.h,v 1.8 2000/12/01 03:19:01 hubbe Exp $ */ #ifndef OPCODES_H #define OPCODES_H @@ -16,226 +16,139 @@ * These values are used by the stack machine, and can not be directly * called from Pike. */ -#define F_OFFSET 257 -#define F_PREFIX_256 258 -#define F_PREFIX_512 259 -#define F_PREFIX_768 260 -#define F_PREFIX_1024 261 -#define F_PREFIX_CHARX256 262 -#define F_PREFIX_WORDX256 263 -#define F_PREFIX_24BITX256 264 -#define F_PREFIX2_256 265 -#define F_PREFIX2_512 266 -#define F_PREFIX2_768 267 -#define F_PREFIX2_1024 268 -#define F_PREFIX2_CHARX256 269 -#define F_PREFIX2_WORDX256 270 -#define F_PREFIX2_24BITX256 271 -#define F_POP_VALUE 272 -#define F_POP_N_ELEMS 273 -#define F_MARK 274 -#define F_MARK2 275 -#define F_MARK_X 276 -#define F_POP_MARK 277 -#define F_CALL_LFUN 278 -#define F_CALL_LFUN_AND_POP 279 -#define F_CALL_LFUN_AND_RETURN 280 -#define F_APPLY 281 -#define F_APPLY_AND_POP 282 -#define F_MARK_APPLY 283 -#define F_MARK_APPLY_POP 284 -#define F_APPLY_AND_RETURN 285 -#define F_MARK_AND_STRING 286 -#define F_APPLY_ASSIGN_LOCAL 287 -#define F_APPLY_ASSIGN_LOCAL_AND_POP 288 - -#define F_BRANCH 289 -#define F_BRANCH_WHEN_ZERO 290 -#define F_BRANCH_WHEN_NON_ZERO 291 -#define F_BRANCH_AND_POP_WHEN_ZERO 292 -#define F_BRANCH_AND_POP_WHEN_NON_ZERO 293 -#define F_BRANCH_WHEN_LT 294 -#define F_BRANCH_WHEN_GT 295 -#define F_BRANCH_WHEN_LE 296 -#define F_BRANCH_WHEN_GE 297 -#define F_BRANCH_WHEN_EQ 298 -#define F_BRANCH_WHEN_NE 299 -#define F_BRANCH_IF_LOCAL 300 -#define F_BRANCH_IF_NOT_LOCAL 301 -#define F_BRANCH_IF_NOT_LOCAL_ARROW 302 -#define F_INC_LOOP 303 -#define F_DEC_LOOP 304 -#define F_INC_NEQ_LOOP 305 -#define F_DEC_NEQ_LOOP 306 -#define F_RECUR 307 -#define F_TAIL_RECUR 308 -#define F_COND_RECUR 309 - -#define F_LEXICAL_LOCAL 310 -#define F_LEXICAL_LOCAL_LVALUE 311 - -#define F_INDEX 312 -#define F_ARROW 313 -#define F_INDIRECT 314 -#define F_STRING_INDEX 315 -#define F_LOCAL_INDEX 316 -#define F_LOCAL_LOCAL_INDEX 317 -#define F_LOCAL_ARROW 318 -#define F_GLOBAL_LOCAL_INDEX 319 -#define F_POS_INT_INDEX 320 -#define F_NEG_INT_INDEX 321 -#define F_MAGIC_INDEX 322 -#define F_MAGIC_SET_INDEX 323 -#define F_LTOSVAL 324 -#define F_LTOSVAL2 325 -#define F_PUSH_ARRAY 326 -#define F_RANGE 327 -#define F_COPY_VALUE 328 - -/* - * Basic value pushing - */ -#define F_LFUN 329 -#define F_TRAMPOLINE 330 -#define F_GLOBAL 331 -#define F_GLOBAL_LVALUE 332 -#define F_LOCAL 333 -#define F_2_LOCALS 334 -#define F_LOCAL_LVALUE 335 -#define F_MARK_AND_LOCAL 336 -#define F_EXTERNAL 337 -#define F_EXTERNAL_LVALUE 338 -#define F_CLEAR_LOCAL 339 -#define F_CLEAR_2_LOCAL 340 -#define F_CLEAR_4_LOCAL 341 -#define F_CLEAR_STRING_SUBTYPE 342 -#define F_CONSTANT 343 -#define F_FLOAT 344 -#define F_STRING 345 -#define F_ARROW_STRING 346 -#define F_NUMBER 347 -#define F_NEG_NUMBER 348 -#define F_CONST_1 349 -#define F_CONST0 350 -#define F_CONST1 351 -#define F_BIGNUM 352 -#define F_UNDEFINED 353 +#define OPCODE0(X,Y) X, +#define OPCODE1(X,Y) X, +#define OPCODE2(X,Y) X, +#define OPCODE0_TAIL(X,Y) X, +#define OPCODE1_TAIL(X,Y) X, +#define OPCODE2_TAIL(X,Y) X, +#define OPCODE0_JUMP(X,Y) X, +#define OPCODE1_JUMP(X,Y) X, +#define OPCODE2_JUMP(X,Y) X, +#define OPCODE0_TAILJUMP(X,Y) X, +#define OPCODE1_TAILJUMP(X,Y) X, +#define OPCODE2_TAILJUMP(X,Y) X, + +enum Pike_opcodes +{ + F_OFFSET = 257, + F_PREFIX_256, + F_PREFIX_512, + F_PREFIX_768, + F_PREFIX_1024, + F_PREFIX_CHARX256, + F_PREFIX_WORDX256, + F_PREFIX_24BITX256, + F_PREFIX2_256, + F_PREFIX2_512, + F_PREFIX2_768, + F_PREFIX2_1024, + F_PREFIX2_CHARX256, + F_PREFIX2_WORDX256, + F_PREFIX2_24BITX256, + F_APPLY, + F_APPLY_AND_POP, + F_APPLY_AND_RETURN, + + F_BRANCH_AND_POP_WHEN_ZERO, + F_BRANCH_AND_POP_WHEN_NON_ZERO, + F_BRANCH_WHEN_LT, + F_BRANCH_WHEN_GT, + F_BRANCH_WHEN_LE, + F_BRANCH_WHEN_GE, + F_BRANCH_WHEN_EQ, + F_BRANCH_WHEN_NE, + F_BRANCH_IF_NOT_LOCAL, + F_INC_LOOP, + F_DEC_LOOP, + F_INC_NEQ_LOOP, + F_DEC_NEQ_LOOP, + + F_INDEX, + F_POS_INT_INDEX, + F_NEG_INT_INDEX, /* * These are the predefined functions that can be accessed from Pike. */ -#define F_INC 354 -#define F_DEC 355 -#define F_POST_INC 356 -#define F_POST_DEC 357 -#define F_INC_AND_POP 358 -#define F_DEC_AND_POP 359 -#define F_INC_LOCAL 360 -#define F_INC_LOCAL_AND_POP 361 -#define F_POST_INC_LOCAL 362 -#define F_DEC_LOCAL 363 -#define F_DEC_LOCAL_AND_POP 364 -#define F_POST_DEC_LOCAL 365 -#define F_RETURN 366 -#define F_DUMB_RETURN 367 -#define F_RETURN_0 368 -#define F_RETURN_1 369 -#define F_RETURN_LOCAL 370 -#define F_RETURN_IF_TRUE 371 -#define F_THROW_ZERO 372 - -#define F_ASSIGN 373 -#define F_ASSIGN_AND_POP 374 -#define F_ASSIGN_LOCAL 375 -#define F_ASSIGN_LOCAL_AND_POP 376 -#define F_ASSIGN_GLOBAL 377 -#define F_ASSIGN_GLOBAL_AND_POP 378 -#define F_LOCAL_2_LOCAL 379 -#define F_LOCAL_2_GLOBAL 380 -#define F_GLOBAL_2_LOCAL 381 -#define F_ADD 382 -#define F_SUBTRACT 383 -#define F_ADD_INT 384 -#define F_ADD_NEG_INT 385 -#define F_ADD_TO_AND_POP 386 -#define F_ADD_FLOATS 387 -#define F_ADD_INTS 388 -#define F_MULTIPLY 389 -#define F_DIVIDE 390 -#define F_MOD 391 - -#define F_LT 392 -#define F_GT 393 -#define F_EQ 394 -#define F_GE 395 -#define F_LE 396 -#define F_NE 397 -#define F_NEGATE 398 -#define F_NOT 399 -#define F_COMPL 400 -#define F_AND 401 -#define F_OR 402 -#define F_XOR 403 -#define F_LSH 404 -#define F_RSH 405 -#define F_LAND 406 -#define F_LOR 407 -#define F_EQ_OR 408 -#define F_EQ_AND 409 - -#define F_SWITCH 410 -#define F_SSCANF 411 -#define F_CATCH 412 -#define F_CAST 413 -#define F_SOFT_CAST 414 -#define F_FOREACH 415 - -#define F_SIZEOF 416 -#define F_SIZEOF_LOCAL 417 -#define F_CALL_FUNCTION 418 -#define F_CALL_FUNCTION_AND_RETURN 419 - + F_RETURN, + F_DUMB_RETURN, + F_RETURN_0, + F_RETURN_1, + F_RETURN_LOCAL, + F_RETURN_IF_TRUE, + + F_LT, + F_GT, + F_EQ, + F_GE, + F_LE, + F_NE, + F_LAND, + F_LOR, + F_EQ_OR, + F_EQ_AND, + + F_CATCH, + F_FOREACH, + + F_CALL_FUNCTION, + F_CALL_FUNCTION_AND_RETURN, + +#include "interpret_protos.h" /* * These are token values that needn't have an associated code for the * compiled file */ -#define F_MAX_OPCODE 420 - -#define F_ADD_EQ 422 -#define F_AND_EQ 423 -#define F_ARG_LIST 424 -#define F_COMMA_EXPR 425 -#define F_BREAK 427 -#define F_CASE 428 -#define F_CONTINUE 432 -#define F_DEFAULT 433 -#define F_DIV_EQ 434 -#define F_DO 435 -#define F_EFUN_CALL 439 -#define F_FOR 443 -#define F_IDENTIFIER 446 -#define F_LSH_EQ 458 -#define F_LVALUE_LIST 459 -#define F_ARRAY_LVALUE 460 -#define F_MOD_EQ 463 -#define F_MULT_EQ 464 -#define F_OR_EQ 467 -#define F_RSH_EQ 473 -#define F_SUB_EQ 478 -#define F_VAL_LVAL 480 -#define F_XOR_EQ 483 -#define F_NOP 484 - -#define F_ALIGN 486 -#define F_POINTER 487 -#define F_LABEL 488 -#define F_DATA 489 -#define F_START_FUNCTION 490 -#define F_BYTE 491 - -#define F_NOTREACHED 492 - -#define F_MAX_INSTR 493 + F_MAX_OPCODE, + + F_ADD_EQ, + F_AND_EQ, + F_ARG_LIST, + F_COMMA_EXPR, + F_BREAK, + F_CASE, + F_CONTINUE, + F_DEFAULT, + F_DIV_EQ, + F_DO, + F_EFUN_CALL, + F_FOR, + F_IDENTIFIER, + F_LSH_EQ, + F_LVALUE_LIST, + F_MOD_EQ, + F_MULT_EQ, + F_OR_EQ, + F_RSH_EQ, + F_SUB_EQ, + F_VAL_LVAL, + F_XOR_EQ, + F_NOP, + + F_ALIGN, + F_POINTER, + F_LABEL, + F_DATA, + F_START_FUNCTION, + F_BYTE, + F_NOTREACHED, + F_MAX_INSTR +}; + +#undef OPCODE0 +#undef OPCODE1 +#undef OPCODE2 +#undef OPCODE0_TAIL +#undef OPCODE1_TAIL +#undef OPCODE2_TAIL +#undef OPCODE0_JUMP +#undef OPCODE1_JUMP +#undef OPCODE2_JUMP +#undef OPCODE0_TAILJUMP +#undef OPCODE1_TAILJUMP +#undef OPCODE2_TAILJUMP + /* Prototypes begin here */ void index_no_free(struct svalue *to,struct svalue *what,struct svalue *ind); diff --git a/src/peep.in b/src/peep.in index 2cc10eb315f623771c4bbf88b50c9593db199bc1..6572285fb0595e639c5beaa6d1e92517f39f1d5f 100644 --- a/src/peep.in +++ b/src/peep.in @@ -1,5 +1,5 @@ // -// $Id: peep.in,v 1.42 2000/12/01 01:13:46 hubbe Exp $ +// $Id: peep.in,v 1.43 2000/12/01 03:19:01 hubbe Exp $ // NOP : @@ -149,6 +149,8 @@ MARK LOCAL [ $3o != F_SIZEOF && $3o != F_INDEX ]: MARK_AND_LOCAL ($2a) MARK STRING : MARK_AND_STRING($2a) LOCAL SIZEOF: SIZEOF_LOCAL ($1a) STRING INDEX: STRING_INDEX ($1a) +INDEX SWITCH: SWITCH_ON_INDEX($2a) +LOCAL SWITCH: SWITCH_ON_LOCAL($1a,$2a) STRING CLEAR_STRING_SUBTYPE: STRING ($1a) CONST0 CLEAR_STRING_SUBTYPE: CONST0