mirror of
https://github.com/odin-lang/Odin.git
synced 2025-12-28 17:04:34 +00:00
Use module-prefixed naming scheme for tracking
objc block instead of shared id counter.
This commit is contained in:
@@ -206,7 +206,7 @@ struct lbModule {
|
||||
StringMap<lbAddr> objc_classes;
|
||||
StringMap<lbAddr> objc_selectors;
|
||||
StringMap<lbAddr> objc_ivars;
|
||||
std::atomic<isize> objc_next_block_id; // Used to name objective-c blocks. IMPORTANT: Tracked on the main module
|
||||
isize objc_next_block_id; // Used to name objective-c blocks. Tracked per module.
|
||||
|
||||
PtrMap<u64/*type hash*/, lbAddr> map_cell_info_map; // address of runtime.Map_Info
|
||||
PtrMap<u64/*type hash*/, lbAddr> map_info_map; // address of runtime.Map_Cell_Info
|
||||
|
||||
@@ -2275,8 +2275,8 @@ gb_internal void lb_create_objc_block_helper_procs(
|
||||
Slice<lbValue> capture_values, Slice<isize> objc_object_indices,
|
||||
lbProcedure *&out_copy_helper, lbProcedure *&out_dispose_helper
|
||||
) {
|
||||
gbString copy_helper_name = gb_string_append_fmt(gb_string_make(temporary_allocator(), ""), "__$objc_block_copy_helper_%lld", block_id);
|
||||
gbString dispose_helper_name = gb_string_append_fmt(gb_string_make(temporary_allocator(), ""), "__$objc_block_dispose_helper_%lld", block_id);
|
||||
gbString copy_helper_name = gb_string_append_fmt(gb_string_make(temporary_allocator(), ""), "__$%s::objc_block_copy_helper_%lld", m->module_name, block_id);
|
||||
gbString dispose_helper_name = gb_string_append_fmt(gb_string_make(temporary_allocator(), ""), "__$%s::objc_block_dispose_helper_%lld", m->module_name, block_id);
|
||||
|
||||
// copy: Block_Literal *dst, Block_Literal *src, i32 field_apropos
|
||||
// dispose: Block_Literal *src, i32 field_apropos
|
||||
@@ -2385,9 +2385,7 @@ gb_internal lbValue lb_handle_objc_block(lbProcedure *p, Ast *expr) {
|
||||
|
||||
lbModule *m = p->module;
|
||||
|
||||
lbModule *default_module = &m->gen->default_module;
|
||||
const isize block_id = default_module->objc_next_block_id++;
|
||||
|
||||
const isize block_id = m->objc_next_block_id++;
|
||||
const isize capture_arg_count = ce->args.count - 1;
|
||||
|
||||
Type *block_result_type = type_of_expr(expr);
|
||||
@@ -2432,7 +2430,7 @@ gb_internal lbValue lb_handle_objc_block(lbProcedure *p, Ast *expr) {
|
||||
|
||||
// Create proc with the block signature
|
||||
// (takes a block literal pointer as the first parameter, followed by any expected ones from the user's proc)
|
||||
gbString block_invoker_name = gb_string_append_fmt(gb_string_make(permanent_allocator(), ""), "__$objc_block_invoker_%lld", block_id);
|
||||
gbString block_invoker_name = gb_string_append_fmt(gb_string_make(permanent_allocator(), ""), "__$%s::objc_block_invoker_%lld", m->module_name, block_id);
|
||||
|
||||
// Add + 1 because the first parameter received is the block literal pointer itself
|
||||
auto invoker_args = array_make<Type *>(temporary_allocator(), block_forward_args + 1, block_forward_args + 1);
|
||||
@@ -2464,11 +2462,11 @@ gb_internal lbValue lb_handle_objc_block(lbProcedure *p, Ast *expr) {
|
||||
lb_add_function_type_attributes(invoker_proc->value, lb_get_function_type(m, invoker_proc_type), ProcCC_CDecl);
|
||||
|
||||
// Create the block descriptor and block literal
|
||||
gbString block_lit_type_name = gb_string_make(temporary_allocator(), "__$ObjC_Block_Literal_");
|
||||
block_lit_type_name = gb_string_append_fmt(block_lit_type_name, "%lld", block_id);
|
||||
gbString block_lit_type_name = gb_string_make(temporary_allocator(), "");
|
||||
block_lit_type_name = gb_string_append_fmt(block_lit_type_name, "__$%s::ObjC_Block_Literal_%lld", m->module_name, block_id);
|
||||
|
||||
gbString block_desc_type_name = gb_string_make(temporary_allocator(), "__$ObjC_Block_Descriptor_");
|
||||
block_desc_type_name = gb_string_append_fmt(block_desc_type_name, "%lld", block_id);
|
||||
gbString block_desc_type_name = gb_string_make(temporary_allocator(), "");
|
||||
block_desc_type_name = gb_string_append_fmt(block_desc_type_name, "__$%s::ObjC_Block_Descriptor_%lld", m->module_name,block_id);
|
||||
|
||||
LLVMTypeRef block_lit_type = {};
|
||||
LLVMTypeRef block_desc_type = {};
|
||||
@@ -2530,8 +2528,8 @@ gb_internal lbValue lb_handle_objc_block(lbProcedure *p, Ast *expr) {
|
||||
}
|
||||
|
||||
// Create global block descriptor
|
||||
gbString desc_global_name = gb_string_make(temporary_allocator(), "__$objc_block_desc_");
|
||||
desc_global_name = gb_string_append_fmt(desc_global_name, "%lld", block_id);
|
||||
gbString desc_global_name = gb_string_make(temporary_allocator(), "");
|
||||
desc_global_name = gb_string_append_fmt(desc_global_name, "__$%s::objc_block_desc_%lld", m->module_name, block_id);
|
||||
|
||||
LLVMValueRef p_descriptor = LLVMAddGlobal(m->mod, block_desc_type, desc_global_name);
|
||||
LLVMSetInitializer(p_descriptor, block_desc_initializer);
|
||||
|
||||
Reference in New Issue
Block a user