From 229a53ac9acda28b59dcc1346c3ccc8d3f61a1fa Mon Sep 17 00:00:00 2001 From: IonutParau Date: Thu, 22 May 2025 13:41:37 +0200 Subject: [PATCH] value constructors --- build.zig | 1 + src/neonucleus.h | 26 +++++++++++---- src/value.c | 87 ++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 107 insertions(+), 7 deletions(-) create mode 100644 src/value.c diff --git a/build.zig b/build.zig index 3c90fcf..199e5a0 100644 --- a/build.zig +++ b/build.zig @@ -8,6 +8,7 @@ fn addEngineSources(c: *std.Build.Step.Compile) void { "src/tinycthread.c", "src/lock.c", "src/utils.c", + "src/value.c", "src/universe.c", }, }); diff --git a/src/neonucleus.h b/src/neonucleus.h index 6332ad8..732711c 100644 --- a/src/neonucleus.h +++ b/src/neonucleus.h @@ -208,17 +208,29 @@ size_t nn_getReturnCount(nn_computer *computer); // Value stuff -nn_value nn_values_retain(nn_value val); -void nn_values_drop(nn_value val); - nn_value nn_values_nil(); +nn_value nn_values_integer(intptr_t integer); +nn_value nn_values_number(double num); +nn_value nn_values_boolean(bool boolean); nn_value nn_values_cstring(const char *string); nn_value nn_values_string(const char *string, size_t len); nn_value nn_values_array(size_t len); -void nn_values_set(nn_value *arr, size_t idx, nn_value val); -nn_value nn_values_get(nn_value *arr, size_t idx); nn_value nn_values_table(size_t pairCount); -void nn_values_setPair(nn_value *obj, nn_value key, nn_value val); -nn_pair nn_values_getPair(nn_value *obj, size_t idx); + +size_t nn_values_getType(nn_value val); +nn_value nn_values_retain(nn_value val); +void nn_values_drop(nn_value val); + +void nn_values_set(nn_value arr, size_t idx, nn_value val); +nn_value nn_values_get(nn_value arr, size_t idx); + +void nn_values_setPair(nn_value obj, nn_value key, nn_value val); +nn_pair nn_values_getPair(nn_value obj, size_t idx); + +intptr_t nn_toInt(nn_value val); +double nn_toNumber(nn_value val); +bool nn_toBoolean(nn_value val); +const char *nn_toCString(nn_value val); +const char *nn_toString(nn_value val, size_t *len); #endif diff --git a/src/value.c b/src/value.c new file mode 100644 index 0000000..e039077 --- /dev/null +++ b/src/value.c @@ -0,0 +1,87 @@ +#include "neonucleus.h" +#include + +nn_value nn_values_nil() { + return (nn_value) {.tag = NN_VALUE_NIL}; +} + +nn_value nn_values_integer(intptr_t integer) { + return (nn_value) {.tag = NN_VALUE_INT, .integer = integer}; +} + +nn_value nn_values_number(double num) { + return (nn_value) {.tag = NN_VALUE_NUMBER, .number = num}; +} + +nn_value nn_values_boolean(bool boolean) { + return (nn_value) {.tag = NN_VALUE_BOOL, .boolean = boolean}; +} + +nn_value nn_values_cstring(const char *string) { + return (nn_value) {.tag = NN_VALUE_CSTR, .cstring = string}; +} + +nn_value nn_values_string(const char *string, size_t len) { + if(len == 0) len = strlen(string); + + char *buf = nn_malloc(len+1); + if(buf == NULL) { + return nn_values_nil(); + } + memcpy(buf, string, len); + buf[len] = '\0'; + + nn_string *s = nn_malloc(sizeof(nn_string)); + if(s == NULL) { + nn_free(buf); + return nn_values_nil(); + } + s->data = buf; + s->len = len; + s->refc = 1; + + return (nn_value) {.tag = NN_VALUE_STR, .string = s}; +} + +nn_value nn_values_array(size_t len) { + nn_array *arr = nn_malloc(sizeof(nn_array)); + if(arr == NULL) { + return nn_values_nil(); + } + arr->refc = 1; + arr->len = len; + nn_value *values = nn_malloc(sizeof(nn_value) * len); + if(values == NULL) { + nn_free(arr); + return nn_values_nil(); + } + for(size_t i = 0; i < len; i++) { + values[i] = nn_values_nil(); + } + arr->values = values; + return (nn_value) {.tag = NN_VALUE_ARRAY, .array = arr}; +} + +nn_value nn_values_table(size_t pairCount) { + nn_table *table = nn_malloc(sizeof(nn_table)); + if(table == NULL) { + return nn_values_nil(); + } + table->refc = 1; + table->len = pairCount; + nn_pair *pairs = nn_malloc(sizeof(nn_pair) * pairCount); + if(pairs == NULL) { + nn_free(table); + return nn_values_nil(); + } + for(size_t i = 0; i < pairCount; i++) { + pairs[i].key = nn_values_nil(); + pairs[i].val = nn_values_nil(); + } + table->pairs = pairs; + return (nn_value) {.tag = NN_VALUE_TABLE, .table = table}; +} + +size_t nn_values_getType(nn_value val) { + return val.tag; +}