better support for OP_INCOBJECT

This commit is contained in:
CPunch 2020-11-20 14:50:43 -06:00
parent 46b99ab390
commit 85e7deae7b
2 changed files with 13 additions and 4 deletions

View File

@ -42,7 +42,7 @@
#define cosmoM_freezeGC(state) \
state->freezeGC++
#define cosmoM_unfreezeGC(state) \
#define cosmoM_unfreezeGC(state) \
state->freezeGC--; \
cosmoM_checkGarbage(state, 0)

View File

@ -644,13 +644,22 @@ static void increment(CParseState *pstate, int val) {
CToken name = pstate->previous;
if (match(pstate, TOKEN_DOT)) { // object?
namedVariable(pstate, name, false, false); // just get the object
consume(pstate, TOKEN_IDENTIFIER, "Expected property name after '.'.");
uint16_t name = identifierConstant(pstate, &pstate->previous);
uint16_t ident = identifierConstant(pstate, &pstate->previous);
while (match(pstate, TOKEN_DOT)) {
// grab the field from the object
writeu8(pstate, OP_LOADCONST); // pushes ident to stack
writeu16(pstate, ident);
writeu8(pstate, OP_GETOBJECT);
consume(pstate, TOKEN_IDENTIFIER, "Expected property name after '.'.");
ident = identifierConstant(pstate, &pstate->previous);
}
writeu8(pstate, OP_INCOBJECT);
writeu8(pstate, 128 + val); // setting signed values in an unsigned int
writeu16(pstate, name);
writeu16(pstate, ident);
valuePopped(pstate, 1); // popped the object off the stack
} else {
uint8_t op;