From 48a8bc3877a17e9b3ccd748c3d44781aa7b2d835 Mon Sep 17 00:00:00 2001 From: Brendan Hansen Date: Fri, 19 May 2023 10:46:44 -0500 Subject: [PATCH] added: miscellaenous procedures --- CHANGELOG | 6 +++++- core/container/iter.onyx | 10 ++++++++++ core/encoding/json/encoder.onyx | 18 +++++++++--------- core/memory/memory.onyx | 5 +++++ core/misc/any_utils.onyx | 18 ++++++++++++++++++ core/net/tcp.onyx | 6 +++--- core/sync/semaphore.onyx | 4 +++- 7 files changed, 53 insertions(+), 14 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 3caae898..a140f9cc 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -7,6 +7,9 @@ Additions: - '\uXXXX' for small code points (less than U+FFFF) - '\UXXXXXX' for large code points - Does not support UTF-16 surrogate pairs +* `iter.next_opt` +* `memory.ptr_add` +* `misc.any_member` Removals: @@ -14,7 +17,8 @@ Changes: * `iter.single` can take a `dispose` function, which is called on close of the iterator, with the single value yielded. * `io.write_escaped_str` supports escaping "\\" now. - +* In Javascript runtime, made `__read_from_input` not defined right away, so + it can be overridden depending on the needs of the program. Bugfixes: * `json` encoder was wrongly not encoding strings when using `encode` on an `any`. diff --git a/core/container/iter.onyx b/core/container/iter.onyx index e4fbe304..07c477d1 100644 --- a/core/container/iter.onyx +++ b/core/container/iter.onyx @@ -58,6 +58,16 @@ next :: (it: Iterator) -> (it.Iter_Type, bool) { return it.next(it.data); } +#doc """ + Helper function to get the next value out of an iterator, but translated to an optional. + Returns `None` if the iterator was empty, `Some(value)` otherwise. +""" +next_opt :: (it: Iterator) -> ? it.Iter_Type { + v, exists := it.next(it.data); + if exists do return v; + return .{}; +} + #doc """ Helper function to close an iterator, if a close function is defined. diff --git a/core/encoding/json/encoder.onyx b/core/encoding/json/encoder.onyx index f0522c47..25f57081 100644 --- a/core/encoding/json/encoder.onyx +++ b/core/encoding/json/encoder.onyx @@ -166,7 +166,7 @@ encode :: (w: ^io.Writer, data: any) -> Encoding_Error { for i: a.count { if i != 0 do io.write(w, ","); - encode(w, any.{ ~~(cast([^] u8) arr + get_type_info(a.of).size * i), a.of }); + encode(w, misc.any_subscript(data, i)); } io.write(w, "]"); @@ -188,7 +188,7 @@ encode :: (w: ^io.Writer, data: any) -> Encoding_Error { for i: count { if i != 0 do io.write(w, ","); - encode(w, any.{ ~~(cast([^] u8) data + get_type_info(a.of).size * i), a.of }); + encode(w, misc.any_subscript(data, i)); } io.write(w, "]"); @@ -225,7 +225,7 @@ encode :: (w: ^io.Writer, data: any) -> Encoding_Error { encode(w, key); io.write(w, ":"); - encode(w, any.{ ~~(cast([^] u8) data.data + member.offset), member.type }); + encode(w, misc.any_member(data, member)); } io.write(w, "}"); } @@ -291,7 +291,7 @@ from_any :: (type: type_expr, in: rawptr, allocator := context.allocator) -> Val array.init(^v.array_, a_info.count, allocator); for i: a_info.count { - v.array_ << from_any(a_info.of, cast([^] u8) in + size_of(a_info.of) * i); + v.array_ << from_any(a_info.of, memory.ptr_add(in, size_of(a_info.of) * i)); } return Value.{v}; @@ -312,7 +312,7 @@ from_any :: (type: type_expr, in: rawptr, allocator := context.allocator) -> Val array.init(^v.array_, s.count, allocator); for i: s.count { - v.array_ << from_any(s_info.of, cast([^] u8) s.data + size_of(s_info.of) * i); + v.array_ << from_any(s_info.of, memory.ptr_add(s.data, size_of(s_info.of) * i)); } return Value.{v}; @@ -336,7 +336,7 @@ from_any :: (type: type_expr, in: rawptr, allocator := context.allocator) -> Val } } - json.set(Value.{v}, key, from_any(member.type, cast([^] u8) in + member.offset), dont_copy_key=true); + json.set(Value.{v}, key, from_any(member.type, memory.ptr_add(in, member.offset)), dont_copy_key=true); } return Value.{v}; @@ -386,7 +386,7 @@ as_any :: (value: Value, type: type_expr, out: rawptr) { a_info := cast(^Type_Info_Array) t_info; for i: a_info.count { - to_any(value[i], a_info.of, cast([^] u8) out + size_of(a_info.of) * i); + to_any(value[i], a_info.of, memory.ptr_add(out, size_of(a_info.of) * i)); } } @@ -415,7 +415,7 @@ as_any :: (value: Value, type: type_expr, out: rawptr) { } for i: s.count { - to_any(value[i], s_info.of, cast([^] u8) s.data + size_of(s_info.of) * i); + to_any(value[i], s_info.of, memory.ptr_add(s.data, size_of(s_info.of) * i)); } } @@ -434,7 +434,7 @@ as_any :: (value: Value, type: type_expr, out: rawptr) { } } - to_any(value[key], member.type, cast([^] u8) out + member.offset); + to_any(value[key], member.type, memory.ptr_add(out, member.offset)); } } diff --git a/core/memory/memory.onyx b/core/memory/memory.onyx index fbf3d3a6..e35e460d 100644 --- a/core/memory/memory.onyx +++ b/core/memory/memory.onyx @@ -58,3 +58,8 @@ align :: (size: u32, align: u32) -> u32 { } return size; } + +ptr_add :: macro (p: rawptr, d: i32) -> rawptr { + return cast([&] u8, p) + d; +} + diff --git a/core/misc/any_utils.onyx b/core/misc/any_utils.onyx index e614b3ec..4c18a626 100644 --- a/core/misc/any_utils.onyx +++ b/core/misc/any_utils.onyx @@ -86,6 +86,24 @@ any_nested_selector :: (v: any, member_name: str) -> any { return .{null, void}; } +#doc """ +""" +any_member :: #match #locked { + macro (v: any, member_type: type_expr, member_offset: u32) -> any { + return any.{ + cast([&] u8, v.data) + member_offset, + member_type + }; + }, + + (v: any, member: &Type_Info_Struct.Member) -> any { + return any.{ + cast([&] u8, v.data) + member.offset, + member.type + }; + } +} + #doc """ Convert a structure or pointer to a structure to a Map with keys representing the fields of the structure, and values diff --git a/core/net/tcp.onyx b/core/net/tcp.onyx index feb22025..66d35e9e 100644 --- a/core/net/tcp.onyx +++ b/core/net/tcp.onyx @@ -235,9 +235,9 @@ tcp_server_pulse :: (use server: &TCP_Server) -> bool { } if client_count == 0 { - // This is bad because if the pulse_time_ms is large, the server - // will have a unnecessary delay for the first client to connect. - os.sleep(pulse_time_ms); + // Wait for a client to connect. + status_buffer: [1] Socket_Poll_Status; + socket_poll_all(.[&socket], -1, status_buffer); return server.alive; } diff --git a/core/sync/semaphore.onyx b/core/sync/semaphore.onyx index f033cd2d..fffbca45 100644 --- a/core/sync/semaphore.onyx +++ b/core/sync/semaphore.onyx @@ -3,7 +3,9 @@ package core.sync use runtime use core -use core.intrinsics.atomics +#if runtime.Wait_Notify_Available { + use core.intrinsics.atomics {__atomic_wait, __atomic_notify} +} #doc """ A semaphore represents a counter that can only be incremented -- 2.25.1