diff --git a/lib/exec.c b/lib/exec.c
index b2a5f56..e7f9b9f 100644
--- a/lib/exec.c
+++ b/lib/exec.c
@@ -38,25 +38,7 @@ void exec_instr(struct exec* self,
switch (instr->opcode)
{
case OP_CALL: {
- MOKA fun = moka_pop(moka);
- struct vec args;
- vec_init(&args);
-
- for (ssize_t i=0; iglobal_values.data[
- moka_get_ref(moka, fun)
- ];
-
- assert(val->type == TY_NATIVE);
- struct native* native = val->data.native;
- (native->fun)(moka, &args);
-
- vec_free(&args);
+ moka_call(moka, param);
self->pc++;
} break;
diff --git a/lib/moka.c b/lib/moka.c
index 764831e..e959b35 100644
--- a/lib/moka.c
+++ b/lib/moka.c
@@ -149,6 +149,30 @@ void moka_dump(struct moka* self, MOKA value)
abort();
}
+MOKA moka_call(struct moka* self, int arg_count)
+{
+ MOKA fun = moka_pop(self);
+ struct vec args;
+ vec_init(&args);
+
+ for (ssize_t i=0; iglobal_values.data[
+ moka_get_ref(self, fun)
+ ];
+
+ assert(val->type == TY_NATIVE);
+ struct native* native = val->data.native;
+ (native->fun)(self, &args);
+
+ vec_free(&args);
+ return moka_top(self);
+}
+
MOKA moka_push_int(struct moka* self, int value, int line)
{
assert(self);
@@ -305,6 +329,12 @@ native_fun_t moka_get_native(struct moka* self, MOKA value)
MOKA moka_eval_lazy(struct moka* self, MOKA lazy_value)
{
assert(self);
+
+ if (!moka_is(self, lazy_value, TY_LAZY))
+ {
+ return lazy_value;
+ }
+
struct node* node = moka_get_lazy(self, lazy_value);
struct compiler compiler;
diff --git a/lib/moka.h b/lib/moka.h
index 2b6baf6..67223a0 100644
--- a/lib/moka.h
+++ b/lib/moka.h
@@ -39,6 +39,7 @@ TypeKind moka_type_of(struct moka* self, MOKA value);
void moka_dump(struct moka* self, MOKA value);
+MOKA moka_call(struct moka* self, int arg_count);
MOKA moka_push_int(struct moka* self, int value, int line);
int moka_get_int(struct moka* self, MOKA value);