mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 12:01:16 +00:00
New faults and syntax (#2034)
- Remove `[?]` syntax. - Change `int!` to `int?` syntax. - New `fault` declarations. - Enum associated values can reference the calling enum.
This commit is contained in:
committed by
GitHub
parent
fefce25081
commit
25bccf4883
@@ -108,7 +108,7 @@ extern fn Win32_BOOL symGetModuleInfo64(Win32_HANDLE hProcess, Win32_DWORD64 qwA
|
||||
extern fn Win32_HANDLE getModuleHandleA(Win32_LPCSTR lpModuleName) @extern("GetModuleHandleA");
|
||||
extern fn Win32_HANDLE getModuleHandleW(Win32_LPCWSTR lpModuleName) @extern("GetModuleHandleW");
|
||||
|
||||
fn Win32_DWORD! load_modules()
|
||||
fn Win32_DWORD? load_modules()
|
||||
{
|
||||
Win32_HANDLE process = getCurrentProcess();
|
||||
Win32_DWORD needed;
|
||||
@@ -119,9 +119,9 @@ fn Win32_DWORD! load_modules()
|
||||
Win32_HMODULE[1024] mod_buffer;
|
||||
if (!enumProcessModules(process, &mod_buffer, mod_buffer.len, &needed))
|
||||
{
|
||||
return BacktraceFault.RESOLUTION_FAILED?;
|
||||
return backtrace::RESOLUTION_FAILED?;
|
||||
}
|
||||
if (needed > mod_buffer.len) return BacktraceFault.RESOLUTION_FAILED?;
|
||||
if (needed > mod_buffer.len) return backtrace::RESOLUTION_FAILED?;
|
||||
Win32_HMODULE[] modules = mod_buffer[:needed];
|
||||
void* base = null;
|
||||
foreach (mod : modules)
|
||||
@@ -129,7 +129,7 @@ fn Win32_DWORD! load_modules()
|
||||
Win32_MODULEINFO info;
|
||||
if (!getModuleInformation(process, mod, &info, $sizeof(info)))
|
||||
{
|
||||
return BacktraceFault.RESOLUTION_FAILED?;
|
||||
return backtrace::RESOLUTION_FAILED?;
|
||||
}
|
||||
if (!base) base = info.lpBaseOfDll;
|
||||
Win32_DWORD load_size = info.sizeOfImage;
|
||||
@@ -141,7 +141,7 @@ fn Win32_DWORD! load_modules()
|
||||
if (len2 < 1) continue;
|
||||
Win32_DWORD64 base_addr = symLoadModuleEx(process, null, (Win32_PCSTR)&char_buf, (Win32_PCSTR)&module_name, (Win32_DWORD64)info.lpBaseOfDll, load_size, null, 0);
|
||||
}
|
||||
if (!base) return BacktraceFault.IMAGE_NOT_FOUND?;
|
||||
if (!base) return backtrace::IMAGE_NOT_FOUND?;
|
||||
Win32_IMAGE_NT_HEADERS* h = imageNtHeader(base);
|
||||
return h.fileHeader.machine;
|
||||
}
|
||||
@@ -154,7 +154,7 @@ struct Symbol
|
||||
|
||||
Win32_DWORD64 displacement;
|
||||
|
||||
fn BacktraceList! symbolize_backtrace(Allocator allocator, void*[] backtrace)
|
||||
fn BacktraceList? symbolize_backtrace(Allocator allocator, void*[] backtrace)
|
||||
{
|
||||
BacktraceList list;
|
||||
list.init(allocator, backtrace.len);
|
||||
@@ -168,7 +168,7 @@ fn BacktraceList! symbolize_backtrace(Allocator allocator, void*[] backtrace)
|
||||
return list;
|
||||
}
|
||||
|
||||
fn Backtrace! resolve_backtrace(Allocator allocator, void* addr, Win32_HANDLE process)
|
||||
fn Backtrace? resolve_backtrace(Allocator allocator, void* addr, Win32_HANDLE process)
|
||||
{
|
||||
Symbol symbol;
|
||||
//Win32_DWORD image_type = load_modules()!;
|
||||
@@ -176,13 +176,13 @@ fn Backtrace! resolve_backtrace(Allocator allocator, void* addr, Win32_HANDLE pr
|
||||
symbol.maxNameLen = 255;
|
||||
if (!symFromAddr(process, (Win32_DWORD64)addr - 1, &displacement, &symbol))
|
||||
{
|
||||
return BacktraceFault.NO_BACKTRACE_SYMBOLS?;
|
||||
return backtrace::NO_BACKTRACE_SYMBOLS?;
|
||||
}
|
||||
Win32_IMAGEHLP_MODULE64 module_info;
|
||||
module_info.sizeOfStruct = Win32_IMAGEHLP_MODULE64.sizeof;
|
||||
if (!symGetModuleInfo64(process, (Win32_DWORD64)addr - 1, &module_info))
|
||||
{
|
||||
return BacktraceFault.NO_BACKTRACE_SYMBOLS?;
|
||||
return backtrace::NO_BACKTRACE_SYMBOLS?;
|
||||
}
|
||||
ZString module_name = (ZString)&module_info.imageName;
|
||||
char[256] name;
|
||||
|
||||
Reference in New Issue
Block a user