}
break;
+ case opid1('['):
+ if (exprs[0]->expression.vtype != TYPE_ARRAY) {
+ ast_type_to_string(exprs[0], ty1, sizeof(ty1));
+ parseerror(parser, "cannot index value of type %s", ty1);
+ return false;
+ }
+ if (exprs[1]->expression.vtype != TYPE_FLOAT) {
+ ast_type_to_string(exprs[0], ty1, sizeof(ty1));
+ parseerror(parser, "index must be of type float, not %s", ty1);
+ return false;
+ }
+ out = (ast_expression*)ast_array_index_new(ctx, exprs[0], exprs[1]);
+ break;
+
case opid1(','):
if (blocks[0]) {
if (!ast_block_exprs_add(blocks[0], exprs[1]))
sy->ops_count--;
return !functions_only;
}
+ if (sy->ops[sy->ops_count-1].paren == SY_PAREN_INDEX) {
+ if (functions_only)
+ return false;
+ /* pop off the parenthesis */
+ sy->ops_count--;
+ /* then apply the index operator */
+ if (!parser_sy_pop(parser, sy))
+ return false;
+ return true;
+ }
if (!parser_sy_pop(parser, sy))
return false;
}
}
wantop = true;
}
+ else if (parser->tok == ']') {
+ if (!wantop)
+ parseerror(parser, "operand expected");
+ --parens;
+ if (parens < 0)
+ break;
+ if (!parser_close_paren(parser, &sy, false))
+ goto onerr;
+ wantop = true;
+ }
else if (parser->tok != TOKEN_OPERATOR) {
if (wantop) {
parseerror(parser, "expected operator or end of statement");
DEBUGSHUNTDO(printf("push [nop] (\n"));
}
wantop = false;
+ } else if (op->id == opid1('[')) {
+ if (!wantop) {
+ parseerror(parser, "unexpected array subscript");
+ goto onerr;
+ }
+ ++parens;
+ /* push both the operator and the paren, this makes life easier */
+ if (!shunt_ops_add(&sy, syop(parser_ctx(parser), op)))
+ goto onerr;
+ if (!shunt_ops_add(&sy, syparen(parser_ctx(parser), SY_PAREN_INDEX, 0)))
+ goto onerr;
+ wantop = false;
} else {
DEBUGSHUNTDO(printf("push operator %s\n", op->op));
if (!shunt_ops_add(&sy, syop(parser_ctx(parser), op)))
if (!parser_next(parser)) {
goto onerr;
}
- if (parser->tok == ';' || parser->tok == ']') {
+ if (parser->tok == ';' || (!parens && parser->tok == ']')) {
break;
}
}
asvalue = (ast_value*)(parser->globals[i].var);
if (asvalue->setter) {
if (!ast_global_codegen(asvalue->setter, ir, false) ||
- !ast_function_codegen(asvalue->setter->constval.vfunc, ir))
+ !ast_function_codegen(asvalue->setter->constval.vfunc, ir) ||
+ !ir_function_finalize(asvalue->setter->constval.vfunc->ir_func))
{
printf("failed to generate setter for %s\n", parser->globals[i].name);
ir_builder_delete(ir);
}
if (asvalue->getter) {
if (!ast_global_codegen(asvalue->getter, ir, false) ||
- !ast_function_codegen(asvalue->getter->constval.vfunc, ir))
+ !ast_function_codegen(asvalue->getter->constval.vfunc, ir) ||
+ !ir_function_finalize(asvalue->getter->constval.vfunc->ir_func))
{
printf("failed to generate getter for %s\n", parser->globals[i].name);
ir_builder_delete(ir);