From 659eebd4f7789df2c33a85461caf9f99bc8a5431 Mon Sep 17 00:00:00 2001 From: Kelly Kinkade Date: Sun, 20 Sep 2026 02:54:01 -0500 Subject: [PATCH] changes required for identity-refactor branch --- Bitfield.pm | 7 ++++--- Common.pm | 6 +++--- Enum.pm | 21 +++++++++++---------- StructFields.pm | 24 ++++++++++++++---------- codegen.pl | 1 + 5 files changed, 33 insertions(+), 26 deletions(-) diff --git a/Bitfield.pm b/Bitfield.pm index 40f0cb4de9..5d19a188f4 100644 --- a/Bitfield.pm +++ b/Bitfield.pm @@ -91,11 +91,12 @@ sub render_bitfield_core { emit "static const bitfield_item_info bits[bit_count];"; } "template<> struct ${export_prefix}bitfield_$traits_name ", ";"; emit_block { - emit "static const bitfield_identity identity;"; - emit "static const bitfield_identity *get() { return &identity; }"; + emit "static const type_identity_for<$full_name> identity;"; + emit "static const type_identity_for<$full_name> *get() { return &identity; }"; } "template<> struct ${export_prefix}identity_$traits_name ", ";"; header_ref("Export.h"); header_ref("DataDefs.h"); + header_ref("DataIdentity.h"); }; with_emit_static { @@ -112,7 +113,7 @@ sub render_bitfield_core { $lines[-1] =~ s/,$//; } "const bitfield_item_info bitfield_${traits_name}::bits[bit_count] = ", ";"; - emit "const bitfield_identity identity_${traits_name}::identity(", + emit "const type_identity_for<$full_name> identity_${traits_name}::identity(", "sizeof($full_name), ", type_identity_reference($tag,-parent => 1), ', ', "\"$name\", bitfield_${traits_name}::bit_count, bitfield_${traits_name}::bits);"; diff --git a/Common.pm b/Common.pm index c7fbccec00..2bb3fc9271 100644 --- a/Common.pm +++ b/Common.pm @@ -413,7 +413,7 @@ sub fully_qualified_name($$;$) { sub type_identity_reference($%) { my ($tag, %flags) = @_; - return 'NULL' unless $tag; + return 'nullptr' unless $tag; my $name = $tag->nodeName; @@ -431,7 +431,7 @@ sub type_identity_reference($%) { last if $tag->getAttribute('ld:typedef-name'); } - return 'NULL' unless $tag; + return 'nullptr' unless $tag; } return '&global::_identity' if $name eq 'ld:global-object'; @@ -540,7 +540,7 @@ sub generate_field_table(&$) { &with_anon($blk, 'T_'.$ftable_name); - return 'NULL' unless @field_defs; + return 'nullptr' unless @field_defs; emit "#define CUR_STRUCT $full_name"; if (%field_defs_extra) { diff --git a/Enum.pm b/Enum.pm index 7058f8c351..95a36ba108 100644 --- a/Enum.pm +++ b/Enum.pm @@ -90,11 +90,12 @@ sub render_enum_tables($$$$$$) { with_emit_traits { emit_block { - emit "const static enum_identity identity;"; - emit "const static enum_identity *get() { return &identity; }"; + emit "const static type_identity_for<$full_name> identity;"; + emit "const static type_identity_for<$full_name> *get() { return &identity; }"; } "template<> struct ${export_prefix}identity_$traits_name ", ";"; header_ref("Export.h"); header_ref("DataDefs.h"); + header_ref("DataIdentity.h"); }; # Enumerate enum attributes @@ -175,7 +176,7 @@ sub render_enum_tables($$$$$$) { for (my $i = 0; $i < @anames; $i++) { emit "$atypes[$i] $anames[$i];"; } - emit "const static struct_identity _identity;"; + emit "const static type_identity_for _identity;"; } "struct attr_entry_type ", ";"; emit "static const attr_entry_type attr_table[", $count, "+1];"; emit "static const attr_entry_type &attrs(enum_type value);"; @@ -201,7 +202,7 @@ sub render_enum_tables($$$$$$) { # Emit complex data - my $complex_ptr = 'NULL'; + my $complex_ptr = 'nullptr'; if ($complex) { my @items = $tag->findnodes('child::enum-item'); my $last_value = -1; @@ -223,8 +224,8 @@ sub render_enum_tables($$$$$$) { # Emit attrs - my $atable_ptr = 'NULL'; - my $atable_meta = 'NULL'; + my $atable_ptr = 'nullptr'; + my $atable_meta = 'nullptr'; if (@anames) { my @table_entries; @@ -296,17 +297,17 @@ sub render_enum_tables($$$$$$) { @field_defs = @field_meta; } $entry_type; - emit "const struct_identity ${entry_type}::_identity(", - "sizeof($entry_type), NULL, ", + emit "const type_identity_for<${entry_type}> ${entry_type}::_identity(", + "sizeof($entry_type), nullptr, ", type_identity_reference($tag), ', ', - "\"_attr_entry_type\", NULL, $ftable);"; + "\"_attr_entry_type\", nullptr, $ftable);"; } 'fields'; $atable_ptr = "enum_${traits_name}::attr_table"; $atable_meta = "&${entry_type}::_identity"; } - emit "const enum_identity identity_${traits_name}::identity(", + emit "const type_identity_for<$full_name> identity_${traits_name}::identity(", "sizeof($full_name), ", type_identity_reference($tag,-parent => 1), ', ', "\"$name\", TID($base_type), $base, ", diff --git a/StructFields.pm b/StructFields.pm index 7c92839fa0..5b504aac95 100644 --- a/StructFields.pm +++ b/StructFields.pm @@ -41,6 +41,7 @@ sub with_struct_block(&$;$%) { my $exp = $name ? $export_prefix : ''; header_ref("Export.h"); header_ref("DataDefs.h"); + header_ref("DataIdentity.h"); my $prefix = $kwd.' '.$exp.($name ? $name.' ' : ''); emit_comment $tag, -attr => 1; @@ -693,19 +694,21 @@ sub emit_struct_fields($$;%) { if ($in_union_body) { my $traits_name = 'identity_traits<'.$full_name.'>'; + emit "using df_identity_base = $identity_type;"; + with_emit_traits { emit_block { - emit "static const $identity_type identity;"; - emit "static const $identity_type *get() { return &identity; }"; + emit "static const type_identity_for<$full_name> identity;"; + emit "static const type_identity_for<$full_name> *get() { return &identity; }"; } "template<> struct ${export_prefix}$traits_name ", ";"; }; with_emit_static { my $ftable = render_field_metadata $tag, $full_name, @fields, %info; - emit "const $identity_type ${traits_name}::identity(", + emit "const type_identity_for<$full_name> ${traits_name}::identity(", "sizeof($full_name), &allocator_fn<${full_name}>, ", type_identity_reference($tag,-parent => 1), ', ', - "\"$name\", NULL, $ftable);"; + "\"$name\", nullptr, $ftable);"; } 'fields-' . $fields_group; # Needed for unions with fields with non-default ctors (e.g. bitfields) @@ -731,7 +734,8 @@ sub emit_struct_fields($$;%) { my $inherits = $flags{-inherits}; my $original_name = $tag->getAttribute('original-name'); - emit "static const $identity_type _identity;"; + emit "using df_identity_base = $identity_type;"; + emit "static const type_identity_for<$full_name> _identity;"; with_emit_static { local @simple_inits; @@ -771,18 +775,18 @@ sub emit_struct_fields($$;%) { my $ftable = render_field_metadata $tag, $full_name, @fields, %info; if ($flags{-class}) { - emit "const virtual_identity ${full_name}::_identity(", + emit "const type_identity_for<${full_name}> ${full_name}::_identity(", "sizeof($full_name), &${alloc_fn}<${full_name}>, ", "\"$name\", ", - ($original_name ? "\"$original_name\"" : 'NULL'), ', ', - ($inherits ? "&${inherits}::_identity" : 'NULL'), ', ', + ($original_name ? "\"$original_name\"" : 'nullptr'), ', ', + ($inherits ? "&${inherits}::_identity" : 'nullptr'), ', ', "$ftable);"; } else { - emit "const $identity_type ${full_name}::_identity(", + emit "const type_identity_for<${full_name}> ${full_name}::_identity(", "sizeof($full_name), &allocator_fn<${full_name}>, ", type_identity_reference($tag,-parent => 1), ', ', "\"$name\", ", - ($inherits ? "&${inherits}::_identity" : 'NULL'), ', ', + ($inherits ? "&${inherits}::_identity" : 'nullptr'), ', ', "${ftable}${maybe_index_enum});"; } } 'fields-' . $fields_group unless $flags{-noidentity}; diff --git a/codegen.pl b/codegen.pl index ad2edbe372..d5243c1b07 100755 --- a/codegen.pl +++ b/codegen.pl @@ -112,6 +112,7 @@ BEGIN emit_block { emit "void InitGlobals();"; + header_ref("DataIdentity.h"); emit "extern ", $export_prefix, "global_identity _identity;"; for my $name (sort { $a cmp $b } keys %globals) {