feat: erases all types with unspecific classes.

This commit is contained in:
2025-02-04 03:07:43 +08:00
parent e64e8600c5
commit 43552930d0
3 changed files with 34 additions and 3 deletions

View File

@@ -5,6 +5,7 @@ import util.string as StrUtil
# storage
defined_classes = dict()
empty_class_all_names = set()
class ClassDefine:
@@ -30,6 +31,13 @@ def add_class_record(path: str, namespace: str, class_name: str, is_template: bo
path[path.find('src/') + 4 :], is_template, is_empty
)
if is_empty:
all_name = ''
if namespace != '':
all_name += namespace + '::'
all_name += class_name
empty_class_all_names.add(all_name)
def query_class_record_strict(namespace_decl: str, class_decl: str) -> ClassDefine:
assert namespace_decl in defined_classes, f'namespace = "{namespace_decl}" is not recorded.'

View File

@@ -172,14 +172,30 @@ def process(path_to_file: str, args: Options):
type_name = matched[3]
var_name = matched[4]
if not StrUtil.endswith_m(type_name, '&', '*'):
for empty_class in HeaderPreProcessor.empty_class_all_names:
if (
empty_class in type_name
or 'WeakRef<' in type_name # TODO: remove it.
or '::entt::basic_registry<' in type_name
or '::Bedrock::Application::ThreadOwner<' in type_name
):
print(f'erased: {type_name}')
content += f'\talignas({align}) std::byte {var_name}_TYPEREMOVED[{size}];\n'
in_member_variable = False
break
if not in_member_variable:
continue
member_variable_types.append(type_name)
security_check = ''
if args.add_sizeof_alignof_static_assertions:
security_check += f'\tstatic_assert(sizeof({var_name}) == {size});\n'
security_check += (
f'\tstatic_assert(alignof(decltype({var_name})) == {align});\n'
)
# TODO: ensure alignment requirements.
# security_check += (
# f'\tstatic_assert(alignof(decltype({var_name})) == {align});\n'
# )
if type_name.endswith(']'): # is c-style array
array_length = int(type_name[type_name.find('[') + 1 : type_name.find(']')])

View File

@@ -10,6 +10,13 @@ def startswith_m(con: str, *args) -> bool:
return False
def endswith_m(con: str, *args) -> bool:
for arg in args:
if con.endswith(arg):
return True
return False
def find_m(con: str, *args) -> int:
for arg in args:
pos = con.find(arg)