@@ -1223,31 +1223,62 @@ mono_loader_install_pinvoke_override (PInvokeOverrideFn override_fn)
12231223 pinvoke_override = override_fn ;
12241224}
12251225
1226- // Keep synced with FixupSymbolName from src/tasks/Common/Utils.cs
1227- char * mono_fixup_symbol_name ( char * key ) {
1228- char * fixedName = malloc ( 256 );
1229- int sb_index = 0 ;
1230- int len = ( int ) strlen ( key );
1226+ static gboolean
1227+ is_symbol_char_verbatim ( unsigned char b )
1228+ {
1229+ return (( b >= '0' && b <= '9' ) || ( b >= 'a' && b <= 'z' ) || ( b >= 'A' && b <= 'Z' )) ;
1230+ }
12311231
1232- for (int i = 0 ; i < len ; ++ i ) {
1232+ static gboolean
1233+ is_symbol_char_underscore (unsigned char c )
1234+ {
1235+ switch (c ) {
1236+ case '_' :
1237+ case '.' :
1238+ case '-' :
1239+ case '+' :
1240+ case '<' :
1241+ case '>' :
1242+ return TRUE;
1243+ default :
1244+ return FALSE;
1245+ }
1246+ }
1247+
1248+ static size_t mono_precompute_size (const char * key )
1249+ {
1250+ size_t size = 1 ; // Null terminator
1251+ size_t len = (int )strlen (key );
1252+ for (size_t i = 0 ; i < len ; ++ i ) {
12331253 unsigned char b = key [i ];
1234- if ((b >= '0' && b <= '9' ) ||
1235- (b >= 'a' && b <= 'z' ) ||
1236- (b >= 'A' && b <= 'Z' ) ||
1237- (b == '_' )) {
1238- fixedName [sb_index ++ ] = b ;
1239- }
1240- else if (b == '.' || b == '-' || b == '+' || b == '<' || b == '>' ) {
1241- fixedName [sb_index ++ ] = '_' ;
1254+ if (is_symbol_char_verbatim (b ) || is_symbol_char_underscore (b )) {
1255+ size ++ ;
12421256 }
12431257 else {
1244- // Append the hexadecimal representation of b between underscores
1245- sprintf (& fixedName [sb_index ], "_%X_" , b );
1246- sb_index += 4 ; // Move the index after the appended hexadecimal characters
1258+ size += 4 ;
12471259 }
12481260 }
1261+ return size ;
1262+ }
12491263
1250- // Null-terminate the fixedName string
1251- fixedName [sb_index ] = '\0' ;
1252- return fixedName ;
1264+ // Keep synced with FixupSymbolName from src/tasks/Common/Utils.cs
1265+ char * mono_fixup_symbol_name (const char * prefix , const char * key , const char * suffix ) {
1266+ size_t size = mono_precompute_size (key ) + strlen (prefix ) + strlen (suffix );
1267+ GString * str = g_string_sized_new (size );
1268+ size_t len = (int )strlen (key );
1269+ g_string_append_printf (str , "%s" , prefix );
1270+
1271+ for (size_t i = 0 ; i < len ; ++ i ) {
1272+ unsigned char b = key [i ];
1273+ if (is_symbol_char_verbatim (b )) {
1274+ g_string_append_c (str , b );
1275+ } else if (is_symbol_char_underscore (b )) {
1276+ g_string_append_c (str , '_' );
1277+ } else {
1278+ // Append the hex representation of b between underscores
1279+ g_string_append_printf (str , "_%X_" , b );
1280+ }
1281+ }
1282+ g_string_append_printf (str , "%s" , suffix );
1283+ return g_string_free (str , FALSE);
12531284}
0 commit comments