From c2655ad41ff79565ffa476c337e1fc82cba06f39 Mon Sep 17 00:00:00 2001 From: YBronst <157227982+YBronst@users.noreply.github.com> Date: Mon, 9 Mar 2026 15:27:21 +0200 Subject: [PATCH 1/4] squash squash mege --- Clover.dsc | 5 ----- MdePkg/Include/Base.h | 2 +- rEFIt_UEFI/Platform/APFS.cpp | 2 +- .../cpp_util/operatorNewDelete.cpp | 5 ----- .../cpp_util/operatorNewDelete.cpp | 9 ++------- .../cpp_util/operatorNewDelete.cpp | 9 ++------- rEFIt_UEFI/cpp_foundation/XString.h | 16 +++++++-------- rEFIt_UEFI/cpp_foundation/XStringAbstract.h | 20 ++++++++----------- rEFIt_UEFI/libeg/XTheme.cpp | 6 +++--- rEFIt_UEFI/refit/main.cpp | 8 +------- 10 files changed, 26 insertions(+), 56 deletions(-) diff --git a/Clover.dsc b/Clover.dsc index 6d48ad99a6..0e5b882bd6 100644 --- a/Clover.dsc +++ b/Clover.dsc @@ -1042,11 +1042,6 @@ DEFINE LESS_DEBUG_FLAG = -DLESS_DEBUG DEFINE ENABLE_MODERN_CPU_QUIRKS_FLAG = -DENABLE_MODERN_CPU_QUIRKS !endif - -!ifdef NO_MSABI_VA_FUNCS -DEFINE NO_MSABI_VA_FUNCS_FLAG = -DNO_MSABI_VA_FUNCS -!endif - DEFINE BUILD_OPTIONS=-DIS_UEFI_MODULE -DMDEPKG_NDEBUG -DCLOVER_BUILD -DLESS_DEBUG $(VBIOS_PATCH_CLOVEREFI_FLAG) $(ONLY_SATA_0_FLAG) $(BLOCKIO_FLAG) $(NOUSB_FLAG) $(NOUDMA_FLAG) $(AMD_FLAG) $(SECURE_BOOT_FLAG) $(ANDX86_FLAG) $(PS2MOUSE_LEGACYBOOT_FLAG) $(DEBUG_ON_SERIAL_PORT_FLAG) $(EXIT_USBKB_FLAG) $(JIEF_DEBUG_FLAG) $(ENABLE_MODERN_CPU_QUIRKS_FLAG) -DDISABLE_NEW_DEPRECATED_INTERFACES -DOC_TARGET_DEBUG XCODE:DEBUG_*_*_CC_FLAGS = diff --git a/MdePkg/Include/Base.h b/MdePkg/Include/Base.h index f628abad1b..058a389bd0 100644 --- a/MdePkg/Include/Base.h +++ b/MdePkg/Include/Base.h @@ -635,7 +635,7 @@ typedef char* VA_LIST; #define VA_END(Marker) (Marker = (VA_LIST) 0) #define VA_COPY(Dest, Start) ((void)((Dest) = (Start))) -#elif defined(__GNUC__) || defined(__clang__) //SI? +#elif defined(__GNUC__) || defined(__clang__) #if defined(MDE_CPU_X64) && !defined(NO_MSABI_VA_FUNCS) // diff --git a/rEFIt_UEFI/Platform/APFS.cpp b/rEFIt_UEFI/Platform/APFS.cpp index b368023530..0deae3d1c7 100644 --- a/rEFIt_UEFI/Platform/APFS.cpp +++ b/rEFIt_UEFI/Platform/APFS.cpp @@ -49,7 +49,7 @@ EFI_GUID APFSPartitionUUIDExtract( } if (DevicePathType(DevicePath) == MEDIA_DEVICE_PATH && DevicePathSubType (DevicePath) == MEDIA_VENDOR_DP) { //Check that vendor-assigned EFI_GUID defines APFS Container Partition - if ( ApfsSignatureUUID == *(const EFI_GUID *)((UINT8 *)DevicePath+0x04) ) { + if ( ApfsSignatureUUID == *(EFI_GUID *)((UINT8 *)DevicePath+0x04) ) { return *(EFI_GUID *)((UINT8 *)DevicePath+0x14); } } diff --git a/rEFIt_UEFI/PlatformEFI/cpp_util/operatorNewDelete.cpp b/rEFIt_UEFI/PlatformEFI/cpp_util/operatorNewDelete.cpp index f11bafb0d5..1aee545b8a 100644 --- a/rEFIt_UEFI/PlatformEFI/cpp_util/operatorNewDelete.cpp +++ b/rEFIt_UEFI/PlatformEFI/cpp_util/operatorNewDelete.cpp @@ -51,11 +51,6 @@ void operator delete ( void* ptr ) noexcept FreePool(ptr); } -void operator delete[](void* ptr) noexcept -{ - FreePool(ptr); -} - #ifdef _MSC_VER void _cdecl operator delete (void * ptr, unsigned __int64 count) #else diff --git a/rEFIt_UEFI/PlatformPOSIX+EFI/cpp_util/operatorNewDelete.cpp b/rEFIt_UEFI/PlatformPOSIX+EFI/cpp_util/operatorNewDelete.cpp index 3ba02e2ec5..daf9a10290 100644 --- a/rEFIt_UEFI/PlatformPOSIX+EFI/cpp_util/operatorNewDelete.cpp +++ b/rEFIt_UEFI/PlatformPOSIX+EFI/cpp_util/operatorNewDelete.cpp @@ -48,12 +48,7 @@ void operator delete ( void* ptr ) noexcept { // ++operator_delete_count1; // MemLogf(false, 0, "operator delete(%llx) %lld\n", uintptr_t(ptr), operator_delete_count1); - FreePool(ptr); -} - -void operator delete[](void* ptr) noexcept -{ - FreePool(ptr); + return FreePool(ptr); } #ifdef _MSC_VER @@ -64,7 +59,7 @@ void operator delete (void * ptr, UINTN count) { // ++operator_delete_count2; // MemLogf(false, 0, "operator delete(%llx, %lld) %lld\n", uintptr_t(ptr), count, operator_delete_count2); - FreePool(ptr); + return FreePool(ptr); } diff --git a/rEFIt_UEFI/PlatformPOSIX/cpp_util/operatorNewDelete.cpp b/rEFIt_UEFI/PlatformPOSIX/cpp_util/operatorNewDelete.cpp index 3ba02e2ec5..daf9a10290 100644 --- a/rEFIt_UEFI/PlatformPOSIX/cpp_util/operatorNewDelete.cpp +++ b/rEFIt_UEFI/PlatformPOSIX/cpp_util/operatorNewDelete.cpp @@ -48,12 +48,7 @@ void operator delete ( void* ptr ) noexcept { // ++operator_delete_count1; // MemLogf(false, 0, "operator delete(%llx) %lld\n", uintptr_t(ptr), operator_delete_count1); - FreePool(ptr); -} - -void operator delete[](void* ptr) noexcept -{ - FreePool(ptr); + return FreePool(ptr); } #ifdef _MSC_VER @@ -64,7 +59,7 @@ void operator delete (void * ptr, UINTN count) { // ++operator_delete_count2; // MemLogf(false, 0, "operator delete(%llx, %lld) %lld\n", uintptr_t(ptr), count, operator_delete_count2); - FreePool(ptr); + return FreePool(ptr); } diff --git a/rEFIt_UEFI/cpp_foundation/XString.h b/rEFIt_UEFI/cpp_foundation/XString.h index fbac3b8060..8b4b43a7a9 100644 --- a/rEFIt_UEFI/cpp_foundation/XString.h +++ b/rEFIt_UEFI/cpp_foundation/XString.h @@ -34,7 +34,7 @@ class LString8 : public LString // no assignement, no destructor - friend constexpr LString8 operator ""_XS8 ( const char* s, size_t size) { return LString8(s, size); } + friend constexpr LString8 operator "" _XS8 ( const char* s, size_t size) { return LString8(s, size); } const char* c_str() const { return data(); } @@ -101,7 +101,7 @@ class LString16 : public LString constexpr LString16(const char16_t* s, size_t size) : LString(s) {}; #endif - friend constexpr LString16 operator ""_XS16 ( const char16_t* s, size_t size) { return LString16(s, size); } + friend constexpr LString16 operator "" _XS16 ( const char16_t* s, size_t size) { return LString16(s, size); } }; class XString16 : public XStringAbstract @@ -132,7 +132,7 @@ class LString32 : public LString constexpr LString32(const char32_t* s, size_t size) : LString(s) {}; #endif - friend constexpr LString32 operator ""_XS32 ( const char32_t* s, size_t size) { return LString32(s, size); } + friend constexpr LString32 operator "" _XS32 ( const char32_t* s, size_t size) { return LString32(s, size); } }; class XString32 : public XStringAbstract @@ -167,7 +167,7 @@ class LStringW : public LString constexpr LStringW(const wchar_t* s, size_t size) : LString(s) {}; #endif - friend constexpr LStringW operator ""_XSW ( const wchar_t* s, size_t size) { return LStringW(s, size); } + friend constexpr LStringW operator "" _XSW ( const wchar_t* s, size_t size) { return LStringW(s, size); } const wchar_t* wc_str() const { return data(); } }; @@ -226,10 +226,10 @@ class XStringW : public XStringAbstract }; -constexpr LString8 operator ""_XS8 ( const char* s, size_t len); -constexpr LString16 operator ""_XS16 ( const char16_t* s, size_t len); -constexpr LString32 operator ""_XS32 ( const char32_t* s, size_t len); -constexpr LStringW operator ""_XSW ( const wchar_t* s, size_t len); +constexpr LString8 operator "" _XS8 ( const char* s, size_t len); +constexpr LString16 operator "" _XS16 ( const char16_t* s, size_t len); +constexpr LString32 operator "" _XS32 ( const char32_t* s, size_t len); +constexpr LStringW operator "" _XSW ( const wchar_t* s, size_t len); #ifdef _MSC_VER diff --git a/rEFIt_UEFI/cpp_foundation/XStringAbstract.h b/rEFIt_UEFI/cpp_foundation/XStringAbstract.h index d9903724b0..f271dc40f0 100644 --- a/rEFIt_UEFI/cpp_foundation/XStringAbstract.h +++ b/rEFIt_UEFI/cpp_foundation/XStringAbstract.h @@ -501,9 +501,8 @@ class __String { } ThisXStringClass subString(size_t pos, size_t count) const { - size_t len = length(); - if (pos >= len || count == 0) return ThisXStringClass(); - if (count > len - pos) count = len - pos; + // if ( pos > length() ) return ThisXStringClass(); + // if ( count > length()-pos ) count = length()-pos; ThisXStringClass ret; @@ -1018,7 +1017,7 @@ class XStringAbstract : public __String { ~XStringAbstract() { // DBG_XSTRING("Destructor :%ls\n", data()); if (m_allocatedSize > 0) - delete[] super::__m_data; + free((void *)super::__m_data); } #ifdef XSTRING_CACHING_OF_SIZE @@ -1086,13 +1085,10 @@ class XStringAbstract : public __String { #endif /* Copy Assign */ XStringAbstract &operator=(const XStringAbstract &S) { - if (this == &S) { - return *this; - } if (S.data() && S.m_allocatedSize == 0) { // S points to a litteral if (m_allocatedSize > 0) { - delete[] super::__m_data; + delete super::__m_data; m_allocatedSize = 0; } super::__m_data = @@ -1110,7 +1106,7 @@ class XStringAbstract : public __String { /* Copy Assign */ XStringAbstract &operator=(const ls_t &S) { if (m_allocatedSize > 0) { - delete[] super::__m_data; + delete super::__m_data; m_allocatedSize = 0; } super::__m_data = (T *)S.data(); // because it's a litteral, we don't copy. @@ -1635,7 +1631,7 @@ class XStringAbstract : public __String { /* size is in number of technical chars, NOT in bytes */ ThisXStringClass &stealValueFrom(T *S, size_t allocatedSize) { if (m_allocatedSize > 0) - delete[] super::__m_data; + delete super::__m_data; super::__m_data = S; #ifdef XSTRING_CACHING_OF_SIZE super::__m_size = utf_size_of_utf_string(super::__m_data, super::__m_data); @@ -1648,7 +1644,7 @@ class XStringAbstract : public __String { // a future realloc may fail as EDK want the old size. ThisXStringClass &stealValueFrom(T *S) { if (m_allocatedSize > 0) - delete[] super::__m_data; + delete super::__m_data; super::__m_data = S; #ifdef XSTRING_CACHING_OF_SIZE super::__m_size = utf_size_of_utf_string(super::__m_data, super::__m_data); @@ -1661,7 +1657,7 @@ class XStringAbstract : public __String { ThisXStringClass &stealValueFrom(ThisXStringClass *S) { if (m_allocatedSize > 0) - delete[] super::__m_data; + delete super::__m_data; #ifdef XSTRING_CACHING_OF_SIZE super::__m_size = S->size(); #endif diff --git a/rEFIt_UEFI/libeg/XTheme.cpp b/rEFIt_UEFI/libeg/XTheme.cpp index 28926a469b..630dfbc179 100644 --- a/rEFIt_UEFI/libeg/XTheme.cpp +++ b/rEFIt_UEFI/libeg/XTheme.cpp @@ -867,17 +867,17 @@ const XIcon& XTheme::LoadOSIcon(const XString8& Full) DBG(" first=%s\n", First.c_str()); if (!ReturnIcon->isEmpty()) return *ReturnIcon; //else search second name - Second = "os_"_XS8 + Full.subString(Comma + 1, MAX_XSIZE); + Second = "os_"_XS8 + Full.subString(Comma + 1, Size - Comma - 1); //moreover names can be triple L"chrome,grub,linux" UINTN SecondComma = Second.indexOf(','); - if (SecondComma == MAX_XSIZE) { + if (Comma == MAX_XSIZE) { ReturnIcon = &GetIcon(Second); if (!ReturnIcon->isEmpty()) return *ReturnIcon; } else { First = Second.subString(0, SecondComma); ReturnIcon = &GetIcon(First); if (!ReturnIcon->isEmpty()) return *ReturnIcon; - Third = "os_"_XS8 + Second.subString(SecondComma + 1, MAX_XSIZE); + Third = "os_"_XS8 + Second.subString(SecondComma + 1, Size - SecondComma - 1); ReturnIcon = &GetIcon(Third); if (!ReturnIcon->isEmpty()) return *ReturnIcon; } diff --git a/rEFIt_UEFI/refit/main.cpp b/rEFIt_UEFI/refit/main.cpp index 9ed8f79ee2..029d69261a 100644 --- a/rEFIt_UEFI/refit/main.cpp +++ b/rEFIt_UEFI/refit/main.cpp @@ -1686,14 +1686,8 @@ void LOADER_ENTRY::StartLoader() (UINT8 *)SysRoot; size_t i1 = forceKext.rindexOf("\\") + 1; - if (i1 == MAX_XSIZE) i1 = 0; size_t i2 = forceKext.rindexOf("."); - XStringW identifier; - if (i2 != MAX_XSIZE && i2 > i1) { - identifier = forceKext.subString(i1, i2 - i1); - } else { - identifier = forceKext.subString(i1, MAX_XSIZE); - } + XStringW identifier = forceKext.subString(i1, i2 - i1); OC_STRING_ASSIGN( mOpenCoreConfiguration.Kernel.Force.Values[kextIdx]->Identifier, S8Printf("%ls", identifier.wc_str()).c_str()); From f2dff298a192c9aaac50b6763efede1807c67529 Mon Sep 17 00:00:00 2001 From: YBronst <157227982+YBronst@users.noreply.github.com> Date: Mon, 9 Mar 2026 16:54:38 +0200 Subject: [PATCH 2/4] Update XString.h --- rEFIt_UEFI/cpp_foundation/XString.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/rEFIt_UEFI/cpp_foundation/XString.h b/rEFIt_UEFI/cpp_foundation/XString.h index 8b4b43a7a9..e8901e8613 100644 --- a/rEFIt_UEFI/cpp_foundation/XString.h +++ b/rEFIt_UEFI/cpp_foundation/XString.h @@ -34,7 +34,7 @@ class LString8 : public LString // no assignement, no destructor - friend constexpr LString8 operator "" _XS8 ( const char* s, size_t size) { return LString8(s, size); } + friend constexpr LString8 operator ""_XS8 ( const char* s, size_t size) { return LString8(s, size); } const char* c_str() const { return data(); } @@ -226,10 +226,10 @@ class XStringW : public XStringAbstract }; -constexpr LString8 operator "" _XS8 ( const char* s, size_t len); -constexpr LString16 operator "" _XS16 ( const char16_t* s, size_t len); -constexpr LString32 operator "" _XS32 ( const char32_t* s, size_t len); -constexpr LStringW operator "" _XSW ( const wchar_t* s, size_t len); +constexpr LString8 operator ""_XS8 ( const char* s, size_t len); +constexpr LString16 operator ""_XS16 ( const char16_t* s, size_t len); +constexpr LString32 operator ""_XS32 ( const char32_t* s, size_t len); +constexpr LStringW operator ""_XSW ( const wchar_t* s, size_t len); #ifdef _MSC_VER From 1d83dd40c636bc9131b67615dcc273de3303312e Mon Sep 17 00:00:00 2001 From: YBronst <157227982+YBronst@users.noreply.github.com> Date: Mon, 9 Mar 2026 18:56:07 +0200 Subject: [PATCH 3/4] Last Fix --- Clover.dsc | 5 +++++ MdePkg/Include/Base.h | 2 +- rEFIt_UEFI/cpp_foundation/XString.h | 6 +++--- rEFIt_UEFI/libeg/XTheme.cpp | 6 +++--- 4 files changed, 12 insertions(+), 7 deletions(-) diff --git a/Clover.dsc b/Clover.dsc index 0e5b882bd6..6d48ad99a6 100644 --- a/Clover.dsc +++ b/Clover.dsc @@ -1042,6 +1042,11 @@ DEFINE LESS_DEBUG_FLAG = -DLESS_DEBUG DEFINE ENABLE_MODERN_CPU_QUIRKS_FLAG = -DENABLE_MODERN_CPU_QUIRKS !endif + +!ifdef NO_MSABI_VA_FUNCS +DEFINE NO_MSABI_VA_FUNCS_FLAG = -DNO_MSABI_VA_FUNCS +!endif + DEFINE BUILD_OPTIONS=-DIS_UEFI_MODULE -DMDEPKG_NDEBUG -DCLOVER_BUILD -DLESS_DEBUG $(VBIOS_PATCH_CLOVEREFI_FLAG) $(ONLY_SATA_0_FLAG) $(BLOCKIO_FLAG) $(NOUSB_FLAG) $(NOUDMA_FLAG) $(AMD_FLAG) $(SECURE_BOOT_FLAG) $(ANDX86_FLAG) $(PS2MOUSE_LEGACYBOOT_FLAG) $(DEBUG_ON_SERIAL_PORT_FLAG) $(EXIT_USBKB_FLAG) $(JIEF_DEBUG_FLAG) $(ENABLE_MODERN_CPU_QUIRKS_FLAG) -DDISABLE_NEW_DEPRECATED_INTERFACES -DOC_TARGET_DEBUG XCODE:DEBUG_*_*_CC_FLAGS = diff --git a/MdePkg/Include/Base.h b/MdePkg/Include/Base.h index 058a389bd0..f628abad1b 100644 --- a/MdePkg/Include/Base.h +++ b/MdePkg/Include/Base.h @@ -635,7 +635,7 @@ typedef char* VA_LIST; #define VA_END(Marker) (Marker = (VA_LIST) 0) #define VA_COPY(Dest, Start) ((void)((Dest) = (Start))) -#elif defined(__GNUC__) || defined(__clang__) +#elif defined(__GNUC__) || defined(__clang__) //SI? #if defined(MDE_CPU_X64) && !defined(NO_MSABI_VA_FUNCS) // diff --git a/rEFIt_UEFI/cpp_foundation/XString.h b/rEFIt_UEFI/cpp_foundation/XString.h index e8901e8613..fbac3b8060 100644 --- a/rEFIt_UEFI/cpp_foundation/XString.h +++ b/rEFIt_UEFI/cpp_foundation/XString.h @@ -101,7 +101,7 @@ class LString16 : public LString constexpr LString16(const char16_t* s, size_t size) : LString(s) {}; #endif - friend constexpr LString16 operator "" _XS16 ( const char16_t* s, size_t size) { return LString16(s, size); } + friend constexpr LString16 operator ""_XS16 ( const char16_t* s, size_t size) { return LString16(s, size); } }; class XString16 : public XStringAbstract @@ -132,7 +132,7 @@ class LString32 : public LString constexpr LString32(const char32_t* s, size_t size) : LString(s) {}; #endif - friend constexpr LString32 operator "" _XS32 ( const char32_t* s, size_t size) { return LString32(s, size); } + friend constexpr LString32 operator ""_XS32 ( const char32_t* s, size_t size) { return LString32(s, size); } }; class XString32 : public XStringAbstract @@ -167,7 +167,7 @@ class LStringW : public LString constexpr LStringW(const wchar_t* s, size_t size) : LString(s) {}; #endif - friend constexpr LStringW operator "" _XSW ( const wchar_t* s, size_t size) { return LStringW(s, size); } + friend constexpr LStringW operator ""_XSW ( const wchar_t* s, size_t size) { return LStringW(s, size); } const wchar_t* wc_str() const { return data(); } }; diff --git a/rEFIt_UEFI/libeg/XTheme.cpp b/rEFIt_UEFI/libeg/XTheme.cpp index 630dfbc179..28926a469b 100644 --- a/rEFIt_UEFI/libeg/XTheme.cpp +++ b/rEFIt_UEFI/libeg/XTheme.cpp @@ -867,17 +867,17 @@ const XIcon& XTheme::LoadOSIcon(const XString8& Full) DBG(" first=%s\n", First.c_str()); if (!ReturnIcon->isEmpty()) return *ReturnIcon; //else search second name - Second = "os_"_XS8 + Full.subString(Comma + 1, Size - Comma - 1); + Second = "os_"_XS8 + Full.subString(Comma + 1, MAX_XSIZE); //moreover names can be triple L"chrome,grub,linux" UINTN SecondComma = Second.indexOf(','); - if (Comma == MAX_XSIZE) { + if (SecondComma == MAX_XSIZE) { ReturnIcon = &GetIcon(Second); if (!ReturnIcon->isEmpty()) return *ReturnIcon; } else { First = Second.subString(0, SecondComma); ReturnIcon = &GetIcon(First); if (!ReturnIcon->isEmpty()) return *ReturnIcon; - Third = "os_"_XS8 + Second.subString(SecondComma + 1, Size - SecondComma - 1); + Third = "os_"_XS8 + Second.subString(SecondComma + 1, MAX_XSIZE); ReturnIcon = &GetIcon(Third); if (!ReturnIcon->isEmpty()) return *ReturnIcon; } From c9d1fe9d5750be2e4a0d2c056b181f4468544f10 Mon Sep 17 00:00:00 2001 From: YBronst <157227982+YBronst@users.noreply.github.com> Date: Tue, 10 Mar 2026 17:51:35 +0200 Subject: [PATCH 4/4] Syntax correction Syntax correction. --- MdePkg/Include/Base.h | 2 +- rEFIt_UEFI/cpp_foundation/XStringAbstract.h | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/MdePkg/Include/Base.h b/MdePkg/Include/Base.h index f628abad1b..058a389bd0 100644 --- a/MdePkg/Include/Base.h +++ b/MdePkg/Include/Base.h @@ -635,7 +635,7 @@ typedef char* VA_LIST; #define VA_END(Marker) (Marker = (VA_LIST) 0) #define VA_COPY(Dest, Start) ((void)((Dest) = (Start))) -#elif defined(__GNUC__) || defined(__clang__) //SI? +#elif defined(__GNUC__) || defined(__clang__) #if defined(MDE_CPU_X64) && !defined(NO_MSABI_VA_FUNCS) // diff --git a/rEFIt_UEFI/cpp_foundation/XStringAbstract.h b/rEFIt_UEFI/cpp_foundation/XStringAbstract.h index f271dc40f0..b0e182dcb0 100644 --- a/rEFIt_UEFI/cpp_foundation/XStringAbstract.h +++ b/rEFIt_UEFI/cpp_foundation/XStringAbstract.h @@ -1014,11 +1014,11 @@ class XStringAbstract : public __String { *this = S; } - ~XStringAbstract() { - // DBG_XSTRING("Destructor :%ls\n", data()); - if (m_allocatedSize > 0) - free((void *)super::__m_data); - } + ~XStringAbstract() { + // DBG_XSTRING("Destructor :%ls\n", data()); + if (m_allocatedSize > 0) + delete super::__m_data; + } #ifdef XSTRING_CACHING_OF_SIZE /* ctor */