This is really getting hard

This commit is contained in:
2022-09-03 11:58:36 +10:00
parent 6c151e21b0
commit d2aacea8c5
2 changed files with 34 additions and 16 deletions

View File

@@ -82,8 +82,18 @@ int _set(Interpreter* interpreter, LiteralArray* arguments) {
} }
parseIdentifierToValue(interpreter, &obj); parseIdentifierToValue(interpreter, &obj);
parseIdentifierToValue(interpreter, &key);
parseIdentifierToValue(interpreter, &val); bool freeKey = false;
if (IS_IDENTIFIER(key)) {
parseIdentifierToValue(interpreter, &key);
freeKey = true;
}
bool freeVal = false;
if (IS_IDENTIFIER(val)) {
parseIdentifierToValue(interpreter, &val);
freeVal = true;
}
switch(obj.type) { switch(obj.type) {
case LITERAL_ARRAY: { case LITERAL_ARRAY: {
@@ -118,11 +128,7 @@ int _set(Interpreter* interpreter, LiteralArray* arguments) {
return -1; return -1;
} }
freeLiteral(obj); break;
freeLiteral(key);
freeLiteral(val);
return 0;
} }
case LITERAL_DICTIONARY: { case LITERAL_DICTIONARY: {
@@ -152,11 +158,7 @@ int _set(Interpreter* interpreter, LiteralArray* arguments) {
return -1; return -1;
} }
freeLiteral(obj); break;
freeLiteral(key);
freeLiteral(val);
return 0;
} }
default: default:
@@ -164,6 +166,18 @@ int _set(Interpreter* interpreter, LiteralArray* arguments) {
printLiteral(obj); printLiteral(obj);
return -1; return -1;
} }
freeLiteral(obj);
if (freeKey) {
freeLiteral(key);
}
if (freeVal) {
freeLiteral(val);
}
return 0;
} }
int _get(Interpreter* interpreter, LiteralArray* arguments) { int _get(Interpreter* interpreter, LiteralArray* arguments) {
@@ -1382,14 +1396,17 @@ static bool execFnCall(Interpreter* interpreter) {
return false; return false;
} }
if (!setScopeVariable(inner.scope, paramArray->literals[i], popLiteralArray(&arguments), false)) { Literal arg = popLiteralArray(&arguments);
if (!setScopeVariable(inner.scope, paramArray->literals[i], arg, false)) {
printf(ERROR "[internal] Could not define parameter (bad type?)\n" RESET); printf(ERROR "[internal] Could not define parameter (bad type?)\n" RESET);
//free, and skip out //free, and skip out
freeLiteral(arg);
freeLiteralArray(&arguments); freeLiteralArray(&arguments);
popScope(inner.scope); popScope(inner.scope);
freeInterpreter(&inner); freeInterpreter(&inner);
return false; return false;
} }
freeLiteral(arg);
} }
//if using rest, pack the optional extra arguments into the rest parameter (array) //if using rest, pack the optional extra arguments into the rest parameter (array)
@@ -1419,11 +1436,12 @@ static bool execFnCall(Interpreter* interpreter) {
return false; return false;
} }
if (!setScopeVariable(inner.scope, restParam, TO_ARRAY_LITERAL(&rest), false)) { Literal lit = TO_ARRAY_LITERAL(&rest);
if (!setScopeVariable(inner.scope, restParam, lit, false)) {
printf(ERROR "[internal] Could not define rest parameter\n" RESET); printf(ERROR "[internal] Could not define rest parameter\n" RESET);
//free, and skip out //free, and skip out
freeLiteral(restType); freeLiteral(restType);
freeLiteralArray(&rest); freeLiteral(lit);
freeLiteralArray(&arguments); freeLiteralArray(&arguments);
popScope(inner.scope); popScope(inner.scope);
freeInterpreter(&inner); freeInterpreter(&inner);
@@ -1431,6 +1449,7 @@ static bool execFnCall(Interpreter* interpreter) {
} }
freeLiteral(restType); freeLiteral(restType);
freeLiteral(lit);
} }
//execute the interpreter //execute the interpreter

View File

@@ -1177,7 +1177,6 @@ static void expressionStmt(Parser* parser, Node** nodeHandle) {
return; return;
} }
//BUGFIX: statements assume the node exists, expressions assume it doens't
Node* ptr = NULL; Node* ptr = NULL;
expression(parser, &ptr); expression(parser, &ptr);