typedef struct EntityHeap {
bh_arena entity_arena;
bh_arr(Entity *) entities;
+ bh_arr(Entity *) quick_unsorted_entities;
i32 next_id;
i32 state_count[Entity_State_Count];
if (entities->entities == NULL) {
bh_arr_new(global_heap_allocator, entities->entities, 128);
+ bh_arr_new(global_heap_allocator, entities->quick_unsorted_entities, 128);
+ }
+
+ if (e->state <= Entity_State_Introduce_Symbols) {
+ bh_arr_push(entities->quick_unsorted_entities, e);
+ } else {
+ bh_arr_push(entities->entities, e);
+ eh_shift_up(entities, bh_arr_length(entities->entities) - 1);
}
- bh_arr_push(entities->entities, e);
- eh_shift_up(entities, bh_arr_length(entities->entities) - 1);
e->entered_in_queue = 1;
entities->state_count[e->state]++;
}
Entity* entity_heap_top(EntityHeap* entities) {
+ if (bh_arr_length(entities->quick_unsorted_entities) > 0) {
+ return entities->quick_unsorted_entities[0];
+ }
+
return entities->entities[0];
}
}
void entity_heap_remove_top(EntityHeap* entities) {
- entities->state_count[entities->entities[0]->state]--;
- entities->type_count[entities->entities[0]->type]--;
- entities->all_count[entities->entities[0]->state][entities->entities[0]->type]--;
- entities->entities[0]->entered_in_queue = 0;
+ Entity *e;
- entities->entities[0] = entities->entities[bh_arr_length(entities->entities) - 1];
- bh_arr_pop(entities->entities);
- eh_shift_down(entities, 0);
+ if (bh_arr_length(entities->quick_unsorted_entities) > 0) {
+ e = entities->quick_unsorted_entities[0];
+ } else {
+ e = entities->entities[0];
+ }
+
+ entities->state_count[e->state]--;
+ entities->type_count[e->type]--;
+ entities->all_count[e->state][e->type]--;
+ e->entered_in_queue = 0;
+
+ if (bh_arr_length(entities->quick_unsorted_entities) > 0) {
+ bh_arr_fastdelete(entities->quick_unsorted_entities, 0);
+ } else {
+ entities->entities[0] = entities->entities[bh_arr_length(entities->entities) - 1];
+ bh_arr_pop(entities->entities);
+ eh_shift_down(entities, 0);
+ }
}
void entity_change_type(EntityHeap* entities, Entity *ent, EntityType new_type) {
some :: some;
every :: every;
collect :: to_array;
+ collect_map :: to_map;
}
return arr;
}
+#doc """
+"""
+to_map :: (it: Iterator(Pair($K, $V)), allocator := context.allocator) -> Map(K, V) {
+ m := builtin.make(Map(K, V), allocator=allocator);
+ for p: it {
+ m->put(p.first, p.second);
+ }
+ return m;
+}
+
#doc """
Produces an iterator that first yields all values from the
//
// Standard formatted print to standard output.
printf :: (format: str, va: ..any) {
- flush :: (_, to_output) => {
- io.write(&stdio.print_writer, to_output);
- __flush_stdio();
- return true;
- }
-
buffer: [1024] u8;
- print(conv.format_va(buffer, format, va, .{null, flush}));
+ print(conv.format_va(buffer, format, va, .{ null,
+ (_: rawptr, to_output: str) -> bool {
+ io.write(&stdio.print_writer, to_output);
+ __flush_stdio();
+ return true;
+ }
+ }));
}
#if #defined(runtime.platform.__output_error) {
--- /dev/null
+package core.os
+
+use core.iter
+use runtime.platform {
+ __get_all_env,
+ __get_env
+}
+
+env_vars :: () -> Map(str, str) {
+ return __get_all_env()
+ |> iter.as_iter()
+ |> iter.map(x => *x)
+ |> iter.to_map();
+}
+
+env :: (key: str) -> str {
+ return __get_env(key);
+}
+
Supports_Networking :: false
Supports_Type_Info :: true
Supports_Threads :: true
+Supports_Env_Vars :: false
__output_string :: (s: str) -> u32 #foreign "host" "print_str" ---
__output_error :: (s: str) -> u32 #foreign "host" "print_str" ---
--- /dev/null
+package runtime.platform
+
+use core {Pair}
+
+__get_all_env :: () -> [] Pair(str, str) {
+ // TODO
+ return .[];
+}
+
+__get_env :: (key: str) -> str {
+ buf: [512] u8;
+ len := __lookup_env(key, buf);
+ return buf[0 .. len];
+}
+
+#local #foreign "onyx_runtime" {
+ __lookup_env :: (key: str, buf: str) -> i32 ---
+}
+
}
#load "./fs"
+#load "./env"
// Platform supports
Supports_Networking :: true
Supports_Type_Info :: true
Supports_Threads :: true
+Supports_Env_Vars :: true
#library "onyx_runtime"
package core.env
use runtime
+use core { Pair }
use core.map
use core.memory
use core.string
#error "'core.env' is only available with the 'wasi' and 'onyx' runtimes.";
}
+__get_all_env :: () -> [] Pair(str, str) ---
+__get_env :: (key: str) -> str ---
+
use wasi { environ_get, environ_sizes_get, Size }
Supports_Networking :: false
Supports_Type_Info :: true
Supports_Threads :: false
-
+Supports_Env_Vars :: true
__output_string :: (s: str) -> u32 {
#load "./threads/thread"
}
+#if runtime.platform.Supports_Env_Vars {
+ #load "./os/env"
+}
+
#if runtime.Multi_Threading_Enabled {
#load "./intrinsics/atomics"
ONYX_FUNC(__exit)
ONYX_FUNC(__sleep)
ONYX_FUNC(__time)
+ ONYX_FUNC(__lookup_env)
ONYX_FUNC(__register_cleanup)
ONYX_FUNC(__time_localtime)
}
+ONYX_DEF(__lookup_env, (WASM_I32, WASM_I32, WASM_I32, WASM_I32), (WASM_I32)) {
+
+ #ifdef _BH_LINUX
+ char *key_ptr = ONYX_PTR(params->data[0].of.i32);
+ int key_len = params->data[1].of.i32;
+ char *out_ptr = ONYX_PTR(params->data[2].of.i32);
+ int out_len = params->data[3].of.i32;
+
+ char key[512] = {0};
+ key_len = bh_min(key_len, 511);
+ strncpy(key, key_ptr, key_len);
+ key[key_len] = 0;
+
+ char * value = getenv(key);
+ if (!value) {
+ results->data[0] = WASM_I32_VAL(0);
+ } else {
+ out_len = bh_min(out_len, strlen(value));
+ memcpy(out_ptr, value, out_len);
+ results->data[0] = WASM_I32_VAL(out_len);
+ }
+ #endif
+
+ #ifdef _BH_WINDOWS
+ results->data[0] = WASM_I32_VAL(0);
+ #endif
+ return NULL;
+}
+