** Emit SELF instruction or equivalent: the code will convert ** expression 'e' into 'e.key(e,'. */
| 1319 | ** expression 'e' into 'e.key(e,'. |
| 1320 | */ |
| 1321 | void luaK_self (FuncState *fs, expdesc *e, expdesc *key) { |
| 1322 | int ereg, base; |
| 1323 | luaK_exp2anyreg(fs, e); |
| 1324 | ereg = e->u.info; /* register where 'e' (the receiver) was placed */ |
| 1325 | freeexp(fs, e); |
| 1326 | base = e->u.info = fs->freereg; /* base register for op_self */ |
| 1327 | e->k = VNONRELOC; /* self expression has a fixed register */ |
| 1328 | luaK_reserveregs(fs, 2); /* method and 'self' produced by op_self */ |
| 1329 | lua_assert(key->k == VKSTR); |
| 1330 | /* is method name a short string in a valid K index? */ |
| 1331 | if (strisshr(key->u.strval) && luaK_exp2K(fs, key)) { |
| 1332 | /* can use 'self' opcode */ |
| 1333 | luaK_codeABCk(fs, OP_SELF, base, ereg, key->u.info, 0); |
| 1334 | } |
| 1335 | else { /* cannot use 'self' opcode; use move+gettable */ |
| 1336 | luaK_exp2anyreg(fs, key); /* put method name in a register */ |
| 1337 | luaK_codeABC(fs, OP_MOVE, base + 1, ereg, 0); /* copy self to base+1 */ |
| 1338 | luaK_codeABC(fs, OP_GETTABLE, base, ereg, key->u.info); /* get method */ |
| 1339 | } |
| 1340 | freeexp(fs, key); |
| 1341 | } |
| 1342 | |
| 1343 | |
| 1344 | /* auxiliary function to define indexing expressions */ |
no test coverage detected