Browse Source

Fix crash with `build_dll` (Issue #100)

Ginger Bill 8 years ago
parent
commit
61a163d773
1 changed files with 51 additions and 22 deletions
  1. 51 22
      src/ir.cpp

+ 51 - 22
src/ir.cpp

@@ -7167,32 +7167,53 @@ void ir_begin_procedure_body(irProcedure *proc) {
 		proc->return_ptr = param;
 		proc->return_ptr = param;
 	}
 	}
 
 
-	if (proc->type->Proc.params != nullptr) {
-		ast_node(pt, ProcType, proc->type_expr);
-		isize param_index = 0;
-		isize q_index = 0;
+	GB_ASSERT(proc->type != nullptr);
 
 
+	if (proc->type->Proc.params != nullptr) {
 		TypeTuple *params = &proc->type->Proc.params->Tuple;
 		TypeTuple *params = &proc->type->Proc.params->Tuple;
-		for_array(i, params->variables) {
-			ast_node(fl, FieldList, pt->params);
-			GB_ASSERT(fl->list.count > 0);
-			GB_ASSERT(fl->list[0]->kind == AstNode_Field);
-			if (q_index == fl->list[param_index]->Field.names.count) {
-				q_index = 0;
-				param_index++;
-			}
-			ast_node(field, Field, fl->list[param_index]);
-			AstNode *name = field->names[q_index++];
-
-			Entity *e = params->variables[i];
-			if (e->kind != Entity_Variable) {
-				continue;
+		if (proc->type_expr != nullptr) {
+			ast_node(pt, ProcType, proc->type_expr);
+			isize param_index = 0;
+			isize q_index = 0;
+
+			for_array(i, params->variables) {
+				ast_node(fl, FieldList, pt->params);
+				GB_ASSERT(fl->list.count > 0);
+				GB_ASSERT(fl->list[0]->kind == AstNode_Field);
+				if (q_index == fl->list[param_index]->Field.names.count) {
+					q_index = 0;
+					param_index++;
+				}
+				ast_node(field, Field, fl->list[param_index]);
+				AstNode *name = field->names[q_index++];
+
+				Entity *e = params->variables[i];
+				if (e->kind != Entity_Variable) {
+					continue;
+				}
+
+				Type *abi_type = proc->type->Proc.abi_compat_params[i];
+				if (e->token.string != "" && !is_blank_ident(e->token)) {
+					irValue *param = ir_add_param(proc, e, name, abi_type);
+					array_add(&proc->params, param);
+				}
 			}
 			}
+		} else {
+			Type **abi_types = proc->type->Proc.abi_compat_params;
 
 
-			Type *abi_type = proc->type->Proc.abi_compat_params[i];
-			if (e->token.string != "" && !is_blank_ident(e->token)) {
-				irValue *param = ir_add_param(proc, e, name, abi_type);
-				array_add(&proc->params, param);
+			for_array(i, params->variables) {
+				Entity *e = params->variables[i];
+				if (e->kind != Entity_Variable) {
+					continue;
+				}
+				Type *abi_type = e->type;
+				if (abi_types != nullptr) {
+					abi_type = proc->type->Proc.abi_compat_params[i];
+				}
+				if (e->token.string != "" && !is_blank_ident(e->token)) {
+					irValue *param = ir_add_param(proc, e, nullptr, abi_type);
+					array_add(&proc->params, param);
+				}
 			}
 			}
 		}
 		}
 	}
 	}
@@ -7771,6 +7792,7 @@ void ir_gen_tree(irGen *s) {
 		proc_params->Tuple.variables[1] = make_entity_param(a, proc_scope, make_token_ident(str_lit("reason")), t_i32, false, false);
 		proc_params->Tuple.variables[1] = make_entity_param(a, proc_scope, make_token_ident(str_lit("reason")), t_i32, false, false);
 		proc_params->Tuple.variables[2] = make_entity_param(a, proc_scope, blank_token, t_rawptr, false, false);
 		proc_params->Tuple.variables[2] = make_entity_param(a, proc_scope, blank_token, t_rawptr, false, false);
 
 
+
 		proc_results->Tuple.variables[0] = make_entity_param(a, proc_scope, empty_token, t_i32, false, false);
 		proc_results->Tuple.variables[0] = make_entity_param(a, proc_scope, empty_token, t_i32, false, false);
 
 
 
 
@@ -7778,6 +7800,13 @@ void ir_gen_tree(irGen *s) {
 		                                 proc_params, 3,
 		                                 proc_params, 3,
 		                                 proc_results, 1, false, ProcCC_Std);
 		                                 proc_results, 1, false, ProcCC_Std);
 
 
+		// TODO(bill): make this more robust
+		proc_type->Proc.abi_compat_params = gb_alloc_array(a, Type *, proc_params->Tuple.variables.count);
+		for_array(i, proc_params->Tuple.variables) {
+			proc_type->Proc.abi_compat_params[i] = proc_params->Tuple.variables[i]->type;
+		}
+		proc_type->Proc.abi_compat_result_type = proc_results->Tuple.variables[0]->type;
+
 		AstNode *body = gb_alloc_item(a, AstNode);
 		AstNode *body = gb_alloc_item(a, AstNode);
 		Entity *e = make_entity_procedure(a, nullptr, make_token_ident(name), proc_type, 0);
 		Entity *e = make_entity_procedure(a, nullptr, make_token_ident(name), proc_type, 0);
 		irValue *p = ir_value_procedure(a, m, e, proc_type, nullptr, body, name);
 		irValue *p = ir_value_procedure(a, m, e, proc_type, nullptr, body, name);