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
@@ -68,19 +68,19 @@ struct Darwin_segment_command_64
|
||||
}
|
||||
|
||||
|
||||
fn String! executable_path(Allocator allocator)
|
||||
fn String? executable_path(Allocator allocator)
|
||||
{
|
||||
char[4096] path;
|
||||
uint len = path.len;
|
||||
if (darwin_NSGetExecutablePath(&path, &len) < 0) return SearchResult.MISSING?;
|
||||
if (darwin_NSGetExecutablePath(&path, &len) < 0) return NOT_FOUND?;
|
||||
return ((ZString)&path).copy(allocator);
|
||||
}
|
||||
|
||||
fn uptr! load_address() @local
|
||||
fn uptr? load_address() @local
|
||||
{
|
||||
Darwin_segment_command_64* cmd = darwin::getsegbyname("__TEXT");
|
||||
if (!cmd) return BacktraceFault.SEGMENT_NOT_FOUND?;
|
||||
String path = env::executable_path(tmem()) ?? BacktraceFault.EXECUTABLE_PATH_NOT_FOUND?!;
|
||||
if (!cmd) return backtrace::SEGMENT_NOT_FOUND?;
|
||||
String path = env::executable_path(tmem()) ?? backtrace::EXECUTABLE_PATH_NOT_FOUND?!;
|
||||
uint dyld_count = darwin::_dyld_image_count();
|
||||
for (uint i = 0; i < dyld_count; i++)
|
||||
{
|
||||
@@ -89,11 +89,11 @@ fn uptr! load_address() @local
|
||||
if (image_name.str_view() != path) continue;
|
||||
return cmd.vmaddr + darwin::_dyld_get_image_vmaddr_slide(i);
|
||||
}
|
||||
return BacktraceFault.IMAGE_NOT_FOUND?;
|
||||
return backtrace::IMAGE_NOT_FOUND?;
|
||||
}
|
||||
|
||||
|
||||
fn Backtrace! backtrace_load_element(String execpath, void* buffer, void* load_address, Allocator allocator = allocator::heap()) @local
|
||||
fn Backtrace? backtrace_load_element(String execpath, void* buffer, void* load_address, Allocator allocator = allocator::heap()) @local
|
||||
{
|
||||
@pool(allocator)
|
||||
{
|
||||
@@ -132,7 +132,7 @@ fn Backtrace! backtrace_load_element(String execpath, void* buffer, void* load_a
|
||||
};
|
||||
}
|
||||
|
||||
fn BacktraceList! symbolize_backtrace(Allocator allocator, void*[] backtrace)
|
||||
fn BacktraceList? symbolize_backtrace(Allocator allocator, void*[] backtrace)
|
||||
{
|
||||
void *load_addr = (void *)load_address()!;
|
||||
BacktraceList list;
|
||||
|
||||
@@ -7,11 +7,7 @@ distinct ObjcSelector = void*;
|
||||
def ObjcId = void*;
|
||||
def SendVoid = fn void*(void*, ObjcSelector);
|
||||
|
||||
fault ObjcFailure
|
||||
{
|
||||
CLASS_NOT_FOUND,
|
||||
UNKNOWN_EVENT
|
||||
}
|
||||
fault CLASS_NOT_FOUND, UNKNOWN_EVENT;
|
||||
|
||||
macro ZString ObjcClass.name(ObjcClass cls) => class_getName(cls);
|
||||
macro ObjcClass ObjcClass.superclass(ObjcClass cls) => class_getSuperclass(cls);
|
||||
@@ -24,10 +20,10 @@ macro bool ObjcClass.equals(ObjcClass a, ObjcClass b) => a == b;
|
||||
fn ObjcId alloc(ObjcClass cls) => objc::msg_send(cls, SendVoid, "alloc");
|
||||
fn void release(ObjcId id) => objc::msg_send(id, SendVoid, "release");
|
||||
|
||||
macro ObjcClass! class_by_name(ZString c)
|
||||
macro ObjcClass? class_by_name(ZString c)
|
||||
{
|
||||
ObjcClass cls = objc::lookUpClass(c);
|
||||
return cls ?: ObjcFailure.CLASS_NOT_FOUND?;
|
||||
return cls ?: CLASS_NOT_FOUND?;
|
||||
}
|
||||
|
||||
macro ObjcClass[] class_get_list(Allocator allocator = allocator::heap())
|
||||
@@ -138,7 +134,7 @@ enum EventType : (long val)
|
||||
CHANGE_MODE = 38,
|
||||
}
|
||||
|
||||
fn EventType! event_type_from(int val)
|
||||
fn EventType? event_type_from(int val)
|
||||
{
|
||||
switch(val)
|
||||
{
|
||||
@@ -176,7 +172,7 @@ fn EventType! event_type_from(int val)
|
||||
case EventType.PRESSURE.val: return PRESSURE;
|
||||
case EventType.DIRECT_TOUCH.val: return DIRECT_TOUCH;
|
||||
case EventType.CHANGE_MODE.val: return CHANGE_MODE;
|
||||
default: return ObjcFailure.UNKNOWN_EVENT?;
|
||||
default: return UNKNOWN_EVENT?;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user