Complete lb_get_objc_type_encoding() implementation

This commit is contained in:
Harold Brenes
2025-04-30 20:32:14 -04:00
parent 5097e98da2
commit 668a9a89b0
+33 -33
View File
@@ -1173,9 +1173,8 @@ gb_internal lbProcedure *lb_create_objc_names(lbModule *main_module) {
return p; return p;
} }
// TODO(harold): Move this out of here and into a more suitable place. // TODO(harold): Perhaps move this out of here and into a more suitable place?
// TODO(harold): Should not take an allocator, but always use temp, as we return string literals as well. String lb_get_objc_type_encoding(Type *t, isize pointer_depth = 0) {
String lb_get_objc_type_encoding(Type *t, gbAllocator allocator, isize pointer_depth = 0) {
// NOTE(harold): See https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtTypeEncodings.html#//apple_ref/doc/uid/TP40008048-CH100 // NOTE(harold): See https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/ObjCRuntimeGuide/Articles/ocrtTypeEncodings.html#//apple_ref/doc/uid/TP40008048-CH100
// NOTE(harold): Darwin targets are always 64-bit. Should we drop this and assume "q" always? // NOTE(harold): Darwin targets are always 64-bit. Should we drop this and assume "q" always?
@@ -1248,14 +1247,12 @@ String lb_get_objc_type_encoding(Type *t, gbAllocator allocator, isize pointer_d
case Basic_f64be: case Basic_f64be:
return str_lit("d"); return str_lit("d");
// TODO(harold) These: case Basic_complex32: return str_lit("{Raw_Complex32=ss}"); // No f16 encoding, so fallback to i16, as above in Basic_f16*
case Basic_complex32: case Basic_complex64: return str_lit("{Raw_Complex64=ff}");
case Basic_complex64: case Basic_complex128: return str_lit("{Raw_Complex128=dd}");
case Basic_complex128: case Basic_quaternion64: return str_lit("{Raw_Quaternion64=ssss}");
case Basic_quaternion64: case Basic_quaternion128: return str_lit("{Raw_Quaternion128=ffff}");
case Basic_quaternion128: case Basic_quaternion256: return str_lit("{Raw_Quaternion256=dddd}");
case Basic_quaternion256:
return str_lit("?");
case Basic_int: case Basic_int:
return str_lit(INT_SIZE_ENCODING); return str_lit(INT_SIZE_ENCODING);
@@ -1298,7 +1295,7 @@ String lb_get_objc_type_encoding(Type *t, gbAllocator allocator, isize pointer_d
if (base->kind == Type_Named) { if (base->kind == Type_Named) {
base = base_type(base); base = base_type(base);
if(base->kind != Type_Struct && base->kind != Type_Union) { if(base->kind != Type_Struct && base->kind != Type_Union) {
return lb_get_objc_type_encoding(base, allocator, pointer_depth); return lb_get_objc_type_encoding(base, pointer_depth);
} }
} }
@@ -1325,7 +1322,7 @@ String lb_get_objc_type_encoding(Type *t, gbAllocator allocator, isize pointer_d
} }
gbString s = gb_string_make_reserve(allocator, 16); gbString s = gb_string_make_reserve(temporary_allocator(), 16);
s = gb_string_append_length(s, is_union ? "(" :"{", 1); s = gb_string_append_length(s, is_union ? "(" :"{", 1);
if (t->kind == Type_Named) { if (t->kind == Type_Named) {
s = gb_string_append_length(s, t->Named.name.text, t->Named.name.len); s = gb_string_append_length(s, t->Named.name.text, t->Named.name.len);
@@ -1337,11 +1334,14 @@ String lb_get_objc_type_encoding(Type *t, gbAllocator allocator, isize pointer_d
if (!is_union) { 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, allocator, pointer_depth); String field_type = lb_get_objc_type_encoding(f->type, pointer_depth);
s = gb_string_append_length(s, field_type.text, field_type.len); s = gb_string_append_length(s, field_type.text, field_type.len);
} }
} else { } else {
// #TODO(harold): Encode fields 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);
}
} }
} }
@@ -1355,44 +1355,44 @@ String lb_get_objc_type_encoding(Type *t, gbAllocator allocator, isize pointer_d
return str_lit("?"); return str_lit("?");
case Type_Pointer: { case Type_Pointer: {
String pointee = lb_get_objc_type_encoding(t->Pointer.elem, allocator, pointer_depth +1); String pointee = lb_get_objc_type_encoding(t->Pointer.elem, pointer_depth +1);
// Special case for Objective-C Objects // Special case for Objective-C Objects
if (pointer_depth == 0 && pointee == "@") { if (pointer_depth == 0 && pointee == "@") {
return pointee; return pointee;
} }
return concatenate_strings(allocator, str_lit("^"), pointee); return concatenate_strings(temporary_allocator(), str_lit("^"), pointee);
} }
case Type_MultiPointer: case Type_MultiPointer:
return concatenate_strings(allocator, str_lit("^"), lb_get_objc_type_encoding(t->Pointer.elem, allocator, pointer_depth +1)); return concatenate_strings(temporary_allocator(), str_lit("^"), lb_get_objc_type_encoding(t->Pointer.elem, pointer_depth +1));
case Type_Array: { case Type_Array: {
String type_str = lb_get_objc_type_encoding(t->Array.elem, allocator, pointer_depth); String type_str = lb_get_objc_type_encoding(t->Array.elem, pointer_depth);
gbString s = gb_string_make_reserve(allocator, type_str.len + 8); gbString s = gb_string_make_reserve(temporary_allocator(), type_str.len + 8);
s = gb_string_append_fmt(s, "[%lld%s]", t->Array.count, type_str.text); s = gb_string_append_fmt(s, "[%lld%s]", t->Array.count, type_str.text);
return make_string_c(s); return make_string_c(s);
} }
case Type_EnumeratedArray: { case Type_EnumeratedArray: {
String type_str = lb_get_objc_type_encoding(t->EnumeratedArray.elem, allocator, pointer_depth); String type_str = lb_get_objc_type_encoding(t->EnumeratedArray.elem, pointer_depth);
gbString s = gb_string_make_reserve(allocator, type_str.len + 8); gbString s = gb_string_make_reserve(temporary_allocator(), type_str.len + 8);
s = gb_string_append_fmt(s, "[%lld%s]", t->EnumeratedArray.count, type_str.text); s = gb_string_append_fmt(s, "[%lld%s]", t->EnumeratedArray.count, type_str.text);
return make_string_c(s); return make_string_c(s);
} }
case Type_Slice: { case Type_Slice: {
String type_str = lb_get_objc_type_encoding(t->Slice.elem, allocator, pointer_depth); String type_str = lb_get_objc_type_encoding(t->Slice.elem, pointer_depth);
gbString s = gb_string_make_reserve(allocator, type_str.len + 8); gbString s = gb_string_make_reserve(temporary_allocator(), type_str.len + 8);
s = gb_string_append_fmt(s, "{slice=^%s%s}", type_str, INT_SIZE_ENCODING); s = gb_string_append_fmt(s, "{slice=^%s%s}", type_str, INT_SIZE_ENCODING);
return make_string_c(s); return make_string_c(s);
} }
case Type_DynamicArray: { case Type_DynamicArray: {
String type_str = lb_get_objc_type_encoding(t->DynamicArray.elem, allocator, pointer_depth); String type_str = lb_get_objc_type_encoding(t->DynamicArray.elem, pointer_depth);
gbString s = gb_string_make_reserve(allocator, type_str.len + 8); gbString s = gb_string_make_reserve(temporary_allocator(), type_str.len + 8);
s = gb_string_append_fmt(s, "{dynamic=^%s%s%sAllocator={?^v}}", type_str, INT_SIZE_ENCODING, INT_SIZE_ENCODING); s = gb_string_append_fmt(s, "{dynamic=^%s%s%sAllocator={?^v}}", type_str, INT_SIZE_ENCODING, INT_SIZE_ENCODING);
return make_string_c(s); return make_string_c(s);
} }
@@ -1400,22 +1400,22 @@ String lb_get_objc_type_encoding(Type *t, gbAllocator allocator, isize pointer_d
case Type_Map: case Type_Map:
return str_lit("{^v^v{Allocator=?^v}}"); return str_lit("{^v^v{Allocator=?^v}}");
case Type_Enum: case Type_Enum:
return lb_get_objc_type_encoding(t->Enum.base_type, allocator, pointer_depth); return lb_get_objc_type_encoding(t->Enum.base_type, pointer_depth);
case Type_Tuple: case Type_Tuple:
// NOTE(harold): Is this allowed here? // NOTE(harold): Is this type allowed here?
return str_lit("?"); return str_lit("?");
case Type_Proc: case Type_Proc:
return str_lit("?"); return str_lit("?");
case Type_BitSet: case Type_BitSet:
return lb_get_objc_type_encoding(t->BitSet.underlying, allocator, pointer_depth); return lb_get_objc_type_encoding(t->BitSet.underlying, pointer_depth);
case Type_SimdVector: case Type_SimdVector:
break; break;
case Type_Matrix: case Type_Matrix:
break; break;
case Type_BitField: case Type_BitField:
return lb_get_objc_type_encoding(t->BitField.backing_type, allocator, pointer_depth); return lb_get_objc_type_encoding(t->BitField.backing_type, pointer_depth);
case Type_SoaPointer: { case Type_SoaPointer: {
gbString s = gb_string_make_reserve(allocator, 8); gbString s = gb_string_make_reserve(temporary_allocator(), 8);
s = gb_string_append_fmt(s, "{=^v%s}", INT_SIZE_ENCODING); s = gb_string_append_fmt(s, "{=^v%s}", INT_SIZE_ENCODING);
return make_string_c(s); return make_string_c(s);
} }
@@ -1733,7 +1733,7 @@ gb_internal void lb_finalize_objc_names(lbGenerator *gen, lbProcedure *p) {
// TODO (harold): Checker must ensure that objc_methods have a single return value or none! // TODO (harold): Checker must ensure that objc_methods have a single return value or none!
GB_ASSERT(method_type->Proc.result_count <= 1); GB_ASSERT(method_type->Proc.result_count <= 1);
if (method_type->Proc.result_count != 0) { if (method_type->Proc.result_count != 0) {
method_encoding = lb_get_objc_type_encoding(method_type->Proc.results->Tuple.variables[0]->type, temporary_allocator()); method_encoding = lb_get_objc_type_encoding(method_type->Proc.results->Tuple.variables[0]->type);
} }
if (!md.ac.objc_is_class_method) { if (!md.ac.objc_is_class_method) {
@@ -1744,7 +1744,7 @@ gb_internal void lb_finalize_objc_names(lbGenerator *gen, lbProcedure *p) {
for (i32 i = method_param_offset; i < method_param_count; i++) { for (i32 i = method_param_offset; i < method_param_count; i++) {
Type *param_type = method_type->Proc.params->Tuple.variables[i]->type; Type *param_type = method_type->Proc.params->Tuple.variables[i]->type;
String param_encoding = lb_get_objc_type_encoding(param_type, temporary_allocator()); String param_encoding = lb_get_objc_type_encoding(param_type);
method_encoding = concatenate_strings(temporary_allocator(), method_encoding, param_encoding); method_encoding = concatenate_strings(temporary_allocator(), method_encoding, param_encoding);
} }