mirror of
https://github.com/c3lang/c3c.git
synced 2026-02-27 12:01:16 +00:00
First 0.7 update, removing all deprecated features.
This commit is contained in:
committed by
Christoffer Lerno
parent
cff6697818
commit
2a895ec7be
@@ -55,7 +55,7 @@ fn void Backtrace.free(&self)
|
||||
allocator::free(self.allocator, self.file);
|
||||
}
|
||||
|
||||
fn Backtrace* Backtrace.init(&self, uptr offset, String function, String object_file, String file = "", uint line = 0, Allocator allocator)
|
||||
fn Backtrace* Backtrace.init(&self, Allocator allocator, uptr offset, String function, String object_file, String file = "", uint line = 0)
|
||||
{
|
||||
if (!allocator)
|
||||
{
|
||||
@@ -91,13 +91,13 @@ fn void*[] capture_current(void*[] buffer)
|
||||
$endswitch
|
||||
}
|
||||
|
||||
def BacktraceList = List(<Backtrace>);
|
||||
def BacktraceList = List{Backtrace};
|
||||
|
||||
def symbolize_backtrace = linux::symbolize_backtrace @if(env::LINUX);
|
||||
def symbolize_backtrace = win32::symbolize_backtrace @if(env::WIN32);
|
||||
def symbolize_backtrace = darwin::symbolize_backtrace @if(env::DARWIN);
|
||||
|
||||
fn BacktraceList! symbolize_backtrace(void*[] backtrace, Allocator allocator) @if(!env::NATIVE_STACKTRACE)
|
||||
fn BacktraceList! symbolize_backtrace(Allocator allocator, void*[] backtrace) @if(!env::NATIVE_STACKTRACE)
|
||||
{
|
||||
return {};
|
||||
}
|
||||
@@ -9,7 +9,7 @@ import std::io::path, libc, std::os;
|
||||
@require name.len > 0
|
||||
@return! SearchResult.MISSING
|
||||
*>
|
||||
fn String! get_var(String name, Allocator allocator = allocator::heap()) => @pool(allocator)
|
||||
fn String! get_var(Allocator allocator, String name) => @pool(allocator)
|
||||
{
|
||||
|
||||
$switch
|
||||
@@ -20,7 +20,7 @@ fn String! get_var(String name, Allocator allocator = allocator::heap()) => @poo
|
||||
// https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-getenvironmentvariable
|
||||
const usz BUFSIZE = 1024;
|
||||
WString buff = (WString)tcalloc(BUFSIZE * 2 + 2);
|
||||
WString wstr = name.to_temp_wstring()!;
|
||||
WString wstr = name.to_wstring_tcopy()!;
|
||||
usz len = win32::getEnvironmentVariableW(wstr, buff, BUFSIZE);
|
||||
if (len == 0) return SearchResult.MISSING?;
|
||||
if (len > BUFSIZE)
|
||||
@@ -28,15 +28,15 @@ fn String! get_var(String name, Allocator allocator = allocator::heap()) => @poo
|
||||
buff = (WString)tmalloc(len * 2 + 2);
|
||||
win32::getEnvironmentVariableW(wstr, buff, (Win32_DWORD)len);
|
||||
}
|
||||
return string::new_from_wstring(buff, allocator);
|
||||
return string::new_from_wstring(allocator, buff);
|
||||
$default:
|
||||
return "";
|
||||
$endswitch
|
||||
}
|
||||
|
||||
fn String! get_var_temp(String name)
|
||||
fn String! tget_var(String name)
|
||||
{
|
||||
return get_var(name, allocator::temp());
|
||||
return get_var(tmem(), name);
|
||||
}
|
||||
|
||||
<*
|
||||
@@ -48,14 +48,14 @@ fn bool set_var(String name, String value, bool overwrite = true) => @pool()
|
||||
{
|
||||
$switch
|
||||
$case env::WIN32:
|
||||
WString wname = name.to_temp_wstring()!!;
|
||||
WString wname = name.to_wstring_tcopy()!!;
|
||||
if (!overwrite)
|
||||
{
|
||||
Char16[8] buff;
|
||||
if (win32::getEnvironmentVariableW(wname, &buff, 8) > 0) return true;
|
||||
}
|
||||
// https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-setenvironmentvariable
|
||||
return (win32::setEnvironmentVariableW(wname, value.to_temp_wstring()) ?? 1) == 0;
|
||||
return (win32::setEnvironmentVariableW(wname, value.to_wstring_tcopy()) ?? 1) == 0;
|
||||
$case env::LIBC && !env::WIN32:
|
||||
return libc::setenv(name.zstr_tcopy(), value.zstr_tcopy(), (int)overwrite) == 0;
|
||||
$default:
|
||||
@@ -74,30 +74,26 @@ fn String! get_home_dir(Allocator using = allocator::heap())
|
||||
$else
|
||||
home = "USERPROFILE";
|
||||
$endif
|
||||
return get_var(home, using);
|
||||
return get_var(using, home);
|
||||
}
|
||||
|
||||
fn Path! get_config_dir(Allocator allocator = allocator::heap()) @deprecated("use new_get_config_dir()")
|
||||
{
|
||||
return new_get_config_dir(allocator) @inline;
|
||||
}
|
||||
|
||||
<*
|
||||
Returns the current user's config directory.
|
||||
*>
|
||||
fn Path! new_get_config_dir(Allocator allocator = allocator::heap()) => @pool(allocator)
|
||||
fn Path! get_config_dir(Allocator allocator) => @pool(allocator)
|
||||
{
|
||||
$if env::WIN32:
|
||||
return path::new(get_var_temp("AppData"), allocator);
|
||||
return path::new(allocator, tget_var("AppData"));
|
||||
$else
|
||||
$if env::DARWIN:
|
||||
String s = get_var_temp("HOME")!;
|
||||
String s = tget_var("HOME")!;
|
||||
const DIR = "Library/Application Support";
|
||||
$else
|
||||
String s = get_var_temp("XDG_CONFIG_HOME") ?? get_var_temp("HOME")!;
|
||||
String s = tget_var("XDG_CONFIG_HOME") ?? tget_var("HOME")!;
|
||||
const DIR = ".config";
|
||||
$endif
|
||||
return path::temp_new(s).new_append(DIR, allocator: allocator);
|
||||
return path::temp(s).append(allocator, DIR);
|
||||
$endif
|
||||
}
|
||||
|
||||
@@ -110,7 +106,7 @@ fn bool clear_var(String name) => @pool()
|
||||
{
|
||||
$switch
|
||||
$case env::WIN32:
|
||||
WString wname = name.to_temp_wstring()!!;
|
||||
WString wname = name.to_wstring_tcopy()!!;
|
||||
return win32::setEnvironmentVariableW(wname, null) == 0;
|
||||
$case env::LIBC && !env::WIN32:
|
||||
return libc::unsetenv(name.zstr_tcopy()) == 0;
|
||||
@@ -119,16 +115,11 @@ fn bool clear_var(String name) => @pool()
|
||||
$endswitch
|
||||
}
|
||||
|
||||
fn String! executable_path(Allocator allocator = allocator::heap()) @deprecated("use new_executable_path()")
|
||||
{
|
||||
return new_executable_path(allocator) @inline;
|
||||
}
|
||||
|
||||
fn String! new_executable_path(Allocator allocator = allocator::heap())
|
||||
fn String! executable_path(Allocator allocator)
|
||||
{
|
||||
$if env::DARWIN:
|
||||
return darwin::executable_path(allocator);
|
||||
$else
|
||||
return SearchResult.MISSING?;
|
||||
$endif
|
||||
}
|
||||
}
|
||||
|
||||
@@ -128,17 +128,17 @@ fn ulong! elf_module_image_base(String path) @local
|
||||
return 0;
|
||||
}
|
||||
|
||||
fn void! backtrace_add_from_exec(BacktraceList* list, void* addr, Allocator allocator) @local
|
||||
fn void! backtrace_add_from_exec(Allocator allocator, BacktraceList* list, void* addr) @local
|
||||
{
|
||||
char[] buf = mem::temp_alloc_array(char, 1024);
|
||||
|
||||
String exec_path = process::execute_stdout_to_buffer(buf, {"realpath", "-e", string::tformat("/proc/%d/exe", posix::getpid())})!;
|
||||
String obj_name = exec_path.copy(allocator);
|
||||
String addr2line = process::execute_stdout_to_buffer(buf, {"addr2line", "-p", "-i", "-C", "-f", "-e", exec_path, string::tformat("0x%x", addr)})!;
|
||||
return backtrace_add_addr2line(list, addr, addr2line, obj_name, "???", allocator);
|
||||
return backtrace_add_addr2line(allocator, list, addr, addr2line, obj_name, "???");
|
||||
}
|
||||
|
||||
fn void! backtrace_add_from_dlinfo(BacktraceList* list, void* addr, Linux_Dl_info* info, Allocator allocator) @local
|
||||
fn void! backtrace_add_from_dlinfo(Allocator allocator, BacktraceList* list, void* addr, Linux_Dl_info* info) @local
|
||||
{
|
||||
char[] buf = mem::temp_alloc_array(char, 1024);
|
||||
|
||||
@@ -146,10 +146,10 @@ fn void! backtrace_add_from_dlinfo(BacktraceList* list, void* addr, Linux_Dl_inf
|
||||
ZString obj_path = info.dli_fname;
|
||||
String sname = info.dli_sname ? info.dli_sname.str_view() : "???";
|
||||
String addr2line = process::execute_stdout_to_buffer(buf, {"addr2line", "-p", "-i", "-C", "-f", "-e", obj_path.str_view(), string::tformat("0x%x", obj_addr - 1)})!;
|
||||
return backtrace_add_addr2line(list, addr, addr2line, info.dli_fname.str_view(), sname, allocator);
|
||||
return backtrace_add_addr2line(allocator, list, addr, addr2line, info.dli_fname.str_view(), sname);
|
||||
}
|
||||
|
||||
fn Backtrace! backtrace_line_parse(String string, String obj_name, String func_name, bool is_inlined, Allocator allocator)
|
||||
fn Backtrace! backtrace_line_parse(Allocator allocator, String string, String obj_name, String func_name, bool is_inlined)
|
||||
{
|
||||
String[] parts = string.trim().tsplit(" at ");
|
||||
if (parts.len != 2) return SearchResult.MISSING?;
|
||||
@@ -171,14 +171,14 @@ fn Backtrace! backtrace_line_parse(String string, String obj_name, String func_n
|
||||
.is_inline = is_inlined
|
||||
};
|
||||
}
|
||||
fn void! backtrace_add_addr2line(BacktraceList* list, void* addr, String addr2line, String obj_name, String func_name, Allocator allocator) @local
|
||||
fn void! backtrace_add_addr2line(Allocator allocator, BacktraceList* list, void* addr, String addr2line, String obj_name, String func_name) @local
|
||||
{
|
||||
String[] inline_parts = addr2line.tsplit("(inlined by)");
|
||||
usz last = inline_parts.len - 1;
|
||||
foreach (i, part : inline_parts)
|
||||
{
|
||||
bool is_inline = i != last;
|
||||
Backtrace! trace = backtrace_line_parse(part, obj_name, func_name, is_inline, allocator);
|
||||
Backtrace! trace = backtrace_line_parse(allocator, part, obj_name, func_name, is_inline);
|
||||
if (catch trace)
|
||||
{
|
||||
list.push({
|
||||
@@ -196,7 +196,7 @@ fn void! backtrace_add_addr2line(BacktraceList* list, void* addr, String addr2li
|
||||
}
|
||||
}
|
||||
|
||||
fn void! backtrace_add_element(BacktraceList *list, void* addr, Allocator allocator = allocator::heap()) @local
|
||||
fn void! backtrace_add_element(Allocator allocator, BacktraceList *list, void* addr) @local
|
||||
{
|
||||
if (!addr)
|
||||
{
|
||||
@@ -209,13 +209,13 @@ fn void! backtrace_add_element(BacktraceList *list, void* addr, Allocator alloca
|
||||
Linux_Dl_info info;
|
||||
if (dladdr(addr, &info) == 0)
|
||||
{
|
||||
return backtrace_add_from_exec(list, addr, allocator);
|
||||
return backtrace_add_from_exec(allocator, list, addr);
|
||||
}
|
||||
return backtrace_add_from_dlinfo(list, addr, &info, allocator);
|
||||
return backtrace_add_from_dlinfo(allocator, list, addr, &info);
|
||||
};
|
||||
}
|
||||
|
||||
fn BacktraceList! symbolize_backtrace(void*[] backtrace, Allocator allocator)
|
||||
fn BacktraceList! symbolize_backtrace(Allocator allocator, void*[] backtrace)
|
||||
{
|
||||
BacktraceList list;
|
||||
list.init(allocator, backtrace.len);
|
||||
@@ -231,7 +231,7 @@ fn BacktraceList! symbolize_backtrace(void*[] backtrace, Allocator allocator)
|
||||
{
|
||||
foreach (addr : backtrace)
|
||||
{
|
||||
backtrace_add_element(&list, addr, allocator)!;
|
||||
backtrace_add_element(allocator, &list, addr)!;
|
||||
}
|
||||
};
|
||||
return list;
|
||||
|
||||
@@ -80,7 +80,7 @@ fn uptr! load_address() @local
|
||||
{
|
||||
Darwin_segment_command_64* cmd = darwin::getsegbyname("__TEXT");
|
||||
if (!cmd) return BacktraceFault.SEGMENT_NOT_FOUND?;
|
||||
String path = env::new_executable_path(allocator::temp()) ?? BacktraceFault.EXECUTABLE_PATH_NOT_FOUND?!;
|
||||
String path = env::executable_path(tmem()) ?? BacktraceFault.EXECUTABLE_PATH_NOT_FOUND?!;
|
||||
uint dyld_count = darwin::_dyld_image_count();
|
||||
for (uint i = 0; i < dyld_count; i++)
|
||||
{
|
||||
@@ -132,7 +132,7 @@ fn Backtrace! backtrace_load_element(String execpath, void* buffer, void* load_a
|
||||
};
|
||||
}
|
||||
|
||||
fn BacktraceList! symbolize_backtrace(void*[] backtrace, Allocator allocator)
|
||||
fn BacktraceList! symbolize_backtrace(Allocator allocator, void*[] backtrace)
|
||||
{
|
||||
void *load_addr = (void *)load_address()!;
|
||||
BacktraceList list;
|
||||
|
||||
@@ -109,7 +109,7 @@ fn WString convert_command_line_win32(String[] command_line) @inline @if(env::WI
|
||||
str.append('"');
|
||||
}
|
||||
str.append('\0');
|
||||
return str.str_view().to_temp_wstring()!!;
|
||||
return str.str_view().to_wstring_tcopy()!!;
|
||||
}
|
||||
|
||||
<*
|
||||
@@ -149,7 +149,7 @@ fn SubProcess! create(String[] command_line, SubProcessOptions options = {}, Str
|
||||
env.append("\0");
|
||||
}
|
||||
env.append("\0");
|
||||
used_environment = env.str_view().to_temp_wstring()!;
|
||||
used_environment = env.str_view().to_wstring_tcopy()!;
|
||||
}
|
||||
int fd = win32::_open_osfhandle((iptr)wr, 0);
|
||||
if (fd != -1)
|
||||
|
||||
@@ -154,7 +154,7 @@ struct Symbol
|
||||
|
||||
Win32_DWORD64 displacement;
|
||||
|
||||
fn BacktraceList! symbolize_backtrace(void*[] backtrace, Allocator allocator)
|
||||
fn BacktraceList! symbolize_backtrace(Allocator allocator, void*[] backtrace)
|
||||
{
|
||||
BacktraceList list;
|
||||
list.init(allocator, backtrace.len);
|
||||
@@ -163,12 +163,12 @@ fn BacktraceList! symbolize_backtrace(void*[] backtrace, Allocator allocator)
|
||||
defer symCleanup(process);
|
||||
foreach (addr : backtrace)
|
||||
{
|
||||
list.push(resolve_backtrace(addr, process, allocator) ?? backtrace::BACKTRACE_UNKNOWN);
|
||||
list.push(resolve_backtrace(allocator, addr, process) ?? backtrace::BACKTRACE_UNKNOWN);
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
fn Backtrace! resolve_backtrace(void* addr, Win32_HANDLE process, Allocator allocator)
|
||||
fn Backtrace! resolve_backtrace(Allocator allocator, void* addr, Win32_HANDLE process)
|
||||
{
|
||||
Symbol symbol;
|
||||
//Win32_DWORD image_type = load_modules()!;
|
||||
@@ -193,10 +193,10 @@ fn Backtrace! resolve_backtrace(void* addr, Win32_HANDLE process, Allocator allo
|
||||
ZString zname = (ZString)&name;
|
||||
if (!symGetLineFromAddr64(process, (Win32_ULONG64)addr - 1, &offset, &line))
|
||||
{
|
||||
backtrace.init((uptr)addr, zname.str_view(), module_name.str_view(), allocator: allocator);
|
||||
backtrace.init(allocator, (uptr)addr, zname.str_view(), module_name.str_view());
|
||||
return backtrace;
|
||||
}
|
||||
String filename = ((ZString)line.fileName).str_view();
|
||||
backtrace.init((uptr)addr, zname.str_view(), module_name.str_view(), file: filename, line: line.lineNumber, allocator: allocator);
|
||||
backtrace.init(allocator, (uptr)addr, zname.str_view(), module_name.str_view(), file: filename, line: line.lineNumber);
|
||||
return backtrace;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user