aboutsummaryrefslogtreecommitdiff
path: root/lvm.c
diff options
context:
space:
mode:
Diffstat (limited to 'lvm.c')
-rw-r--r--lvm.c126
1 files changed, 73 insertions, 53 deletions
diff --git a/lvm.c b/lvm.c
index 50213247..90237f14 100644
--- a/lvm.c
+++ b/lvm.c
@@ -1,5 +1,5 @@
1/* 1/*
2** $Id: lvm.c,v 1.2 1997/09/19 18:40:32 roberto Exp roberto $ 2** $Id: lvm.c,v 1.3 1997/09/19 21:17:52 roberto Exp roberto $
3** Lua virtual machine 3** Lua virtual machine
4** See Copyright Notice in lua.h 4** See Copyright Notice in lua.h
5*/ 5*/
@@ -28,7 +28,7 @@
28 28
29 29
30/* Extra stack to run a function: LUA_T_LINE(1), TM calls(2), ... */ 30/* Extra stack to run a function: LUA_T_LINE(1), TM calls(2), ... */
31#define EXTRA_STACK 4 31#define EXTRA_STACK 5
32 32
33 33
34 34
@@ -276,14 +276,14 @@ static void adjust_varargs (StkId first_extra_arg)
276*/ 276*/
277StkId luaV_execute (Closure *cl, StkId base) 277StkId luaV_execute (Closure *cl, StkId base)
278{ 278{
279 TProtoFunc *func = cl->consts[0].value.tf; 279 Byte *pc = cl->consts[0].value.tf->code;
280 Byte *pc = func->code; 280 TObject *consts = cl->consts[0].value.tf->consts;
281 if (lua_callhook) 281 if (lua_callhook)
282 luaD_callHook(base, LUA_T_MARK, 0); 282 luaD_callHook(base, LUA_T_MARK, 0);
283 luaD_checkstack((*pc++)+EXTRA_STACK); 283 luaD_checkstack((*pc++)+EXTRA_STACK);
284 while (1) { 284 while (1) {
285 OpCode opcode; 285 int aux;
286 switch (opcode = (OpCode)*pc++) { 286 switch ((OpCode)(aux = *pc++)) {
287 287
288 case PUSHNIL: 288 case PUSHNIL:
289 ttype(luaD_stack.top++) = LUA_T_NIL; 289 ttype(luaD_stack.top++) = LUA_T_NIL;
@@ -296,89 +296,95 @@ StkId luaV_execute (Closure *cl, StkId base)
296 break; 296 break;
297 } 297 }
298 298
299 case PUSH0: case PUSH1: case PUSH2:
300 ttype(luaD_stack.top) = LUA_T_NUMBER;
301 nvalue(luaD_stack.top) = opcode-PUSH0;
302 luaD_stack.top++;
303 break;
304
305 case PUSHBYTE: 299 case PUSHBYTE:
306 ttype(luaD_stack.top) = LUA_T_NUMBER; 300 aux = *pc++; goto pushnumber;
307 nvalue(luaD_stack.top) = *pc++;
308 luaD_stack.top++;
309 break;
310 301
311 case PUSHWORD: 302 case PUSHWORD:
303 aux = get_word(pc); goto pushnumber;
304
305 case PUSH0: case PUSH1: case PUSH2:
306 aux -= PUSH0;
307 pushnumber:
312 ttype(luaD_stack.top) = LUA_T_NUMBER; 308 ttype(luaD_stack.top) = LUA_T_NUMBER;
313 nvalue(luaD_stack.top) = get_word(pc); 309 nvalue(luaD_stack.top) = aux;
314 luaD_stack.top++; 310 luaD_stack.top++;
315 break; 311 break;
316 312
313 case PUSHLOCAL:
314 aux = *pc++; goto pushlocal;
315
317 case PUSHLOCAL0: case PUSHLOCAL1: case PUSHLOCAL2: 316 case PUSHLOCAL0: case PUSHLOCAL1: case PUSHLOCAL2:
318 case PUSHLOCAL3: case PUSHLOCAL4: case PUSHLOCAL5: 317 case PUSHLOCAL3: case PUSHLOCAL4: case PUSHLOCAL5:
319 case PUSHLOCAL6: case PUSHLOCAL7: case PUSHLOCAL8: 318 case PUSHLOCAL6: case PUSHLOCAL7: case PUSHLOCAL8:
320 case PUSHLOCAL9: 319 case PUSHLOCAL9:
321 *luaD_stack.top++ = 320 aux -= PUSHLOCAL0;
322 *((luaD_stack.stack+base) + (int)(opcode-PUSHLOCAL0)); 321 pushlocal:
323 break; 322 *luaD_stack.top++ = *((luaD_stack.stack+base) + aux);
324
325 case PUSHLOCAL:
326 *luaD_stack.top++ = *((luaD_stack.stack+base) + (*pc++));
327 break; 323 break;
328 324
329 case PUSHGLOBALB: 325 case GETGLOBAL:
330 luaV_getglobal(luaG_findsymbol(tsvalue(&func->consts[*pc++]))); 326 aux = get_word(pc); goto getglobal;
331 break;
332 327
333 case PUSHGLOBAL: 328 case GETGLOBALB:
334 luaV_getglobal(luaG_findsymbol(tsvalue(&func->consts[get_word(pc)]))); 329 aux = *pc++;
330 getglobal:
331 luaV_getglobal(luaG_findsymbol(tsvalue(&consts[aux])));
335 break; 332 break;
336 333
337 case GETTABLE: 334 case GETTABLE:
338 luaV_gettable(); 335 luaV_gettable();
339 break; 336 break;
340 337
341 case PUSHSELF: { 338 case PUSHSELF:
339 aux = get_word(pc); goto pushself;
340
341 case PUSHSELFB:
342 aux = *pc++;
343 pushself: {
342 TObject receiver = *(luaD_stack.top-1); 344 TObject receiver = *(luaD_stack.top-1);
343 *luaD_stack.top++ = func->consts[get_word(pc)]; 345 *luaD_stack.top++ = consts[aux];
344 luaV_gettable(); 346 luaV_gettable();
345 *luaD_stack.top++ = receiver; 347 *luaD_stack.top++ = receiver;
346 break; 348 break;
347 } 349 }
348 350
351 case PUSHCONSTANT:
352 aux = get_word(pc); goto pushconstant;
353
349 case PUSHCONSTANTB: 354 case PUSHCONSTANTB:
350 *luaD_stack.top++ = func->consts[*pc++]; 355 aux = *pc++;
356 pushconstant:
357 *luaD_stack.top++ = consts[aux];
351 break; 358 break;
352 359
353 case PUSHCONSTANT: 360 case PUSHUPVALUE:
354 *luaD_stack.top++ = func->consts[get_word(pc)]; 361 aux = *pc++; goto pushupvalue;
355 break;
356 362
357 case PUSHUPVALUE0: 363 case PUSHUPVALUE0:
358 *luaD_stack.top++ = cl->consts[1]; 364 aux = 0;
365 pushupvalue:
366 *luaD_stack.top++ = cl->consts[aux+1];
359 break; 367 break;
360 368
361 case PUSHUPVALUE: 369 case SETLOCAL:
362 *luaD_stack.top++ = cl->consts[(*pc++)+1]; 370 aux = *pc++; goto setlocal;
363 break;
364 371
365 case SETLOCAL0: case SETLOCAL1: case SETLOCAL2: 372 case SETLOCAL0: case SETLOCAL1: case SETLOCAL2:
366 case SETLOCAL3: case SETLOCAL4: case SETLOCAL5: 373 case SETLOCAL3: case SETLOCAL4: case SETLOCAL5:
367 case SETLOCAL6: case SETLOCAL7: case SETLOCAL8: 374 case SETLOCAL6: case SETLOCAL7: case SETLOCAL8:
368 case SETLOCAL9: 375 case SETLOCAL9:
369 *((luaD_stack.stack+base) + (int)(opcode-SETLOCAL0)) = 376 aux -= SETLOCAL0;
370 *(--luaD_stack.top); 377 setlocal:
378 *((luaD_stack.stack+base) + aux) = *(--luaD_stack.top);
371 break; 379 break;
372 380
373 case SETLOCAL: 381 case SETGLOBAL:
374 *((luaD_stack.stack+base) + (*pc++)) = *(--luaD_stack.top); break; 382 aux = get_word(pc); goto setglobal;
375 383
376 case SETGLOBALB: 384 case SETGLOBALB:
377 luaV_setglobal(luaG_findsymbol(tsvalue(&func->consts[*pc++]))); 385 aux = *pc++;
378 break; 386 setglobal:
379 387 luaV_setglobal(luaG_findsymbol(tsvalue(&consts[aux])));
380 case SETGLOBAL:
381 luaV_setglobal(luaG_findsymbol(tsvalue(&func->consts[get_word(pc)])));
382 break; 388 break;
383 389
384 case SETTABLE0: 390 case SETTABLE0:
@@ -389,14 +395,17 @@ StkId luaV_execute (Closure *cl, StkId base)
389 luaV_settable(luaD_stack.top-3-(*pc++), 2); 395 luaV_settable(luaD_stack.top-3-(*pc++), 2);
390 break; 396 break;
391 397
398 case SETLIST:
399 aux = *(pc++) * LFIELDS_PER_FLUSH; goto setlist;
400
392 case SETLIST0: 401 case SETLIST0:
393 case SETLIST: { 402 aux = 0;
394 int m = (opcode == SETLIST0) ? 0 : *(pc++) * LFIELDS_PER_FLUSH; 403 setlist: {
395 int n = *(pc++); 404 int n = *(pc++);
396 TObject *arr = luaD_stack.top-n-1; 405 TObject *arr = luaD_stack.top-n-1;
397 for (; n; n--) { 406 for (; n; n--) {
398 ttype(luaD_stack.top) = LUA_T_NUMBER; 407 ttype(luaD_stack.top) = LUA_T_NUMBER;
399 nvalue(luaD_stack.top) = n+m; 408 nvalue(luaD_stack.top) = n+aux;
400 *(luaH_set (avalue(arr), luaD_stack.top)) = *(luaD_stack.top-1); 409 *(luaH_set (avalue(arr), luaD_stack.top)) = *(luaD_stack.top-1);
401 luaD_stack.top--; 410 luaD_stack.top--;
402 } 411 }
@@ -414,7 +423,12 @@ StkId luaV_execute (Closure *cl, StkId base)
414 } 423 }
415 424
416 case POPS: 425 case POPS:
417 luaD_stack.top -= *(pc++); 426 aux = *pc++; goto pop;
427
428 case POP1: case POP2:
429 aux -= (POP1-1);
430 pop:
431 luaD_stack.top -= aux;
418 break; 432 break;
419 433
420 case ARGS: 434 case ARGS:
@@ -436,7 +450,7 @@ StkId luaV_execute (Closure *cl, StkId base)
436 case EQOP: case NEQOP: { 450 case EQOP: case NEQOP: {
437 int res = luaO_equalObj(luaD_stack.top-2, luaD_stack.top-1); 451 int res = luaO_equalObj(luaD_stack.top-2, luaD_stack.top-1);
438 luaD_stack.top--; 452 luaD_stack.top--;
439 if (opcode == NEQOP) res = !res; 453 if (aux == NEQOP) res = !res;
440 ttype(luaD_stack.top-1) = res ? LUA_T_NUMBER : LUA_T_NIL; 454 ttype(luaD_stack.top-1) = res ? LUA_T_NUMBER : LUA_T_NIL;
441 nvalue(luaD_stack.top-1) = 1; 455 nvalue(luaD_stack.top-1) = 1;
442 break; 456 break;
@@ -578,6 +592,12 @@ StkId luaV_execute (Closure *cl, StkId base)
578 break; 592 break;
579 593
580 case CLOSURE: 594 case CLOSURE:
595 aux = get_word(pc); goto closure;
596
597 case CLOSUREB:
598 aux = *pc++;
599 closure:
600 *luaD_stack.top++ = consts[aux];
581 luaV_closure(); 601 luaV_closure();
582 luaC_checkGC(); 602 luaC_checkGC();
583 break; 603 break;
@@ -594,7 +614,7 @@ StkId luaV_execute (Closure *cl, StkId base)
594 case RETCODE: 614 case RETCODE:
595 if (lua_callhook) 615 if (lua_callhook)
596 luaD_callHook(base, LUA_T_MARK, 1); 616 luaD_callHook(base, LUA_T_MARK, 1);
597 return (base + ((opcode==RETCODE) ? *pc : 0)); 617 return (base + ((aux==RETCODE) ? *pc : 0));
598 618
599 case SETLINE: { 619 case SETLINE: {
600 int line = get_word(pc); 620 int line = get_word(pc);