2
0
gingerBill 5 сар өмнө
parent
commit
4ebaed1fdd

+ 34 - 15
src/llvm_backend_utility.cpp

@@ -2094,23 +2094,22 @@ gb_internal void lb_set_wasm_export_attributes(LLVMValueRef value, String export
 }
 
 
-gb_internal lbAddr lb_handle_objc_find_or_register_internal(lbProcedure *p, StringMap<lbAddr> *objc_map, String const &name, char const *prefix, Type *type) {
+gb_internal lbAddr lb_handle_objc_find_or_register_selector(lbProcedure *p, String const &name) {
 	lbModule *m = p->module;
-	lbAddr *found = string_map_get(objc_map, name);
+	lbAddr *found = string_map_get(&m->objc_selectors, name);
 	if (found) {
 		return *found;
 	}
 
 	lbModule *default_module = &p->module->gen->default_module;
 
-
-	gbString global_name = gb_string_make(permanent_allocator(), prefix);
+	gbString global_name = gb_string_make(permanent_allocator(), "__$objc_SEL::");
 	global_name = gb_string_append_length(global_name, name.text, name.len);
 
-	LLVMTypeRef t = lb_type(m, type);
+	LLVMTypeRef t = lb_type(m, t_objc_SEL);
 	lbValue g = {};
 	g.value = LLVMAddGlobal(m->mod, t, global_name);
-	g.type = alloc_type_pointer(type);
+	g.type = alloc_type_pointer(t_objc_SEL);
 
 	if (default_module == m) {
 		LLVMSetInitializer(g.value, LLVMConstNull(t));
@@ -2119,21 +2118,41 @@ gb_internal lbAddr lb_handle_objc_find_or_register_internal(lbProcedure *p, Stri
 		LLVMSetLinkage(g.value, LLVMExternalLinkage);
 	}
 
-	mpsc_enqueue(&m->gen->objc_selectors, lbObjCGlobal{m, global_name, name, type});
+	mpsc_enqueue(&m->gen->objc_selectors, lbObjCGlobal{m, global_name, name, t_objc_SEL});
 
 	lbAddr addr = lb_addr(g);
-
-	string_map_set(objc_map, name, addr);
-
+	string_map_set(&m->objc_selectors, name, addr);
 	return addr;
 }
 
-gb_internal lbAddr lb_handle_objc_find_or_register_selector(lbProcedure *p, String const &name) {
-	return lb_handle_objc_find_or_register_internal(p, &p->module->objc_selectors, name, "__$objc_SEL::",   t_objc_SEL);
-}
-
 gb_internal lbAddr lb_handle_objc_find_or_register_class(lbProcedure *p, String const &name) {
-	return lb_handle_objc_find_or_register_internal(p, &p->module->objc_classes,   name, "__$objc_Class::", t_objc_Class);
+	lbModule *m = p->module;
+	lbAddr *found = string_map_get(&m->objc_classes, name);
+	if (found) {
+		return *found;
+	}
+
+	lbModule *default_module = &p->module->gen->default_module;
+
+	gbString global_name = gb_string_make(permanent_allocator(), "__$objc_Class::");
+	global_name = gb_string_append_length(global_name, name.text, name.len);
+
+	LLVMTypeRef t = lb_type(m, t_objc_Class);
+	lbValue g = {};
+	g.value = LLVMAddGlobal(m->mod, t, global_name);
+	g.type = alloc_type_pointer(t_objc_Class);
+
+	if (default_module == m) {
+		LLVMSetInitializer(g.value, LLVMConstNull(t));
+		lb_add_member(m, make_string_c(global_name), g);
+	} else {
+		LLVMSetLinkage(g.value, LLVMExternalLinkage);
+	}
+	mpsc_enqueue(&m->gen->objc_classes, lbObjCGlobal{m, global_name, name, t_objc_Class});
+
+	lbAddr addr = lb_addr(g);
+	string_map_set(&m->objc_classes, name, addr);
+	return addr;
 }
 
 gb_internal lbValue lb_handle_objc_find_selector(lbProcedure *p, Ast *expr) {