mirror of
https://github.com/odin-lang/Odin.git
synced 2026-06-14 06:13:45 +00:00
Disallow Objective-C setup with -bedrock
This commit is contained in:
@@ -1346,12 +1346,12 @@ String lb_get_objc_type_encoding(Type *t, isize pointer_depth = 0) {
|
||||
s = gb_string_append_length(s, "=", 1);
|
||||
|
||||
if (!is_union) {
|
||||
for( auto& f : base->Struct.fields ) {
|
||||
for (auto &f : base->Struct.fields) {
|
||||
String field_type = lb_get_objc_type_encoding(f->type, pointer_depth);
|
||||
s = gb_string_append_length(s, field_type.text, field_type.len);
|
||||
}
|
||||
} else {
|
||||
for( auto& v : base->Union.variants ) {
|
||||
for (auto &v : base->Union.variants) {
|
||||
String variant_type = lb_get_objc_type_encoding(v, pointer_depth);
|
||||
s = gb_string_append_length(s, variant_type.text, variant_type.len);
|
||||
}
|
||||
@@ -1518,7 +1518,7 @@ gb_internal void lb_register_objc_thing(
|
||||
auto &tn = g.class_impl_type->Named.type_name->TypeName;
|
||||
Type *superclass = tn.objc_superclass;
|
||||
if (superclass != nullptr) {
|
||||
auto& superclass_global = string_map_must_get(&class_map, superclass->Named.type_name->TypeName.objc_class_name);
|
||||
auto &superclass_global = string_map_must_get(&class_map, superclass->Named.type_name->TypeName.objc_class_name);
|
||||
lb_register_objc_thing(handled, m, args, class_impls, class_map, p, superclass_global.g, call);
|
||||
GB_ASSERT(superclass_global.class_global.addr.value);
|
||||
}
|
||||
@@ -1571,6 +1571,7 @@ gb_internal void lb_finalize_objc_names(lbGenerator *gen, lbProcedure *p) {
|
||||
for (Entity *e = {}; mpsc_dequeue(&gen->info->objc_class_implementations, &e); /**/) {
|
||||
GB_ASSERT(e->kind == Entity_TypeName && e->TypeName.objc_is_implementation);
|
||||
lb_handle_objc_find_or_register_class(p, e->TypeName.objc_class_name, e->type);
|
||||
error(e->token, "Objective-C related things are not allowed with '-bedrock'");
|
||||
}
|
||||
|
||||
// Ensure classes that have been implicitly referenced through
|
||||
@@ -1595,12 +1596,18 @@ gb_internal void lb_finalize_objc_names(lbGenerator *gen, lbProcedure *p) {
|
||||
}
|
||||
|
||||
for (auto pair : class_set) {
|
||||
auto& tn = pair.type->Named.type_name->TypeName;
|
||||
Entity *e = pair.type->Named.type_name;
|
||||
GB_ASSERT(e->kind == Entity_TypeName);
|
||||
auto &tn = e->TypeName;
|
||||
Type *class_impl = !tn.objc_is_implementation ? nullptr : pair.type;
|
||||
lb_handle_objc_find_or_register_class(p, tn.objc_class_name, class_impl);
|
||||
|
||||
if (build_context.bedrock) {
|
||||
error(e->token, "Objective-C related things are not allowed with '-bedrock'");
|
||||
}
|
||||
}
|
||||
for (lbObjCGlobal g = {}; mpsc_dequeue(&gen->objc_classes, &g); /**/) {
|
||||
array_add( &referenced_classes, g );
|
||||
array_add(&referenced_classes, g);
|
||||
}
|
||||
|
||||
// Add all class globals to a map so that we can look them up dynamically
|
||||
@@ -1618,21 +1625,21 @@ gb_internal void lb_finalize_objc_names(lbGenerator *gen, lbProcedure *p) {
|
||||
lb_begin_procedure_body(p);
|
||||
|
||||
// Register class globals, gathering classes that must be implemented
|
||||
for (auto& kv : global_class_map) {
|
||||
for (auto &kv : global_class_map) {
|
||||
lb_register_objc_thing(handled, m, args, class_impls, global_class_map, p, kv.value.g, "objc_lookUpClass");
|
||||
}
|
||||
|
||||
// Prefetch selectors for implemented methods so that they can also be registered.
|
||||
for (const auto& cd : class_impls) {
|
||||
auto& g = cd.g;
|
||||
for (auto const &cd : class_impls) {
|
||||
auto &g = cd.g;
|
||||
Type *class_type = g.class_impl_type;
|
||||
|
||||
Array<ObjcMethodData>* methods = map_get(&m->info->objc_method_implementations, class_type);
|
||||
Array<ObjcMethodData> *methods = map_get(&m->info->objc_method_implementations, class_type);
|
||||
if (!methods) {
|
||||
continue;
|
||||
}
|
||||
|
||||
for (const ObjcMethodData& md : *methods) {
|
||||
for (ObjcMethodData const &md : *methods) {
|
||||
lb_handle_objc_find_or_register_selector(p, md.ac.objc_selector);
|
||||
}
|
||||
}
|
||||
@@ -1655,11 +1662,17 @@ gb_internal void lb_finalize_objc_names(lbGenerator *gen, lbProcedure *p) {
|
||||
map_set(&ivar_map, g.class_impl_type, g);
|
||||
}
|
||||
|
||||
for (const auto &cd : class_impls) {
|
||||
for (auto const &cd : class_impls) {
|
||||
auto &g = cd.g;
|
||||
|
||||
Type *class_type = g.class_impl_type;
|
||||
Type *class_ptr_type = alloc_type_pointer(class_type);
|
||||
Entity *e = class_type->Named.type_name;
|
||||
GB_ASSERT(e->kind == Entity_TypeName);
|
||||
|
||||
if (build_context.bedrock) {
|
||||
error(e->token, "Objective-C related things are not allowed with '-bedrock'");
|
||||
}
|
||||
|
||||
// Begin class registration: create class pair and update global reference
|
||||
lbValue class_value = {};
|
||||
@@ -1667,11 +1680,11 @@ gb_internal void lb_finalize_objc_names(lbGenerator *gen, lbProcedure *p) {
|
||||
{
|
||||
lbValue superclass_value = lb_const_nil(m, t_objc_Class);
|
||||
|
||||
auto& tn = class_type->Named.type_name->TypeName;
|
||||
auto &tn = e->TypeName;
|
||||
Type *superclass = tn.objc_superclass;
|
||||
|
||||
if (superclass != nullptr) {
|
||||
auto& superclass_global = string_map_must_get(&global_class_map, superclass->Named.type_name->TypeName.objc_class_name);
|
||||
auto& superclass_global = string_map_must_get(&global_class_map, tn.objc_class_name);
|
||||
superclass_value = superclass_global.class_value;
|
||||
}
|
||||
|
||||
@@ -1727,13 +1740,13 @@ gb_internal void lb_finalize_objc_names(lbGenerator *gen, lbProcedure *p) {
|
||||
}
|
||||
|
||||
for (const ObjcMethodData &md : *methods) {
|
||||
GB_ASSERT( md.proc_entity->kind == Entity_Procedure);
|
||||
GB_ASSERT(md.proc_entity->kind == Entity_Procedure);
|
||||
Type *method_type = md.proc_entity->type;
|
||||
|
||||
String proc_name = make_string_c("__$objc_method::");
|
||||
proc_name = concatenate_strings(temporary_allocator(), proc_name, g.name);
|
||||
proc_name = concatenate_strings(temporary_allocator(), proc_name, str_lit("::"));
|
||||
proc_name = concatenate_strings( permanent_allocator(), proc_name, md.ac.objc_name);
|
||||
proc_name = concatenate_strings(permanent_allocator(), proc_name, md.ac.objc_name);
|
||||
|
||||
wrapper_args.count = 2;
|
||||
wrapper_args[0] = md.ac.objc_is_class_method ? t_objc_Class : class_ptr_type;
|
||||
@@ -1934,7 +1947,10 @@ gb_internal void lb_finalize_objc_names(lbGenerator *gen, lbProcedure *p) {
|
||||
ivar_addr = lb_addr(global);
|
||||
}
|
||||
|
||||
String class_name = g.class_impl_type->Named.type_name->TypeName.objc_class_name;
|
||||
Entity *e = g.class_impl_type->Named.type_name;
|
||||
GB_ASSERT(e->kind == Entity_TypeName);
|
||||
|
||||
String class_name = e->TypeName.objc_class_name;
|
||||
lbValue class_value = string_map_must_get(&global_class_map, class_name).class_value;
|
||||
|
||||
args.count = 2;
|
||||
@@ -1948,6 +1964,10 @@ gb_internal void lb_finalize_objc_names(lbGenerator *gen, lbProcedure *p) {
|
||||
lbValue ivar_offset_int = lb_emit_conv(p, ivar_offset, t_int);
|
||||
|
||||
lb_addr_store(p, ivar_addr, ivar_offset_int);
|
||||
|
||||
if (build_context.bedrock) {
|
||||
error(e->token, "Objective-C related things are not allowed with '-bedrock'");
|
||||
}
|
||||
}
|
||||
|
||||
lb_end_procedure_body(p);
|
||||
|
||||
Reference in New Issue
Block a user