Give argument lists their own link, not each argument's .right
An identifier's subscript list, a unary's operand and a binary's right-hand side all lived in the same field the argument chain used, so ABS(-9), MOD(A#, B# + 12) and any array reference in a parameter list were counted as extra arguments and refused. Subscript lists move to .expr and arguments now chain through a dedicated .next. This is the third time the same collision was fixed; the first two moved it along rather than removing it. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -224,9 +224,9 @@ akerr_ErrorContext *akbasic_cmd_dim(akbasic_Runtime *obj, akbasic_ASTLeaf *expr,
|
||||
|
||||
(void)lval; (void)rval;
|
||||
FAIL_ZERO_RETURN(errctx,
|
||||
(expr != NULL && expr->right != NULL && expr->right->right != NULL &&
|
||||
expr->right->right->leaftype == AKBASIC_LEAF_ARGUMENTLIST &&
|
||||
expr->right->right->operator_ == AKBASIC_TOK_ARRAY_SUBSCRIPT &&
|
||||
(expr != NULL && expr->right != NULL && expr->right->expr != NULL &&
|
||||
expr->right->expr->leaftype == AKBASIC_LEAF_ARGUMENTLIST &&
|
||||
expr->right->expr->operator_ == AKBASIC_TOK_ARRAY_SUBSCRIPT &&
|
||||
akbasic_leaf_is_identifier(expr->right)),
|
||||
AKBASIC_ERR_SYNTAX, "Expected DIM IDENTIFIER(DIMENSIONS, ...)");
|
||||
|
||||
@@ -234,7 +234,7 @@ akerr_ErrorContext *akbasic_cmd_dim(akbasic_Runtime *obj, akbasic_ASTLeaf *expr,
|
||||
FAIL_ZERO_RETURN(errctx, (variable != NULL), AKBASIC_ERR_UNDEFINED,
|
||||
"Unable to get variable for identifier %s", expr->right->identifier);
|
||||
|
||||
for ( walk = expr->right->right->right; walk != NULL; walk = walk->right ) {
|
||||
for ( walk = expr->right->expr->right; walk != NULL; walk = walk->next ) {
|
||||
FAIL_ZERO_RETURN(errctx, (sizecount < AKBASIC_MAX_ARRAY_DEPTH), AKBASIC_ERR_BOUNDS,
|
||||
"More than %d array dimensions", AKBASIC_MAX_ARRAY_DEPTH);
|
||||
PASS(errctx, akbasic_runtime_evaluate(obj, walk, &size));
|
||||
@@ -281,14 +281,14 @@ akerr_ErrorContext *akbasic_cmd_poke(akbasic_Runtime *obj, akbasic_ASTLeaf *expr
|
||||
FAIL_NONZERO_RETURN(errctx, (addrval->valuetype != AKBASIC_TYPE_INTEGER), AKBASIC_ERR_TYPE,
|
||||
"POKE expected INTEGER, INTEGER");
|
||||
FAIL_ZERO_RETURN(errctx,
|
||||
(arg->right != NULL &&
|
||||
(arg->right->leaftype == AKBASIC_LEAF_LITERAL_INT ||
|
||||
arg->right->leaftype == AKBASIC_LEAF_IDENTIFIER_INT)),
|
||||
(arg->next != NULL &&
|
||||
(arg->next->leaftype == AKBASIC_LEAF_LITERAL_INT ||
|
||||
arg->next->leaftype == AKBASIC_LEAF_IDENTIFIER_INT)),
|
||||
AKBASIC_ERR_SYNTAX, "POKE expected INTEGER, INTEGER");
|
||||
FAIL_ZERO_RETURN(errctx, (addrval->intval != 0), AKBASIC_ERR_VALUE,
|
||||
"POKE got NIL pointer or uninitialized variable");
|
||||
|
||||
PASS(errctx, akbasic_runtime_evaluate(obj, arg->right, &byteval));
|
||||
PASS(errctx, akbasic_runtime_evaluate(obj, arg->next, &byteval));
|
||||
target = (uint8_t *)(uintptr_t)addrval->intval;
|
||||
*target = (uint8_t)byteval->intval;
|
||||
SUCCEED_TRUE(obj, dest);
|
||||
@@ -761,7 +761,7 @@ akerr_ErrorContext *akbasic_cmd_data(akbasic_Runtime *obj, akbasic_ASTLeaf *expr
|
||||
FAIL_ZERO_RETURN(errctx, (expr != NULL && expr->right != NULL), AKERR_NULLPOINTER,
|
||||
"NIL expression or argument list");
|
||||
|
||||
for ( literal = expr->right->right; literal != NULL; literal = literal->right ) {
|
||||
for ( literal = expr->right->right; literal != NULL; literal = literal->next ) {
|
||||
if ( env->readIdentifierIdx >= AKBASIC_MAX_LEAVES ) {
|
||||
break;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user