added: miscellaenous procedures
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Fri, 19 May 2023 15:46:44 +0000 (10:46 -0500)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Fri, 19 May 2023 15:46:44 +0000 (10:46 -0500)
CHANGELOG
core/container/iter.onyx
core/encoding/json/encoder.onyx
core/memory/memory.onyx
core/misc/any_utils.onyx
core/net/tcp.onyx
core/sync/semaphore.onyx

index 3caae89883d3e00ab4004bd56e8a275a5e922998..a140f9ccc38377004c9d1d70103e2a5caebbc50c 100644 (file)
--- 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`.
index e4fbe30488d46eb96ef45409724eba6522956f30..07c477d13631b3905e8e77d08c5fe06b76580caf 100644 (file)
@@ -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.
index f0522c476de9b3c6491bceba8b363f493d544e0b..25f570817a62a98f2231714d5f12785f9c5c18e4 100644 (file)
@@ -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));
             }
         }
 
index fbf3d3a6847d6a0f8b86002571787df52108c9db..e35e460dbaf0f229385985cef337158e8a8d6920 100644 (file)
@@ -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;
+}
+
index e614b3ecd58d6df927ea0b9caff88dd1461e3703..4c18a626b71755f3d03803fa9accb7714aed88eb 100644 (file)
@@ -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
index feb22025ed28996a03eaca1c78ebbb55b62d375e..66d35e9e41372a8309225c00045e0709c66ab4a0 100644 (file)
@@ -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;
     }
 
index f033cd2daa92594b1fc507d83b2d4b07bccf4f6f..fffbca452f42449eb5a93c2f257662f6ab0d2c1f 100644 (file)
@@ -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