Compare commits
3
Commits
c0c90f4f1a
...
d33aa57f8e
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
d33aa57f8e | ||
|
|
82b6cc3346 | ||
|
|
244dd33372 |
@@ -0,0 +1,61 @@
|
|||||||
|
class Node
|
||||||
|
{
|
||||||
|
int value;
|
||||||
|
Node next;
|
||||||
|
|
||||||
|
fn append(int val) Node
|
||||||
|
{
|
||||||
|
if (this.next == null)
|
||||||
|
{
|
||||||
|
Node tail = new Node;
|
||||||
|
tail.value = val;
|
||||||
|
tail.next = null;
|
||||||
|
this.next = tail;
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.next = this.next.append(val);
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn sum() int
|
||||||
|
{
|
||||||
|
if (this.next == null)
|
||||||
|
return this.value;
|
||||||
|
|
||||||
|
return this.value + this.next.sum();
|
||||||
|
}
|
||||||
|
|
||||||
|
fn printList()
|
||||||
|
{
|
||||||
|
printline(this.value);
|
||||||
|
if (this.next != null)
|
||||||
|
this.next.printList();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn createList(int count) Node
|
||||||
|
{
|
||||||
|
if (count <= 0)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
Node head = new Node;
|
||||||
|
head.value = count;
|
||||||
|
head.next = createList(count - 1);
|
||||||
|
return head;
|
||||||
|
}
|
||||||
|
|
||||||
|
printline("===== Test 1: factory & recursive escaping =====");
|
||||||
|
Node list = createList(3);
|
||||||
|
printline("Elements:");
|
||||||
|
list.printList();
|
||||||
|
|
||||||
|
printline("===== Test 2: mutation & methods =====");
|
||||||
|
int total = list.sum();
|
||||||
|
printline("Sum of elements:");
|
||||||
|
printline(total);
|
||||||
|
|
||||||
|
if (total == 16)
|
||||||
|
printline("Tests passed!");
|
||||||
|
else printline("Tests failed");
|
||||||
|
|
||||||
+95
-1
@@ -147,6 +147,55 @@ void print_object(fzl_vm_object_t *obj)
|
|||||||
printf(">\n");
|
printf(">\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void print_err_data(fzl_vm_t *vm)
|
||||||
|
{
|
||||||
|
printf("===== ERROR =====\n");
|
||||||
|
printf("> Caused on IP: %zu\n", vm->ip);
|
||||||
|
|
||||||
|
printf("\n> Data stack:\n");
|
||||||
|
for (ssize_t i = vm->dtop - 1; i >= 0; i--)
|
||||||
|
{
|
||||||
|
printf("\t> [%d] ", vm->dstack[i].type);
|
||||||
|
switch (vm->dstack[i].type)
|
||||||
|
{
|
||||||
|
case FZL_TYPE_OBJECT:
|
||||||
|
printf("ref: %p\n", vm->dstack[i].as.obj);
|
||||||
|
break;
|
||||||
|
case FZL_TYPE_STRING:
|
||||||
|
printf("str: '%s'\n", vm->dstack[i].as.s.value);
|
||||||
|
break;
|
||||||
|
case FZL_TYPE_NULL:
|
||||||
|
printf("<null>\n");
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
printf("%lu\n", vm->dstack[i].as.u);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("\n> Environments:\n");
|
||||||
|
for (ssize_t i = vm->etop - 1; i >= 0; i--)
|
||||||
|
{
|
||||||
|
fzl_vm_env_t *env = vm->estack[i];
|
||||||
|
printf("\t> [%zd] %p:\n", i, env);
|
||||||
|
|
||||||
|
printf("\t\t> Owned objects (%zu/%zu):\n", env->owned_objects_count,
|
||||||
|
env->owned_objects_remainder);
|
||||||
|
for (size_t j = 0; j < env->owned_objects_count; j++)
|
||||||
|
printf("\t\t\t> ref: %p (entries: %zu)\n", env->owned_objects[j],
|
||||||
|
env->owned_objects[j]->values_count);
|
||||||
|
|
||||||
|
printf("\t\t> Local entries (%zu/%zu):\n", env->size, env->remainder);
|
||||||
|
for (size_t j = 0; j < env->size; j++)
|
||||||
|
printf("\t\t\t> [%d] %s = %lu\n", env->table[j].value.type,
|
||||||
|
env->table[j].name, env->table[j].value.as.u);
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("\n> Call stack:\n");
|
||||||
|
for (ssize_t i = vm->ctop - 1; i >= 0; i--)
|
||||||
|
printf("\t> [%zd] %lu\n", i, vm->cstack[i]);
|
||||||
|
}
|
||||||
|
|
||||||
int fzl_vm_run(fzl_vm_t *vm)
|
int fzl_vm_run(fzl_vm_t *vm)
|
||||||
{
|
{
|
||||||
if (!vm)
|
if (!vm)
|
||||||
@@ -168,6 +217,7 @@ int fzl_vm_run(fzl_vm_t *vm)
|
|||||||
{
|
{
|
||||||
snprintf(last_err, sizeof(last_err),
|
snprintf(last_err, sizeof(last_err),
|
||||||
"runtime error - expected two values in data stack");
|
"runtime error - expected two values in data stack");
|
||||||
|
print_err_data(vm);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
fzl_value_t left = vm->dstack[--vm->dtop];
|
fzl_value_t left = vm->dstack[--vm->dtop];
|
||||||
@@ -185,6 +235,7 @@ int fzl_vm_run(fzl_vm_t *vm)
|
|||||||
{
|
{
|
||||||
snprintf(last_err, sizeof(last_err),
|
snprintf(last_err, sizeof(last_err),
|
||||||
"runtime error - expected two values in data stack");
|
"runtime error - expected two values in data stack");
|
||||||
|
print_err_data(vm);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
fzl_value_t left = vm->dstack[--vm->dtop];
|
fzl_value_t left = vm->dstack[--vm->dtop];
|
||||||
@@ -202,6 +253,7 @@ int fzl_vm_run(fzl_vm_t *vm)
|
|||||||
{
|
{
|
||||||
snprintf(last_err, sizeof(last_err),
|
snprintf(last_err, sizeof(last_err),
|
||||||
"runtime error - expected two values in data stack");
|
"runtime error - expected two values in data stack");
|
||||||
|
print_err_data(vm);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
fzl_value_t left = vm->dstack[--vm->dtop];
|
fzl_value_t left = vm->dstack[--vm->dtop];
|
||||||
@@ -218,6 +270,7 @@ int fzl_vm_run(fzl_vm_t *vm)
|
|||||||
{
|
{
|
||||||
snprintf(last_err, sizeof(last_err),
|
snprintf(last_err, sizeof(last_err),
|
||||||
"runtime error - expected two values in data stack");
|
"runtime error - expected two values in data stack");
|
||||||
|
print_err_data(vm);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
fzl_value_t left = vm->dstack[--vm->dtop];
|
fzl_value_t left = vm->dstack[--vm->dtop];
|
||||||
@@ -228,19 +281,22 @@ int fzl_vm_run(fzl_vm_t *vm)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// NOTE: make recursive owning transfer for nested objects!
|
||||||
case FZL_OPCODE_ESCAPE_OBJECT:
|
case FZL_OPCODE_ESCAPE_OBJECT:
|
||||||
{
|
{
|
||||||
if (vm->dtop < 1)
|
if (vm->dtop < 1)
|
||||||
{
|
{
|
||||||
snprintf(last_err, sizeof(last_err),
|
snprintf(last_err, sizeof(last_err),
|
||||||
"runtime error - missing value in data stack");
|
"runtime error - missing value in data stack");
|
||||||
|
print_err_data(vm);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
fzl_value_t obj = vm->dstack[--vm->dtop];
|
fzl_value_t obj = vm->dstack[--vm->dtop];
|
||||||
if (obj.type != FZL_TYPE_OBJECT)
|
if (obj.type != FZL_TYPE_OBJECT && obj.type < FZL_TYPE_INT8)
|
||||||
{
|
{
|
||||||
snprintf(last_err, sizeof(last_err),
|
snprintf(last_err, sizeof(last_err),
|
||||||
"runtime error - cannot escape non-object type");
|
"runtime error - cannot escape non-object type");
|
||||||
|
print_err_data(vm);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -250,10 +306,13 @@ int fzl_vm_run(fzl_vm_t *vm)
|
|||||||
{
|
{
|
||||||
snprintf(last_err, sizeof(last_err),
|
snprintf(last_err, sizeof(last_err),
|
||||||
"runtime error - cannot escape object from global env");
|
"runtime error - cannot escape object from global env");
|
||||||
|
print_err_data(vm);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool found = false;
|
bool found = false;
|
||||||
|
if (obj.as.u != 0)
|
||||||
|
{
|
||||||
for (size_t i = 0; i < current->owned_objects_count; i++)
|
for (size_t i = 0; i < current->owned_objects_count; i++)
|
||||||
{
|
{
|
||||||
if (obj.as.obj == current->owned_objects[i])
|
if (obj.as.obj == current->owned_objects[i])
|
||||||
@@ -263,6 +322,7 @@ int fzl_vm_run(fzl_vm_t *vm)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (found)
|
if (found)
|
||||||
{
|
{
|
||||||
@@ -310,6 +370,7 @@ int fzl_vm_run(fzl_vm_t *vm)
|
|||||||
{
|
{
|
||||||
snprintf(last_err, sizeof(last_err),
|
snprintf(last_err, sizeof(last_err),
|
||||||
"runtime error - expected value in data stack");
|
"runtime error - expected value in data stack");
|
||||||
|
print_err_data(vm);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -321,6 +382,7 @@ int fzl_vm_run(fzl_vm_t *vm)
|
|||||||
last_err, sizeof(last_err),
|
last_err, sizeof(last_err),
|
||||||
"runtime error - cannot access field #%lu of non-object type",
|
"runtime error - cannot access field #%lu of non-object type",
|
||||||
field_slot);
|
field_slot);
|
||||||
|
print_err_data(vm);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -329,6 +391,7 @@ int fzl_vm_run(fzl_vm_t *vm)
|
|||||||
{
|
{
|
||||||
snprintf(last_err, sizeof(last_err),
|
snprintf(last_err, sizeof(last_err),
|
||||||
"runtime error - cannot access field #%lu", field_slot);
|
"runtime error - cannot access field #%lu", field_slot);
|
||||||
|
print_err_data(vm);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -342,6 +405,7 @@ int fzl_vm_run(fzl_vm_t *vm)
|
|||||||
{
|
{
|
||||||
snprintf(last_err, sizeof(last_err),
|
snprintf(last_err, sizeof(last_err),
|
||||||
"runtime error - expected two values in data stack");
|
"runtime error - expected two values in data stack");
|
||||||
|
print_err_data(vm);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -354,6 +418,7 @@ int fzl_vm_run(fzl_vm_t *vm)
|
|||||||
last_err, sizeof(last_err),
|
last_err, sizeof(last_err),
|
||||||
"runtime error - cannot access field #%lu of non-object type",
|
"runtime error - cannot access field #%lu of non-object type",
|
||||||
field_slot);
|
field_slot);
|
||||||
|
print_err_data(vm);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -362,6 +427,7 @@ int fzl_vm_run(fzl_vm_t *vm)
|
|||||||
{
|
{
|
||||||
snprintf(last_err, sizeof(last_err),
|
snprintf(last_err, sizeof(last_err),
|
||||||
"runtime error - cannot access field #%lu", field_slot);
|
"runtime error - cannot access field #%lu", field_slot);
|
||||||
|
print_err_data(vm);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -383,6 +449,7 @@ int fzl_vm_run(fzl_vm_t *vm)
|
|||||||
{
|
{
|
||||||
snprintf(last_err, sizeof(last_err),
|
snprintf(last_err, sizeof(last_err),
|
||||||
"runtime error - no place to jump");
|
"runtime error - no place to jump");
|
||||||
|
print_err_data(vm);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -395,6 +462,7 @@ int fzl_vm_run(fzl_vm_t *vm)
|
|||||||
{
|
{
|
||||||
snprintf(last_err, sizeof(last_err),
|
snprintf(last_err, sizeof(last_err),
|
||||||
"runtime error - expected two values in data stack");
|
"runtime error - expected two values in data stack");
|
||||||
|
print_err_data(vm);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -409,6 +477,7 @@ int fzl_vm_run(fzl_vm_t *vm)
|
|||||||
{
|
{
|
||||||
snprintf(last_err, sizeof(last_err),
|
snprintf(last_err, sizeof(last_err),
|
||||||
"runtime error - expected two values in data stack");
|
"runtime error - expected two values in data stack");
|
||||||
|
print_err_data(vm);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -423,6 +492,7 @@ int fzl_vm_run(fzl_vm_t *vm)
|
|||||||
{
|
{
|
||||||
snprintf(last_err, sizeof(last_err),
|
snprintf(last_err, sizeof(last_err),
|
||||||
"runtime error - expected two values in data stack");
|
"runtime error - expected two values in data stack");
|
||||||
|
print_err_data(vm);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -437,6 +507,7 @@ int fzl_vm_run(fzl_vm_t *vm)
|
|||||||
{
|
{
|
||||||
snprintf(last_err, sizeof(last_err),
|
snprintf(last_err, sizeof(last_err),
|
||||||
"runtime error - expected two values in data stack");
|
"runtime error - expected two values in data stack");
|
||||||
|
print_err_data(vm);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -451,6 +522,7 @@ int fzl_vm_run(fzl_vm_t *vm)
|
|||||||
{
|
{
|
||||||
snprintf(last_err, sizeof(last_err),
|
snprintf(last_err, sizeof(last_err),
|
||||||
"runtime error - expected two values in data stack");
|
"runtime error - expected two values in data stack");
|
||||||
|
print_err_data(vm);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -465,6 +537,7 @@ int fzl_vm_run(fzl_vm_t *vm)
|
|||||||
{
|
{
|
||||||
snprintf(last_err, sizeof(last_err),
|
snprintf(last_err, sizeof(last_err),
|
||||||
"runtime error - expected two values in data stack");
|
"runtime error - expected two values in data stack");
|
||||||
|
print_err_data(vm);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -479,6 +552,7 @@ int fzl_vm_run(fzl_vm_t *vm)
|
|||||||
{
|
{
|
||||||
snprintf(last_err, sizeof(last_err),
|
snprintf(last_err, sizeof(last_err),
|
||||||
"runtime error - expected value in data stack");
|
"runtime error - expected value in data stack");
|
||||||
|
print_err_data(vm);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -492,6 +566,7 @@ int fzl_vm_run(fzl_vm_t *vm)
|
|||||||
{
|
{
|
||||||
snprintf(last_err, sizeof(last_err),
|
snprintf(last_err, sizeof(last_err),
|
||||||
"runtime error - expected value in data stack");
|
"runtime error - expected value in data stack");
|
||||||
|
print_err_data(vm);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -510,6 +585,7 @@ int fzl_vm_run(fzl_vm_t *vm)
|
|||||||
{
|
{
|
||||||
snprintf(last_err, sizeof(last_err),
|
snprintf(last_err, sizeof(last_err),
|
||||||
"runtime error - expected two values in data stack");
|
"runtime error - expected two values in data stack");
|
||||||
|
print_err_data(vm);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -524,6 +600,7 @@ int fzl_vm_run(fzl_vm_t *vm)
|
|||||||
{
|
{
|
||||||
snprintf(last_err, sizeof(last_err),
|
snprintf(last_err, sizeof(last_err),
|
||||||
"runtime error - expected two values in data stack");
|
"runtime error - expected two values in data stack");
|
||||||
|
print_err_data(vm);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -538,6 +615,7 @@ int fzl_vm_run(fzl_vm_t *vm)
|
|||||||
{
|
{
|
||||||
snprintf(last_err, sizeof(last_err),
|
snprintf(last_err, sizeof(last_err),
|
||||||
"runtime error - expected var name in data stack");
|
"runtime error - expected var name in data stack");
|
||||||
|
print_err_data(vm);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -552,6 +630,7 @@ int fzl_vm_run(fzl_vm_t *vm)
|
|||||||
{
|
{
|
||||||
snprintf(last_err, sizeof(last_err),
|
snprintf(last_err, sizeof(last_err),
|
||||||
"runtime error - expected 2 values in data stack");
|
"runtime error - expected 2 values in data stack");
|
||||||
|
print_err_data(vm);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -567,21 +646,25 @@ int fzl_vm_run(fzl_vm_t *vm)
|
|||||||
case FZL_VM_ENV_WRESULT_ERR:
|
case FZL_VM_ENV_WRESULT_ERR:
|
||||||
snprintf(last_err, sizeof(last_err),
|
snprintf(last_err, sizeof(last_err),
|
||||||
"runtime error - failed to write variable");
|
"runtime error - failed to write variable");
|
||||||
|
print_err_data(vm);
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
case FZL_VM_ENV_WRESULT_ERR_EXISTS:
|
case FZL_VM_ENV_WRESULT_ERR_EXISTS:
|
||||||
snprintf(last_err, sizeof(last_err),
|
snprintf(last_err, sizeof(last_err),
|
||||||
"runtime error - redefenition of '%s'",
|
"runtime error - redefenition of '%s'",
|
||||||
writevar.as.s.value);
|
writevar.as.s.value);
|
||||||
|
print_err_data(vm);
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
case FZL_VM_ENV_WRESULT_ERR_NOT_FOUND:
|
case FZL_VM_ENV_WRESULT_ERR_NOT_FOUND:
|
||||||
snprintf(last_err, sizeof(last_err),
|
snprintf(last_err, sizeof(last_err),
|
||||||
"runtime error - cannot find name '%s'",
|
"runtime error - cannot find name '%s'",
|
||||||
writevar.as.s.value);
|
writevar.as.s.value);
|
||||||
|
print_err_data(vm);
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
print_err_data(vm);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -605,6 +688,7 @@ int fzl_vm_run(fzl_vm_t *vm)
|
|||||||
{
|
{
|
||||||
snprintf(last_err, sizeof(last_err),
|
snprintf(last_err, sizeof(last_err),
|
||||||
"runtime error - LOOKUP_ENV: empty data stack");
|
"runtime error - LOOKUP_ENV: empty data stack");
|
||||||
|
print_err_data(vm);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -647,6 +731,7 @@ int fzl_vm_run(fzl_vm_t *vm)
|
|||||||
{
|
{
|
||||||
snprintf(last_err, sizeof(last_err),
|
snprintf(last_err, sizeof(last_err),
|
||||||
"runtime error - undefined builtin %lu", fn_id);
|
"runtime error - undefined builtin %lu", fn_id);
|
||||||
|
print_err_data(vm);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -658,6 +743,7 @@ int fzl_vm_run(fzl_vm_t *vm)
|
|||||||
if (vm->consts_count <= cn)
|
if (vm->consts_count <= cn)
|
||||||
{
|
{
|
||||||
snprintf(last_err, sizeof(last_err), "runtime error - unknown const");
|
snprintf(last_err, sizeof(last_err), "runtime error - unknown const");
|
||||||
|
print_err_data(vm);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
fzl_const_t c = vm->consts[cn];
|
fzl_const_t c = vm->consts[cn];
|
||||||
@@ -673,6 +759,7 @@ int fzl_vm_run(fzl_vm_t *vm)
|
|||||||
{
|
{
|
||||||
snprintf(last_err, sizeof(last_err),
|
snprintf(last_err, sizeof(last_err),
|
||||||
"runtime error - expected 2 values in stack");
|
"runtime error - expected 2 values in stack");
|
||||||
|
print_err_data(vm);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
fzl_value_t add1 = vm->dstack[--vm->dtop];
|
fzl_value_t add1 = vm->dstack[--vm->dtop];
|
||||||
@@ -686,6 +773,7 @@ int fzl_vm_run(fzl_vm_t *vm)
|
|||||||
{
|
{
|
||||||
snprintf(last_err, sizeof(last_err),
|
snprintf(last_err, sizeof(last_err),
|
||||||
"runtime error - expected 2 values in stack");
|
"runtime error - expected 2 values in stack");
|
||||||
|
print_err_data(vm);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
fzl_value_t sub2 = vm->dstack[--vm->dtop];
|
fzl_value_t sub2 = vm->dstack[--vm->dtop];
|
||||||
@@ -699,6 +787,7 @@ int fzl_vm_run(fzl_vm_t *vm)
|
|||||||
{
|
{
|
||||||
snprintf(last_err, sizeof(last_err),
|
snprintf(last_err, sizeof(last_err),
|
||||||
"runtime error - expected 2 values in stack");
|
"runtime error - expected 2 values in stack");
|
||||||
|
print_err_data(vm);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
fzl_value_t mul1 = vm->dstack[--vm->dtop];
|
fzl_value_t mul1 = vm->dstack[--vm->dtop];
|
||||||
@@ -712,6 +801,7 @@ int fzl_vm_run(fzl_vm_t *vm)
|
|||||||
{
|
{
|
||||||
snprintf(last_err, sizeof(last_err),
|
snprintf(last_err, sizeof(last_err),
|
||||||
"runtime error - expected 2 values in stack");
|
"runtime error - expected 2 values in stack");
|
||||||
|
print_err_data(vm);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
fzl_value_t div1 = vm->dstack[--vm->dtop];
|
fzl_value_t div1 = vm->dstack[--vm->dtop];
|
||||||
@@ -725,6 +815,7 @@ int fzl_vm_run(fzl_vm_t *vm)
|
|||||||
{
|
{
|
||||||
snprintf(last_err, sizeof(last_err),
|
snprintf(last_err, sizeof(last_err),
|
||||||
"runtime error - expected 2 values in stack");
|
"runtime error - expected 2 values in stack");
|
||||||
|
print_err_data(vm);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
fzl_value_t pow2 = vm->dstack[--vm->dtop];
|
fzl_value_t pow2 = vm->dstack[--vm->dtop];
|
||||||
@@ -745,6 +836,7 @@ int fzl_vm_run(fzl_vm_t *vm)
|
|||||||
{
|
{
|
||||||
snprintf(last_err, sizeof(last_err),
|
snprintf(last_err, sizeof(last_err),
|
||||||
"runtime error - expected 2 values in stack");
|
"runtime error - expected 2 values in stack");
|
||||||
|
print_err_data(vm);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
fzl_value_t mod1 = vm->dstack[--vm->dtop];
|
fzl_value_t mod1 = vm->dstack[--vm->dtop];
|
||||||
@@ -758,6 +850,7 @@ int fzl_vm_run(fzl_vm_t *vm)
|
|||||||
{
|
{
|
||||||
snprintf(last_err, sizeof(last_err),
|
snprintf(last_err, sizeof(last_err),
|
||||||
"runtime error - expected value in stack");
|
"runtime error - expected value in stack");
|
||||||
|
print_err_data(vm);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
fzl_value_t neg_n = vm->dstack[--vm->dtop];
|
fzl_value_t neg_n = vm->dstack[--vm->dtop];
|
||||||
@@ -784,6 +877,7 @@ int fzl_vm_run(fzl_vm_t *vm)
|
|||||||
default:
|
default:
|
||||||
snprintf(last_err, sizeof(last_err),
|
snprintf(last_err, sizeof(last_err),
|
||||||
"runtime error - unknown opcode %u", opcode);
|
"runtime error - unknown opcode %u", opcode);
|
||||||
|
print_err_data(vm);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user