mirror of
https://github.com/Ed94/gencpp.git
synced 2024-12-22 07:44:45 -08:00
Started to fix some runtime bugs.
This commit is contained in:
parent
59042a162c
commit
d00de42969
2
.vscode/c_cpp_properties.json
vendored
2
.vscode/c_cpp_properties.json
vendored
@ -13,7 +13,7 @@
|
||||
],
|
||||
"windowsSdkVersion": "10.0.19041.0",
|
||||
"compilerPath": "C:/Users/Ed/scoop/apps/llvm/current/bin/clang++.exe",
|
||||
"intelliSenseMode": "windows-clang-x64"
|
||||
"intelliSenseMode": "windows-clang-x64",
|
||||
}
|
||||
],
|
||||
"version": 4
|
||||
|
31
.vscode/gencpp.natvis
vendored
Normal file
31
.vscode/gencpp.natvis
vendored
Normal file
@ -0,0 +1,31 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<AutoVisualizer xmlns="http://schemas.microsoft.com/vstudio/debugger/natvis/2010">
|
||||
|
||||
<Type Name="String">
|
||||
<DisplayString Condition="Data == nullptr">null</DisplayString>
|
||||
<DisplayString>{Data,na}</DisplayString>
|
||||
<Expand>
|
||||
<!-- Define a synthetic child element for the Header -->
|
||||
<Synthetic Name="Header">
|
||||
<!-- Construct a Header object from the Data pointer -->
|
||||
<DisplayString>{(Header*)((char*)Data - sizeof(Header))}</DisplayString>
|
||||
<!-- Define the children of the synthetic element -->
|
||||
<Expand>
|
||||
<Item Name="Allocator">((Header*)((char*)Data - sizeof(Header)))->Allocator</Item>
|
||||
<Item Name="Length">((Header*)((char*)Data - sizeof(Header)))->Length</Item>
|
||||
<Item Name="Capacity">((Header*)((char*)Data - sizeof(Header)))->Capacity</Item>
|
||||
</Expand>
|
||||
</Synthetic>
|
||||
</Expand>
|
||||
</Type>
|
||||
|
||||
<Type Name="String::Header">
|
||||
<DisplayString>Length: {Length}, Capacity: {Capacity}</DisplayString>
|
||||
<Expand>
|
||||
<Item Name="Allocator">Allocator</Item>
|
||||
<Item Name="Length">Length</Item>
|
||||
<Item Name="Capacity">Capacity</Item>
|
||||
</Expand>
|
||||
</Type>
|
||||
|
||||
</AutoVisualizer>
|
84
.vscode/gencpp_lldbvis.py
vendored
Normal file
84
.vscode/gencpp_lldbvis.py
vendored
Normal file
@ -0,0 +1,84 @@
|
||||
import lldb
|
||||
|
||||
class String_SyntheticChildrenProvider:
|
||||
def __init__(self, valobj, internal_dict):
|
||||
self.valobj = valobj
|
||||
|
||||
def num_children(self):
|
||||
return 3
|
||||
|
||||
def get_child_index(self, name):
|
||||
if name == "Data":
|
||||
return 0
|
||||
if name == "Length":
|
||||
return 1
|
||||
if name == "Capacity":
|
||||
return 2
|
||||
|
||||
return None
|
||||
|
||||
def get_child_at_index(self, index):
|
||||
if index == 0:
|
||||
return self.valobj.GetChildMemberWithName("Data")
|
||||
|
||||
data = self.valobj.GetChildMemberWithName("Data")
|
||||
header_ptr = data.GetValueAsUnsigned() - 16
|
||||
target = self.valobj.GetTarget()
|
||||
header_type = target.FindFirstType("gen::String::Header")
|
||||
header = self.valobj.CreateValueFromAddress("Header", header_ptr, header_type)
|
||||
|
||||
if index == 1:
|
||||
return header.GetChildMemberWithName("Length")
|
||||
|
||||
if index == 2:
|
||||
return header.GetChildMemberWithName("Capacity")
|
||||
|
||||
return None
|
||||
|
||||
def update(self):
|
||||
pass
|
||||
|
||||
def list_synthetic_providers(debugger):
|
||||
print("Listing synthetic providers (start)")
|
||||
|
||||
num_categories = debugger.GetNumCategories()
|
||||
print("Debugger language categories count:", num_categories)
|
||||
|
||||
cpp_category = None
|
||||
for i in range(num_categories):
|
||||
print("WERE HERE")
|
||||
print(debugger)
|
||||
cat = debugger.GetCategoryAtIndex(i)
|
||||
print("Category name: {}, language: {}".format(cat.GetName(), cat.GetLanguage()))
|
||||
if cat.GetLanguage() == lldb.eLanguageTypeC_plus_plus:
|
||||
cpp_category = cat
|
||||
break
|
||||
|
||||
if not cpp_category:
|
||||
print("Could not get C++ category")
|
||||
return
|
||||
|
||||
synthetic_providers = cpp_category.GetSyntheticChildren()
|
||||
if not synthetic_providers:
|
||||
print("Could not get synthetic children")
|
||||
return
|
||||
|
||||
num_providers = synthetic_providers.GetSize()
|
||||
print("Number of synthetic providers:", num_providers)
|
||||
|
||||
for i in range(num_providers):
|
||||
provider = synthetic_providers.GetSyntheticChildAtIndex(i)
|
||||
print("Provider regex: {}, class name: {}".format(provider.GetRegex(), provider.GetDescription()))
|
||||
|
||||
print("Listing synthetic providers (finish)")
|
||||
|
||||
|
||||
|
||||
|
||||
def __lldb_init_module(debugger, internal_dict):
|
||||
print("Importing the String visualization")
|
||||
debugger.HandleCommand("type synthetic add -x '^gen::String$' -l gencpp_libvis.String_SyntheticChildrenProvider")
|
||||
print("Before list_synthetic_providers")
|
||||
list_synthetic_providers(debugger)
|
||||
|
||||
lldb.debugger = None
|
28
.vscode/launch.json
vendored
Normal file
28
.vscode/launch.json
vendored
Normal file
@ -0,0 +1,28 @@
|
||||
{
|
||||
// Use IntelliSense to learn about possible attributes.
|
||||
// Hover to view descriptions of existing attributes.
|
||||
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"type": "lldb",
|
||||
"request": "launch",
|
||||
"name": "Debug gentime lldb",
|
||||
"program": "${workspaceFolder}/test/gen/build/gencpp.exe",
|
||||
"args": [],
|
||||
"cwd": "${workspaceFolder}",
|
||||
"postRunCommands": [
|
||||
"command script import \"${workspaceFolder}/.vscode/gencpp_lldbvis.py\""
|
||||
]
|
||||
},
|
||||
{
|
||||
"type": "cppvsdbg",
|
||||
"request": "launch",
|
||||
"name": "Debug gentime vsdbg",
|
||||
"program": "${workspaceFolder}/test/gen/build/gencpp.exe",
|
||||
"args": [],
|
||||
"cwd": "${workspaceFolder}",
|
||||
"visualizerFile": "${workspaceFolder}/.vscode/gencpp.natvis"
|
||||
}
|
||||
]
|
||||
}
|
3
.vscode/settings.json
vendored
3
.vscode/settings.json
vendored
@ -18,5 +18,6 @@
|
||||
"algorithm": "cpp",
|
||||
"limits": "cpp"
|
||||
},
|
||||
"C_Cpp.intelliSenseEngineFallback": "disabled"
|
||||
"C_Cpp.intelliSenseEngineFallback": "disabled",
|
||||
"mesonbuild.configureOnOpen": true
|
||||
}
|
@ -76,17 +76,17 @@
|
||||
<NMakePreprocessorDefinitions>WIN32;NDEBUG;$(NMakePreprocessorDefinitions)</NMakePreprocessorDefinitions>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<NMakeBuildCommandLine>$(ProjectDir)scripts\build.ps1</NMakeBuildCommandLine>
|
||||
<NMakeReBuildCommandLine>$(ProjectDir)scripts\build.ps1</NMakeReBuildCommandLine>
|
||||
<NMakeCleanCommandLine>$(ProjectDir)scripts\clean.ps1</NMakeCleanCommandLine>
|
||||
<NMakeBuildCommandLine>powershell.exe -ExecutionPolicy Unrestricted -File "$(ProjectDir)scripts\build.ps1"</NMakeBuildCommandLine>
|
||||
<NMakeReBuildCommandLine>powershell.exe -ExecutionPolicy Unrestricted -File "$(ProjectDir)scripts\build.ps1"</NMakeReBuildCommandLine>
|
||||
<NMakeCleanCommandLine>powershell.exe -ExecutionPolicy Unrestricted -File "$(ProjectDir)scripts\clean.ps1"</NMakeCleanCommandLine>
|
||||
<NMakePreprocessorDefinitions>gen_time;$(NMakePreprocessorDefinitions)</NMakePreprocessorDefinitions>
|
||||
<IncludePath>$(ProjectDir)thirdparty;$(ProjectDir)project;$(ProjectDir)test;$(IncludePath)</IncludePath>
|
||||
<SourcePath>$(ProjectDir)project;$(ProjectDir)test;$(SourcePath)</SourcePath>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<NMakeBuildCommandLine>$(ProjectDir)scripts\build.ps1</NMakeBuildCommandLine>
|
||||
<NMakeReBuildCommandLine>$(ProjectDir)scripts\build.ps1</NMakeReBuildCommandLine>
|
||||
<NMakeCleanCommandLine>$(ProjectDir)scripts\clean.ps1</NMakeCleanCommandLine>
|
||||
<NMakeBuildCommandLine>powershell.exe -ExecutionPolicy Unrestricted -File "$(ProjectDir)scripts\build.ps1"</NMakeBuildCommandLine>
|
||||
<NMakeReBuildCommandLine>powershell.exe -ExecutionPolicy Unrestricted -File "$(ProjectDir)scripts\build.ps1"</NMakeReBuildCommandLine>
|
||||
<NMakeCleanCommandLine>powershell.exe -ExecutionPolicy Unrestricted -File "$(ProjectDir)scripts\clean.ps1"</NMakeCleanCommandLine>
|
||||
<NMakePreprocessorDefinitions>gen_time;$(NMakePreprocessorDefinitions)</NMakePreprocessorDefinitions>
|
||||
<IncludePath>$(ProjectDir)thirdparty;$(ProjectDir)project;$(ProjectDir)test;$(IncludePath)</IncludePath>
|
||||
<SourcePath>$(ProjectDir)project;$(ProjectDir)test;$(SourcePath)</SourcePath>
|
||||
@ -124,6 +124,9 @@
|
||||
<ClCompile Include="test\gen\build\meson-private\sanitycheckcpp.cc" />
|
||||
<ClCompile Include="test\test.cpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Natvis Include=".vscode\gencpp.natvis" />
|
||||
</ItemGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
<ImportGroup Label="ExtensionTargets">
|
||||
</ImportGroup>
|
||||
|
@ -14,4 +14,57 @@
|
||||
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav</Extensions>
|
||||
</Filter>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="project\Bloat.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="project\gen.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="project\gen.singleheader.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="test\gen\build\meson-private\sanitycheckc.c">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="test\gen\build\meson-private\sanitycheckcpp.cc">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="test\test.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="project\Bloat.hpp">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="project\Bloat.redef.hpp">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="project\Bloat.undef.hpp">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="project\gen.hpp">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="thirdparty\zpl.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include=".editorconfig" />
|
||||
<None Include="Readme.md" />
|
||||
<None Include="scripts\build.ci.ps1" />
|
||||
<None Include="scripts\build.ps1" />
|
||||
<None Include="scripts\clean.ps1" />
|
||||
<None Include="scripts\get_sources.ps1" />
|
||||
<None Include="scripts\meson.build" />
|
||||
<None Include="singleheader\genc.refactor" />
|
||||
<None Include="test\gen\meson.build" />
|
||||
<None Include="test\meson.build" />
|
||||
<None Include="test\Readme.md" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Natvis Include=".vscode\gencpp.natvis" />
|
||||
</ItemGroup>
|
||||
</Project>
|
@ -3,4 +3,14 @@
|
||||
<PropertyGroup>
|
||||
<ShowAllFiles>true</ShowAllFiles>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||
<LocalDebuggerAttach>false</LocalDebuggerAttach>
|
||||
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
|
||||
<LocalDebuggerCommand>C:\projects\gencpp\test\gen\build\gencpp.exe</LocalDebuggerCommand>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||
<LocalDebuggerAttach>false</LocalDebuggerAttach>
|
||||
<DebuggerFlavor>WindowsLocalDebugger</DebuggerFlavor>
|
||||
<LocalDebuggerCommand>C:\projects\gencpp\test\gen\build\gencpp.exe</LocalDebuggerCommand>
|
||||
</PropertyGroup>
|
||||
</Project>
|
@ -210,6 +210,9 @@ char const* Msg_Invalid_Value = "INVALID VALUE PROVIDED";
|
||||
};
|
||||
|
||||
// Dynamic String
|
||||
// This is directly based off the ZPL string api.
|
||||
// They used a header pattern
|
||||
// I kept it for simplicty of porting but its not necessary to keep it that way.
|
||||
struct String
|
||||
{
|
||||
struct Header
|
||||
@ -265,7 +268,10 @@ char const* Msg_Invalid_Value = "INVALID VALUE PROVIDED";
|
||||
if ( ! str )
|
||||
mem_set( allocation, 0, alloc_size );
|
||||
|
||||
Header header = { allocator, length, length };
|
||||
Header&
|
||||
header = * rcast(Header*, allocation);
|
||||
header = { allocator, length, length };
|
||||
|
||||
String result = { rcast( char*, allocation) + header_size };
|
||||
|
||||
if ( length && str )
|
||||
@ -453,7 +459,7 @@ char const* Msg_Invalid_Value = "INVALID VALUE PROVIDED";
|
||||
|
||||
Header& get_header()
|
||||
{
|
||||
return pcast( Header, Data[ - sizeof( Header ) ] );
|
||||
return *(Header*)(Data - sizeof(Header));
|
||||
}
|
||||
|
||||
sw length() const
|
||||
@ -551,6 +557,11 @@ char const* Msg_Invalid_Value = "INVALID VALUE PROVIDED";
|
||||
struct String_POD
|
||||
{
|
||||
char* Data;
|
||||
|
||||
operator String()
|
||||
{
|
||||
return * rcast(String*, this);
|
||||
}
|
||||
};
|
||||
static_assert( sizeof( String_POD ) == sizeof( String ), "String is not a POD" );
|
||||
#pragma endregion String
|
||||
|
@ -1213,13 +1213,11 @@ namespace gen
|
||||
Code&
|
||||
t_void_write = ccast( Code, t_void );
|
||||
t_void_write = def_type( name(void) );
|
||||
t_void_write->Readonly = true;
|
||||
|
||||
# define def_constant_code_type( Type_ ) \
|
||||
Code& \
|
||||
t_##Type_##write = ccast( Code, type_ns(Type_) ); \
|
||||
t_##Type_##write = def_type( name(Type_) ); \
|
||||
t_##Type_##write->Readonly = true;
|
||||
t_##Type_##_write = ccast( Code, type_ns(Type_) ); \
|
||||
t_##Type_##_write = def_type( name(Type_) ); \
|
||||
|
||||
def_constant_code_type( int );
|
||||
def_constant_code_type( bool );
|
||||
@ -1250,15 +1248,49 @@ namespace gen
|
||||
|
||||
# define def_constant_spec( Type_, ... ) \
|
||||
Code& \
|
||||
spec_##Type_##write = ccast( Code, spec_##Type_); \
|
||||
spec_##Type_##write = def_specifiers( macro_num_args(__VA_ARGS__), __VA_ARGS__); \
|
||||
spec_##Type_##write.lock()
|
||||
spec_##Type_##_write = ccast( Code, spec_##Type_); \
|
||||
spec_##Type_##_write = def_specifiers( macro_num_args(__VA_ARGS__), __VA_ARGS__); \
|
||||
|
||||
def_constant_spec( const, ESpecifier::Const );
|
||||
def_constant_spec( inline, ESpecifier::Inline );
|
||||
# undef def_constant_spec
|
||||
}
|
||||
|
||||
void deinit()
|
||||
{
|
||||
using namespace StaticData;
|
||||
|
||||
s32 left = array_count( CodePools );
|
||||
do
|
||||
{
|
||||
Pool* code_pool = & CodePools[left];
|
||||
pool_free( code_pool );
|
||||
}
|
||||
while ( left--, left );
|
||||
|
||||
left = array_count( CodeEntriesArenas );
|
||||
do
|
||||
{
|
||||
Arena* code_entries_arena = & CodeEntriesArenas[left];
|
||||
arena_free( code_entries_arena );
|
||||
}
|
||||
while ( left--, left );
|
||||
|
||||
left = array_count( StringArenas );
|
||||
do
|
||||
{
|
||||
Arena* string_arena = & StringArenas[left];
|
||||
arena_free( string_arena );
|
||||
}
|
||||
while ( left--, left );
|
||||
|
||||
str_tbl_destroy( & StringMap );
|
||||
type_tbl_destroy( & TypeMap );
|
||||
|
||||
array_free( CodePools );
|
||||
array_free( CodeEntriesArenas );
|
||||
}
|
||||
|
||||
void clear_code_memory()
|
||||
{
|
||||
using namespace StaticData;
|
||||
@ -1318,16 +1350,18 @@ namespace gen
|
||||
{
|
||||
s32 hash_length = str.Len > kilobytes(1) ? kilobytes(1) : str.Len;
|
||||
u32 key = crc32( str.Ptr, hash_length );
|
||||
{
|
||||
String* result = str_tbl_get( & StaticData::StringMap, key );
|
||||
|
||||
if ( result )
|
||||
return * result;
|
||||
}
|
||||
|
||||
* result = String::make( get_string_allocator( str.Len ), str.Ptr );
|
||||
String result = String::make( get_string_allocator( str.Len ), str.Ptr );
|
||||
|
||||
str_tbl_set( & StaticData::StringMap, key, * result );
|
||||
str_tbl_set( & StaticData::StringMap, key, result );
|
||||
|
||||
return * result;
|
||||
return result;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -235,12 +235,12 @@ namespace gen
|
||||
|
||||
enum Type : u32
|
||||
{
|
||||
Invalid,
|
||||
# define Entry( Specifier, Code ) Specifier,
|
||||
Define_Specifiers
|
||||
# undef Entry
|
||||
|
||||
Num_Specifiers,
|
||||
Invalid,
|
||||
};
|
||||
|
||||
// Specifier to string
|
||||
@ -669,14 +669,8 @@ namespace gen
|
||||
inline
|
||||
Code& operator=( Code other )
|
||||
{
|
||||
if ( ast == nullptr )
|
||||
{
|
||||
log_failure("Attempt to set with a null AST!");
|
||||
return *this;
|
||||
}
|
||||
|
||||
#ifdef GEN_ENFORCE_READONLY_AST
|
||||
if ( ast->Readonly )
|
||||
if ( ast && ast->Readonly )
|
||||
{
|
||||
log_failure("Attempted to set a readonly AST!");
|
||||
return *this;
|
||||
@ -738,6 +732,8 @@ namespace gen
|
||||
// This currently just initializes the CodePool.
|
||||
void init();
|
||||
|
||||
void deinit();
|
||||
|
||||
/*
|
||||
Use this only if you know you generated the code you needed to a file.
|
||||
And rather get rid of current code asts instead of growing the pool memory.
|
||||
|
@ -52,7 +52,7 @@ $path_scripts = Join-Path $path_root scripts
|
||||
$gencpp = Join-Path $path_gen_build gencpp.exe
|
||||
|
||||
Push-location $path_gen
|
||||
& $gencpp
|
||||
# & $gencpp
|
||||
Pop-Location
|
||||
|
||||
|
||||
|
@ -14,11 +14,9 @@ int gen_main()
|
||||
{
|
||||
Memory::setup();
|
||||
|
||||
log_fmt("\nPress any key after attaching to process\n");
|
||||
getchar();
|
||||
|
||||
gen::init();
|
||||
|
||||
gen::deinit();
|
||||
Memory::cleanup();
|
||||
return 0;
|
||||
}
|
||||
|
7
x64/Debug/gencpp.log
Normal file
7
x64/Debug/gencpp.log
Normal file
@ -0,0 +1,7 @@
|
||||
|
||||
|
||||
Building Test
|
||||
|
||||
ninja: Entering directory `C:\projects\gencpp\test\gen\build'
|
||||
[1/2] Compiling C++ object gencpp.exe.p/.._test.cpp.obj
|
||||
[2/2] Linking target gencpp.exe
|
Loading…
Reference in New Issue
Block a user