summaryrefslogtreecommitdiff
path: root/src/library.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/library.c')
-rw-r--r--src/library.c27
1 files changed, 15 insertions, 12 deletions
diff --git a/src/library.c b/src/library.c
index 383105b..1038004 100644
--- a/src/library.c
+++ b/src/library.c
@@ -1,3 +1,4 @@
+#include <lcq/pit/vec.h>
#include <lcq/pit/lexer.h>
#include <lcq/pit/parser.h>
#include <lcq/pit/runtime.h>
@@ -12,9 +13,11 @@ static pit_value impl_sf_if(pit_runtime *rt, pit_value args, void *data) {
(void) data;
pit_value c = pit_car(rt, args);
if (pit_eval(rt, c) != PIT_NIL) {
- pit_values_push(rt, rt->expr_stack, pit_car(rt, pit_cdr(rt, args)));
+ if (pit_vec_push(pit_value)(rt->expr_stack, pit_car(rt, pit_cdr(rt, args))) < 0)
+ pit_error(rt, "in special form \"if\": evaluation stack overflow");
} else {
- pit_values_push(rt, rt->expr_stack, pit_car(rt, pit_cdr(rt, pit_cdr(rt, args))));
+ if (pit_vec_push(pit_value)(rt->expr_stack, pit_car(rt, pit_cdr(rt, pit_cdr(rt, args)))) < 0)
+ pit_error(rt, "in special form \"if\": evaluation stack overflow");
}
return PIT_NIL;
}
@@ -24,14 +27,14 @@ static pit_value impl_sf_cond(pit_runtime *rt, pit_value args, void *data) {
pit_value clause = pit_car(rt, args);
pit_value cond = pit_car(rt, clause);
if (pit_eval(rt, cond) != PIT_NIL) {
- pit_values_push(rt, rt->expr_stack,
- pit_cons(rt, pit_intern_cstr(rt, "progn"), pit_cdr(rt, clause))
- );
+ if (pit_vec_push(pit_value)(rt->expr_stack, pit_cons(rt, pit_intern_cstr(rt, "progn"), pit_cdr(rt, clause))) < 0)
+ pit_error(rt, "in special form \"cond\": evaluation stack overflow");
return PIT_NIL;
}
args = pit_cdr(rt, args);
}
- pit_values_push(rt, rt->expr_stack, PIT_NIL);
+ if (pit_vec_push(pit_value)(rt->expr_stack, PIT_NIL) < 0)
+ pit_error(rt, "in special form \"cond\": evaluation stack overflow");
return PIT_NIL;
}
static pit_value impl_sf_progn(pit_runtime *rt, pit_value args, void *data) {
@@ -99,7 +102,7 @@ static pit_value impl_m_defstruct(pit_runtime *rt, pit_value args, void *data) {
if (nm_len < 0) return PIT_NIL;
nm_str[nm_len] = 0;
/* constructor */
- pit_string_snprintf(buf, sizeof(buf), ":%s", nm_str);
+ pit_libc_string_snprintf(buf, sizeof(buf), ":%s", nm_str);
aargs = pit_cons(rt, pit_intern_cstr(rt, buf), pit_cons(rt, pit_intern_cstr(rt, "array"), PIT_NIL));
fields = pit_cdr(rt, args);
while (fields != PIT_NIL) {
@@ -109,14 +112,14 @@ static pit_value impl_m_defstruct(pit_runtime *rt, pit_value args, void *data) {
);
if (field_len < 0) return PIT_NIL;
field_str[field_len] = 0;
- pit_string_snprintf(buf, sizeof(buf), ":%s", field_str);
+ pit_libc_string_snprintf(buf, sizeof(buf), ":%s", field_str);
aargs = pit_cons(rt,
pit_list(rt, 3, pit_intern_cstr(rt, "plist/get"), pit_intern_cstr(rt, buf), pit_intern_cstr(rt, "kwargs")),
aargs
);
fields = pit_cdr(rt, fields);
}
- pit_string_snprintf(buf, sizeof(buf), "%s/new", nm_str);
+ pit_libc_string_snprintf(buf, sizeof(buf), "%s/new", nm_str);
df = pit_list(rt, 4,
pit_intern_cstr(rt, "defun!"),
pit_intern_cstr(rt, buf),
@@ -135,7 +138,7 @@ static pit_value impl_m_defstruct(pit_runtime *rt, pit_value args, void *data) {
if (field_len < 0) return PIT_NIL;
field_str[field_len] = 0;
/* getter */
- pit_string_snprintf(buf, sizeof(buf), "%s/get-%s", nm_str, field_str);
+ pit_libc_string_snprintf(buf, sizeof(buf), "%s/get-%s", nm_str, field_str);
df = pit_list(rt, 4,
pit_intern_cstr(rt, "defun!"),
pit_intern_cstr(rt, buf),
@@ -148,7 +151,7 @@ static pit_value impl_m_defstruct(pit_runtime *rt, pit_value args, void *data) {
);
ret = pit_cons(rt, df, ret);
/* setter */
- pit_string_snprintf(buf, sizeof(buf), "%s/set-%s!", nm_str, field_str);
+ pit_libc_string_snprintf(buf, sizeof(buf), "%s/set-%s!", nm_str, field_str);
df = pit_list(rt, 4,
pit_intern_cstr(rt, "defun!"),
pit_intern_cstr(rt, buf),
@@ -567,7 +570,7 @@ static pit_value impl_array(pit_runtime *rt, pit_value args, void *data) {
i64 scratch_reset = rt->scratch->next;
i64 len = 0;
while (args != PIT_NIL) {
- pit_value *cell = pit_arena_alloc_bulk(rt->scratch, sizeof(pit_value));
+ pit_value *cell = pit_arena_alloc_array(rt->scratch, sizeof(pit_value));
*cell = pit_car(rt, args);
len += 1;
args = pit_cdr(rt, args);