From 30d87ee8376f3c38b5eaba25ef81f4ea0c974593 Mon Sep 17 00:00:00 2001 From: "Wolfgang (Blub) Bumiller" Date: Sun, 11 Nov 2012 16:32:59 +0100 Subject: [PATCH] get-accessor calling in ast_array_index_codegen --- ast.c | 40 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 37 insertions(+), 3 deletions(-) diff --git a/ast.c b/ast.c index bba0aa5..4de5443 100644 --- a/ast.c +++ b/ast.c @@ -1520,8 +1520,20 @@ bool ast_array_index_codegen(ast_array_index *self, ast_function *func, bool lva ast_value *arr; ast_value *idx; + if (!lvalue && self->expression.outr) { + *out = self->expression.outr; + } + if (lvalue && self->expression.outl) { + *out = self->expression.outl; + } + if (!ast_istype(self->array, ast_value)) { asterror(ast_ctx(self), "array indexing this way is not supported"); + /* note this would actually be pointer indexing because the left side is + * not an actual array but (hopefully) an indexable expression. + * Once we get integer arithmetic, and GADDRESS/GSTORE/GLOAD instruction + * support this path will be filled. + */ return false; } @@ -1531,10 +1543,32 @@ bool ast_array_index_codegen(ast_array_index *self, ast_function *func, bool lva return false; } else { /* Time to use accessor functions */ - /* ast_expression_codegen *cgen; - ir_value *iridx; - */ + ir_value *iridx, *funval; + ir_instr *call; + + if (!arr->getter) { + asterror(ast_ctx(self), "value has no getter, don't know how to index it"); + return false; + } + + cgen = self->index->expression.codegen; + if (!(*cgen)((ast_expression*)(self->index), func, true, &iridx)) + return false; + + cgen = arr->getter->expression.codegen; + if (!(*cgen)((ast_expression*)(arr->getter), func, true, &funval)) + return false; + + call = ir_block_create_call(func->curblock, ast_function_label(func, "fetch"), funval); + if (!call) + return false; + if (!ir_call_param(call, iridx)) + return false; + + *out = ir_call_value(call); + self->expression.outr = *out; + return true; } } -- 2.39.2