diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1999-05-06 11:41:41 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1999-05-06 11:41:41 -0300 |
| commit | 288fa056020f20647c6db3e721498b96d8c62713 (patch) | |
| tree | c063b3464a1e15580e6a0cbb06b53436ce4afe19 | |
| parent | 7808ea3a5ffe8c2045dc76099f8968e3b8104360 (diff) | |
| download | lua-288fa056020f20647c6db3e721498b96d8c62713.tar.gz lua-288fa056020f20647c6db3e721498b96d8c62713.tar.bz2 lua-288fa056020f20647c6db3e721498b96d8c62713.zip | |
opcodes with LONGARG do not use byte variants.
| -rw-r--r-- | lparser.c | 23 |
1 files changed, 12 insertions, 11 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lparser.c,v 1.30 1999/03/23 19:58:37 roberto Exp roberto $ | 2 | ** $Id: lparser.c,v 1.31 1999/03/25 21:06:57 roberto Exp roberto $ |
| 3 | ** LL(1) Parser and code generator for Lua | 3 | ** LL(1) Parser and code generator for Lua |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -159,24 +159,25 @@ static void code_oparg_at (LexState *ls, int pc, OpCode op, | |||
| 159 | code[pc] = (Byte)op; | 159 | code[pc] = (Byte)op; |
| 160 | code[pc+1] = (Byte)arg; | 160 | code[pc+1] = (Byte)arg; |
| 161 | } | 161 | } |
| 162 | else if (arg <= MAX_WORD) { | 162 | else if (arg > MAX_ARG) |
| 163 | luaX_error(ls, "code too long"); | ||
| 164 | else { /* MAX_BYTE < arg < MAX_ARG */ | ||
| 165 | if (arg > MAX_WORD) { | ||
| 166 | code[pc] = (Byte)LONGARG; | ||
| 167 | code[pc+1] = (Byte)(arg>>16); | ||
| 168 | pc += 2; | ||
| 169 | } | ||
| 163 | code[pc] = (Byte)(op-1); /* opcode for word argument */ | 170 | code[pc] = (Byte)(op-1); /* opcode for word argument */ |
| 164 | code[pc+1] = (Byte)(arg>>8); | 171 | code[pc+1] = (Byte)((arg&0xFFFF)>>8); |
| 165 | code[pc+2] = (Byte)(arg&0xFF); | 172 | code[pc+2] = (Byte)(arg&0xFF); |
| 166 | } | 173 | } |
| 167 | else if (arg <= MAX_ARG) { | ||
| 168 | code[pc] = (Byte)LONGARG; | ||
| 169 | code[pc+1] = (Byte)(arg>>16); | ||
| 170 | code_oparg_at(ls, pc+2, op, arg&0xFFFF, 0); | ||
| 171 | } | ||
| 172 | else luaX_error(ls, "code too long"); | ||
| 173 | } | 174 | } |
| 174 | 175 | ||
| 175 | 176 | ||
| 176 | static int codesize (int arg) { | 177 | static int codesize (int arg) { |
| 177 | if (arg <= MAX_BYTE) return 2; /* opcode + 1 byte */ | 178 | if (arg <= MAX_BYTE) return 2; /* opcode + 1 byte */ |
| 178 | else if (arg <= MAX_WORD) return 3; /* opcode + 1 word */ | 179 | else if (arg <= MAX_WORD) return 3; /* opcode + 1 word (2 bytes) */ |
| 179 | else return 2+codesize(arg&0xFFFF); /* LONGARG + 1 byte + original opcode */ | 180 | else return 5; /* LONGARG + 1 byte + opcode + 1 word (2 bytes) */ |
| 180 | } | 181 | } |
| 181 | 182 | ||
| 182 | 183 | ||
