diff options
| author | Waldemar Celes <celes@tecgraf.puc-rio.br> | 1993-12-17 16:41:19 -0200 |
|---|---|---|
| committer | Waldemar Celes <celes@tecgraf.puc-rio.br> | 1993-12-17 16:41:19 -0200 |
| commit | 64097041c48070deb2e9d88c55efb41ba77cdd9b (patch) | |
| tree | 45f4d62fdb4c42a0020c233010304e5bd3468606 | |
| parent | 75ed5043820e07eeb6405e42ac3c9cbad990466d (diff) | |
| download | lua-64097041c48070deb2e9d88c55efb41ba77cdd9b.tar.gz lua-64097041c48070deb2e9d88c55efb41ba77cdd9b.tar.bz2 lua-64097041c48070deb2e9d88c55efb41ba77cdd9b.zip | |
LUA intermediate code interpreter
Diffstat (limited to '')
| -rw-r--r-- | opcode.c | 41 | ||||
| -rw-r--r-- | opcode.h | 5 |
2 files changed, 42 insertions, 4 deletions
| @@ -1,9 +1,10 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** opcode.c | 2 | ** opcode.c |
| 3 | ** TecCGraf - PUC-Rio | 3 | ** TecCGraf - PUC-Rio |
| 4 | ** 26 Apr 93 | ||
| 5 | */ | 4 | */ |
| 6 | 5 | ||
| 6 | char *rcs_opcode="$Id: $"; | ||
| 7 | |||
| 7 | #include <stdio.h> | 8 | #include <stdio.h> |
| 8 | #include <stdlib.h> | 9 | #include <stdlib.h> |
| 9 | #include <string.h> | 10 | #include <string.h> |
| @@ -137,6 +138,8 @@ static int lua_tostring (Object *obj) | |||
| 137 | */ | 138 | */ |
| 138 | int lua_execute (Byte *pc) | 139 | int lua_execute (Byte *pc) |
| 139 | { | 140 | { |
| 141 | Object *oldbase = base; | ||
| 142 | base = top; | ||
| 140 | while (1) | 143 | while (1) |
| 141 | { | 144 | { |
| 142 | switch ((OpCode)*pc++) | 145 | switch ((OpCode)*pc++) |
| @@ -252,7 +255,7 @@ int lua_execute (Byte *pc) | |||
| 252 | case STOREFIELD: | 255 | case STOREFIELD: |
| 253 | if (tag(top-3) != T_ARRAY) | 256 | if (tag(top-3) != T_ARRAY) |
| 254 | { | 257 | { |
| 255 | lua_error ("internal error - table expected"); | 258 | lua_reportbug ("internal error - table expected"); |
| 256 | return 1; | 259 | return 1; |
| 257 | } | 260 | } |
| 258 | *(lua_hashdefine (avalue(top-3), top-2)) = *(top-1); | 261 | *(lua_hashdefine (avalue(top-3), top-2)) = *(top-1); |
| @@ -516,6 +519,7 @@ int lua_execute (Byte *pc) | |||
| 516 | break; | 519 | break; |
| 517 | 520 | ||
| 518 | case HALT: | 521 | case HALT: |
| 522 | base = oldbase; | ||
| 519 | return 0; /* success */ | 523 | return 0; /* success */ |
| 520 | 524 | ||
| 521 | case SETFUNCTION: | 525 | case SETFUNCTION: |
| @@ -577,6 +581,7 @@ int lua_dostring (char *string) | |||
| 577 | { | 581 | { |
| 578 | if (lua_openstring (string)) return 1; | 582 | if (lua_openstring (string)) return 1; |
| 579 | if (lua_parse ()) return 1; | 583 | if (lua_parse ()) return 1; |
| 584 | lua_closestring(); | ||
| 580 | return 0; | 585 | return 0; |
| 581 | } | 586 | } |
| 582 | 587 | ||
| @@ -612,6 +617,7 @@ Object *lua_getparam (int number) | |||
| 612 | */ | 617 | */ |
| 613 | real lua_getnumber (Object *object) | 618 | real lua_getnumber (Object *object) |
| 614 | { | 619 | { |
| 620 | if (object == NULL || tag(object) == T_NIL) return 0.0; | ||
| 615 | if (tonumber (object)) return 0.0; | 621 | if (tonumber (object)) return 0.0; |
| 616 | else return (nvalue(object)); | 622 | else return (nvalue(object)); |
| 617 | } | 623 | } |
| @@ -621,6 +627,7 @@ real lua_getnumber (Object *object) | |||
| 621 | */ | 627 | */ |
| 622 | char *lua_getstring (Object *object) | 628 | char *lua_getstring (Object *object) |
| 623 | { | 629 | { |
| 630 | if (object == NULL || tag(object) == T_NIL) return NULL; | ||
| 624 | if (tostring (object)) return NULL; | 631 | if (tostring (object)) return NULL; |
| 625 | else return (svalue(object)); | 632 | else return (svalue(object)); |
| 626 | } | 633 | } |
| @@ -630,6 +637,7 @@ char *lua_getstring (Object *object) | |||
| 630 | */ | 637 | */ |
| 631 | char *lua_copystring (Object *object) | 638 | char *lua_copystring (Object *object) |
| 632 | { | 639 | { |
| 640 | if (object == NULL || tag(object) == T_NIL) return NULL; | ||
| 633 | if (tostring (object)) return NULL; | 641 | if (tostring (object)) return NULL; |
| 634 | else return (strdup(svalue(object))); | 642 | else return (strdup(svalue(object))); |
| 635 | } | 643 | } |
| @@ -639,6 +647,7 @@ char *lua_copystring (Object *object) | |||
| 639 | */ | 647 | */ |
| 640 | lua_CFunction lua_getcfunction (Object *object) | 648 | lua_CFunction lua_getcfunction (Object *object) |
| 641 | { | 649 | { |
| 650 | if (object == NULL) return NULL; | ||
| 642 | if (tag(object) != T_CFUNCTION) return NULL; | 651 | if (tag(object) != T_CFUNCTION) return NULL; |
| 643 | else return (fvalue(object)); | 652 | else return (fvalue(object)); |
| 644 | } | 653 | } |
| @@ -648,6 +657,7 @@ lua_CFunction lua_getcfunction (Object *object) | |||
| 648 | */ | 657 | */ |
| 649 | void *lua_getuserdata (Object *object) | 658 | void *lua_getuserdata (Object *object) |
| 650 | { | 659 | { |
| 660 | if (object == NULL) return NULL; | ||
| 651 | if (tag(object) != T_USERDATA) return NULL; | 661 | if (tag(object) != T_USERDATA) return NULL; |
| 652 | else return (uvalue(object)); | 662 | else return (uvalue(object)); |
| 653 | } | 663 | } |
| @@ -658,6 +668,7 @@ void *lua_getuserdata (Object *object) | |||
| 658 | */ | 668 | */ |
| 659 | Object *lua_getfield (Object *object, char *field) | 669 | Object *lua_getfield (Object *object, char *field) |
| 660 | { | 670 | { |
| 671 | if (object == NULL) return NULL; | ||
| 661 | if (tag(object) != T_ARRAY) | 672 | if (tag(object) != T_ARRAY) |
| 662 | return NULL; | 673 | return NULL; |
| 663 | else | 674 | else |
| @@ -675,6 +686,7 @@ Object *lua_getfield (Object *object, char *field) | |||
| 675 | */ | 686 | */ |
| 676 | Object *lua_getindexed (Object *object, float index) | 687 | Object *lua_getindexed (Object *object, float index) |
| 677 | { | 688 | { |
| 689 | if (object == NULL) return NULL; | ||
| 678 | if (tag(object) != T_ARRAY) | 690 | if (tag(object) != T_ARRAY) |
| 679 | return NULL; | 691 | return NULL; |
| 680 | else | 692 | else |
| @@ -931,3 +943,28 @@ void lua_print (void) | |||
| 931 | } | 943 | } |
| 932 | } | 944 | } |
| 933 | 945 | ||
| 946 | /* | ||
| 947 | ** Internal function: do a file | ||
| 948 | */ | ||
| 949 | void lua_internaldofile (void) | ||
| 950 | { | ||
| 951 | lua_Object obj = lua_getparam (1); | ||
| 952 | if (lua_isstring(obj) && !lua_dofile(lua_getstring(obj))) | ||
| 953 | lua_pushnumber(1); | ||
| 954 | else | ||
| 955 | lua_pushnil(); | ||
| 956 | } | ||
| 957 | |||
| 958 | /* | ||
| 959 | ** Internal function: do a string | ||
| 960 | */ | ||
| 961 | void lua_internaldostring (void) | ||
| 962 | { | ||
| 963 | lua_Object obj = lua_getparam (1); | ||
| 964 | if (lua_isstring(obj) && !lua_dostring(lua_getstring(obj))) | ||
| 965 | lua_pushnumber(1); | ||
| 966 | else | ||
| 967 | lua_pushnil(); | ||
| 968 | } | ||
| 969 | |||
| 970 | |||
| @@ -1,7 +1,6 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** opcode.h | ||
| 3 | ** TeCGraf - PUC-Rio | 2 | ** TeCGraf - PUC-Rio |
| 4 | ** 16 Apr 92 | 3 | ** $Id: $ |
| 5 | */ | 4 | */ |
| 6 | 5 | ||
| 7 | #ifndef opcode_h | 6 | #ifndef opcode_h |
| @@ -140,5 +139,7 @@ int lua_parse (void); /* from "lua.stx" module */ | |||
| 140 | void lua_type (void); | 139 | void lua_type (void); |
| 141 | void lua_obj2number (void); | 140 | void lua_obj2number (void); |
| 142 | void lua_print (void); | 141 | void lua_print (void); |
| 142 | void lua_internaldofile (void); | ||
| 143 | void lua_internaldostring (void); | ||
| 143 | 144 | ||
| 144 | #endif | 145 | #endif |
