Compare commits
4
Commits
dcab2a8875
...
a885746fdd
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a885746fdd | ||
|
|
2cf96d06c6 | ||
|
|
bbdf91ee02 | ||
|
|
27374a96eb |
@@ -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}
|
||||||
|
|||||||
@@ -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 ---
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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] == '/')
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
#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)
|
||||||
@@ -60,7 +60,9 @@ 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)
|
||||||
|
values_count = 1;
|
||||||
|
|
||||||
obj->values = malloc(values_count * sizeof(fzl_value_t));
|
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));
|
||||||
|
|||||||
@@ -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)
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -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}");
|
||||||
|
|
||||||
Reference in New Issue
Block a user