4 Commits
8 changed files with 48 additions and 17 deletions
+1 -1
View File
@@ -16,7 +16,7 @@ build-release:
cmake --build build $(COMPARING) cmake --build build $(COMPARING)
debug-c: build debug-c: build
gdb --args ./build/fzc ${FILE} gdb --args ./build/fzc -v ${FILE}
debug-vm: build debug-vm: build
gdb --args ./build/fz ${FILE} gdb --args ./build/fz ${FILE}
+2
View File
@@ -13,6 +13,8 @@ extern size_t total_jmp_on_same;
void print_object(fzl_vm_object_t *obj); void print_object(fzl_vm_object_t *obj);
void print_err_data(fzl_vm_t *vm); void print_err_data(fzl_vm_t *vm);
void escape_recursive(fzl_vm_env_t *current, fzl_vm_env_t *parent,
fzl_vm_object_t *obj);
// --- stack --- // --- stack ---
+2 -1
View File
@@ -27,6 +27,7 @@ void print_node(fzl_node_t *node, int level)
if (!node) if (!node)
return; return;
print_level(levelbuf, level);
strcpy(printbuf, levelbuf); strcpy(printbuf, levelbuf);
switch (node->type) switch (node->type)
@@ -202,7 +203,7 @@ void fzl_debug_print_ast(fzl_node_t *root)
fzl_node_t *curr = root; fzl_node_t *curr = root;
while (curr != NULL) while (curr != NULL)
{ {
print_node(curr, 3); print_node(curr, 2);
curr = curr->next; curr = curr->next;
} }
+5 -6
View File
@@ -43,18 +43,17 @@ int fzl_read(fzl_reader_t *reader)
fzl_token_t *token; fzl_token_t *token;
char curr = reader->source[p]; char curr = reader->source[p];
if (curr == '\n' || curr == ' ' || curr == '\r')
{
move(reader, 1);
continue;
}
if (is_format_str) if (is_format_str)
{ {
token = rd_fmtstr(reader); token = rd_fmtstr(reader);
if (token && token->type == FZL_TOKTYPE_STR_FORMAT_END) if (token && token->type == FZL_TOKTYPE_STR_FORMAT_END)
is_format_str = false; is_format_str = false;
} }
else if (curr == '\n' || curr == ' ' || curr == '\r')
{
move(reader, 1);
continue;
}
else if (curr == '\'' || curr == '"') else if (curr == '\'' || curr == '"')
token = rd_string_literal(reader); token = rd_string_literal(reader);
else if (curr == '/' && reader->source[p + 1] == '/') else if (curr == '/' && reader->source[p + 1] == '/')
+18 -4
View File
@@ -1,3 +1,4 @@
#include "common/fzl_types.h"
#include <common/fzl_value.h> #include <common/fzl_value.h>
#include <stdio.h> #include <stdio.h>
#include <vm/fzl_vm.h> #include <vm/fzl_vm.h>
@@ -136,7 +137,8 @@ int op_load_local(fzl_vm_t *vm)
if (depth >= vm->etop) if (depth >= vm->etop)
{ {
snprintf(last_err, sizeof(last_err), "runtime error - local depth out of range"); snprintf(last_err, sizeof(last_err),
"runtime error - local depth out of range");
print_err_data(vm); print_err_data(vm);
return -1; return -1;
} }
@@ -144,7 +146,8 @@ int op_load_local(fzl_vm_t *vm)
fzl_vm_env_t *env = vm->estack[vm->etop - 1 - depth]; fzl_vm_env_t *env = vm->estack[vm->etop - 1 - depth];
if (env->size <= slot) if (env->size <= slot)
{ {
snprintf(last_err, sizeof(last_err), "runtime error - local slot out of range"); snprintf(last_err, sizeof(last_err),
"runtime error - local slot out of range");
print_err_data(vm); print_err_data(vm);
return -1; return -1;
} }
@@ -170,7 +173,8 @@ int op_store_local(fzl_vm_t *vm)
if (depth >= vm->etop) if (depth >= vm->etop)
{ {
snprintf(last_err, sizeof(last_err), "runtime error - local depth out of range"); snprintf(last_err, sizeof(last_err),
"runtime error - local depth out of range");
print_err_data(vm); print_err_data(vm);
return -1; return -1;
} }
@@ -178,11 +182,21 @@ int op_store_local(fzl_vm_t *vm)
fzl_vm_env_t *env = vm->estack[vm->etop - 1 - depth]; fzl_vm_env_t *env = vm->estack[vm->etop - 1 - depth];
if (env->size <= slot) if (env->size <= slot)
{ {
snprintf(last_err, sizeof(last_err), "runtime error - local slot out of range"); snprintf(last_err, sizeof(last_err),
"runtime error - local slot out of range");
print_err_data(vm); print_err_data(vm);
return -1; return -1;
} }
if (value.type == FZL_TYPE_OBJECT && depth != 0)
{
for (size_t i = 0; i < depth; i++)
{
escape_recursive(vm->estack[vm->etop - i], vm->estack[vm->etop - 1 - i],
value.as.obj);
}
}
env->table[slot].value = value; env->table[slot].value = value;
return 0; return 0;
} }
+6 -4
View File
@@ -4,8 +4,8 @@
#include <vm/internals/opcode.h> #include <vm/internals/opcode.h>
// Escape objects with nested objects check // Escape objects with nested objects check
static void escape_recursive(fzl_vm_env_t *current, fzl_vm_env_t *parent, void escape_recursive(fzl_vm_env_t *current, fzl_vm_env_t *parent,
fzl_vm_object_t *obj) fzl_vm_object_t *obj)
{ {
if (!current || !parent || !obj) if (!current || !parent || !obj)
return; return;
@@ -60,8 +60,10 @@ int op_alloc_object(fzl_vm_t *vm)
uint64_t values_count = vm->ops[++vm->ip]; uint64_t values_count = vm->ops[++vm->ip];
fzl_vm_object_t *obj = malloc(sizeof(fzl_vm_object_t)); fzl_vm_object_t *obj = malloc(sizeof(fzl_vm_object_t));
if (values_count > 0) if (values_count < 1)
obj->values = malloc(values_count * sizeof(fzl_value_t)); values_count = 1;
obj->values = malloc(values_count * sizeof(fzl_value_t));
obj->values_count = values_count; obj->values_count = values_count;
memset(obj->values, 0, values_count * sizeof(fzl_value_t)); memset(obj->values, 0, values_count * sizeof(fzl_value_t));
+2 -1
View File
@@ -1,3 +1,4 @@
#include <stdio.h>
#include <string.h> #include <string.h>
#include <vm/fzl_vm.h> #include <vm/fzl_vm.h>
#include <vm/internals/opcode.h> #include <vm/internals/opcode.h>
@@ -29,7 +30,7 @@ int op_build_str(fzl_vm_t *vm)
} }
memset(temp, 0, sizeof(temp)); memset(temp, 0, sizeof(temp));
fzl_value_t val = vm->dstack[i]; fzl_value_t val = vm->dstack[vm->dtop - n + i];
switch (val.type) switch (val.type)
{ {
+12
View File
@@ -0,0 +1,12 @@
class SomeObj {}
SomeObj obj;
for (int i = 0; i < 1; i = i + 1)
{
obj = new SomeObj;
}
bool not_null = (obj != null);
printline($"The object {obj} is not null? - {not_null}");