aboutsummaryrefslogtreecommitdiff
path: root/src/codegen.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <superjoe30@gmail.com>2016-01-04 16:57:22 -0700
committerAndrew Kelley <superjoe30@gmail.com>2016-01-04 16:57:22 -0700
commit4514661cfef1cd0090ba9888b69037af3ef9805a (patch)
treea298e8c90440837a9cbf7ec83d9c6408ca59c768 /src/codegen.cpp
parentfcacc85b4e7f0a60ae11bbefcdae620665426297 (diff)
downloadzig-4514661cfef1cd0090ba9888b69037af3ef9805a.tar.gz
zig-4514661cfef1cd0090ba9888b69037af3ef9805a.zip
add member functions
Diffstat (limited to 'src/codegen.cpp')
-rw-r--r--src/codegen.cpp31
1 files changed, 25 insertions, 6 deletions
diff --git a/src/codegen.cpp b/src/codegen.cpp
index 4fe1373f92..0a784f8071 100644
--- a/src/codegen.cpp
+++ b/src/codegen.cpp
@@ -142,15 +142,31 @@ static TypeTableEntry *get_expr_type(AstNode *node) {
static LLVMValueRef gen_fn_call_expr(CodeGen *g, AstNode *node) {
assert(node->type == NodeTypeFnCallExpr);
- Buf *name = hack_get_fn_call_name(g, node->data.fn_call_expr.fn_ref_expr);
+ FnTableEntry *fn_table_entry;
+ AstNode *fn_ref_expr = node->data.fn_call_expr.fn_ref_expr;
+ TypeTableEntry *struct_type;
+ AstNode *first_param_expr;
+ if (fn_ref_expr->type == NodeTypeFieldAccessExpr) {
+ Buf *name = &fn_ref_expr->data.field_access_expr.field_name;
+ first_param_expr = fn_ref_expr->data.field_access_expr.struct_expr;
+ struct_type = get_expr_type(first_param_expr);
+ fn_table_entry = struct_type->data.structure.fn_table.get(name);
+ } else if (fn_ref_expr->type == NodeTypeSymbol) {
+ Buf *name = hack_get_fn_call_name(g, fn_ref_expr);
+ struct_type = nullptr;
+ first_param_expr = nullptr;
+ fn_table_entry = g->cur_fn->import_entry->fn_table.get(name);
+ } else {
+ zig_unreachable();
+ }
- FnTableEntry *fn_table_entry = g->cur_fn->import_entry->fn_table.get(name);
assert(fn_table_entry->proto_node->type == NodeTypeFnProto);
AstNodeFnProto *fn_proto_data = &fn_table_entry->proto_node->data.fn_proto;
int expected_param_count = fn_proto_data->params.length;
- int actual_param_count = node->data.fn_call_expr.params.length;
+ int fn_call_param_count = node->data.fn_call_expr.params.length;
+ int actual_param_count = fn_call_param_count + (struct_type ? 1 : 0);
bool is_var_args = fn_proto_data->is_var_args;
assert((is_var_args && actual_param_count >= expected_param_count) ||
actual_param_count == expected_param_count);
@@ -164,10 +180,13 @@ static LLVMValueRef gen_fn_call_expr(CodeGen *g, AstNode *node) {
}
LLVMValueRef *gen_param_values = allocate<LLVMValueRef>(gen_param_count);
- int loop_end = max(gen_param_count, actual_param_count);
-
int gen_param_index = 0;
- for (int i = 0; i < loop_end; i += 1) {
+ if (struct_type) {
+ gen_param_values[gen_param_index] = gen_expr(g, first_param_expr);
+ gen_param_index += 1;
+ }
+
+ for (int i = 0; i < fn_call_param_count; i += 1) {
AstNode *expr_node = node->data.fn_call_expr.params.at(i);
LLVMValueRef param_value = gen_expr(g, expr_node);
if (is_var_args ||