Browse Source

Move anonymous proc generation into `lbGenerator`

gingerBill 4 years ago
parent
commit
94570a24c1
2 changed files with 9 additions and 7 deletions
  1. 7 7
      src/llvm_backend.cpp
  2. 2 0
      src/llvm_backend.hpp

+ 7 - 7
src/llvm_backend.cpp

@@ -10974,12 +10974,9 @@ lbValue lb_emit_comp(lbProcedure *p, TokenKind op_kind, lbValue left, lbValue ri
 
 
 
 
 lbValue lb_generate_anonymous_proc_lit(lbModule *m, String const &prefix_name, Ast *expr, lbProcedure *parent) {
 lbValue lb_generate_anonymous_proc_lit(lbModule *m, String const &prefix_name, Ast *expr, lbProcedure *parent) {
-	auto *found = map_get(&m->anonymous_proc_lits, hash_pointer(expr));
-	if (found != nullptr) {
-		lbValue value = {};
-		value.value = (*found)->value;
-		value.type = (*found)->type;
-		return value;
+	lbProcedure **found = map_get(&m->gen->anonymous_proc_lits, hash_pointer(expr));
+	if (found) {
+		return lb_find_procedure_value_from_entity(m, (*found)->entity);
 	}
 	}
 
 
 	ast_node(pl, ProcLit, expr);
 	ast_node(pl, ProcLit, expr);
@@ -10988,7 +10985,7 @@ lbValue lb_generate_anonymous_proc_lit(lbModule *m, String const &prefix_name, A
 	// parent$count
 	// parent$count
 	isize name_len = prefix_name.len + 1 + 8 + 1;
 	isize name_len = prefix_name.len + 1 + 8 + 1;
 	char *name_text = gb_alloc_array(permanent_allocator(), char, name_len);
 	char *name_text = gb_alloc_array(permanent_allocator(), char, name_len);
-	i32 name_id = cast(i32)m->anonymous_proc_lits.entries.count;
+	i32 name_id = cast(i32)m->gen->anonymous_proc_lits.entries.count;
 
 
 	name_len = gb_snprintf(name_text, name_len, "%.*s$anon-%d", LIT(prefix_name), name_id);
 	name_len = gb_snprintf(name_text, name_len, "%.*s$anon-%d", LIT(prefix_name), name_id);
 	String name = make_string((u8 *)name_text, name_len-1);
 	String name = make_string((u8 *)name_text, name_len-1);
@@ -11002,6 +10999,7 @@ lbValue lb_generate_anonymous_proc_lit(lbModule *m, String const &prefix_name, A
 	Entity *e = alloc_entity_procedure(nullptr, token, type, pl->tags);
 	Entity *e = alloc_entity_procedure(nullptr, token, type, pl->tags);
 	e->file = expr->file;
 	e->file = expr->file;
 	e->decl_info = pl->decl;
 	e->decl_info = pl->decl;
+	e->code_gen_module = m;
 	lbProcedure *p = lb_create_procedure(m, e);
 	lbProcedure *p = lb_create_procedure(m, e);
 
 
 	lbValue value = {};
 	lbValue value = {};
@@ -11016,6 +11014,7 @@ lbValue lb_generate_anonymous_proc_lit(lbModule *m, String const &prefix_name, A
 	}
 	}
 
 
 	map_set(&m->anonymous_proc_lits, hash_pointer(expr), p);
 	map_set(&m->anonymous_proc_lits, hash_pointer(expr), p);
+	map_set(&m->gen->anonymous_proc_lits, hash_pointer(expr), p);
 
 
 	return value;
 	return value;
 }
 }
@@ -13112,6 +13111,7 @@ bool lb_init_generator(lbGenerator *gen, Checker *c) {
 
 
 	map_init(&gen->modules, permanent_allocator(), gen->info->packages.entries.count*2);
 	map_init(&gen->modules, permanent_allocator(), gen->info->packages.entries.count*2);
 	map_init(&gen->modules_through_ctx, permanent_allocator(), gen->info->packages.entries.count*2);
 	map_init(&gen->modules_through_ctx, permanent_allocator(), gen->info->packages.entries.count*2);
+	map_init(&gen->anonymous_proc_lits, heap_allocator(), 1024);
 
 
 	gb_mutex_init(&gen->mutex);
 	gb_mutex_init(&gen->mutex);
 
 

+ 2 - 0
src/llvm_backend.hpp

@@ -135,6 +135,8 @@ struct lbGenerator {
 	Map<lbModule *> modules_through_ctx; // Key: LLVMContextRef *
 	Map<lbModule *> modules_through_ctx; // Key: LLVMContextRef *
 	lbModule default_module;
 	lbModule default_module;
 
 
+	Map<lbProcedure *> anonymous_proc_lits; // Key: Ast *
+
 	gbAtomic32 global_array_index;
 	gbAtomic32 global_array_index;
 	gbAtomic32 global_generated_index;
 	gbAtomic32 global_generated_index;
 };
 };