Compare commits
4 Commits
bbb1e38649
...
b312c0d8a3
| Author | SHA1 | Date | |
|---|---|---|---|
| b312c0d8a3 | |||
| 3e115095d6 | |||
| f2b714baaa | |||
| 92e4a41662 |
@@ -33,10 +33,9 @@ fn makeCounter() {
|
||||
|
||||
var tally = makeCounter();
|
||||
|
||||
while (true) {
|
||||
var result = tally();
|
||||
|
||||
print result; //prints 1 to 10
|
||||
var result = 0;
|
||||
while (result = tally()) {
|
||||
print result;
|
||||
|
||||
if (result >= 10) {
|
||||
break;
|
||||
|
||||
+3
-4
@@ -29,10 +29,9 @@ fn makeCounter() {
|
||||
|
||||
var tally = makeCounter();
|
||||
|
||||
while (true) {
|
||||
var result = tally();
|
||||
|
||||
print result; //prints 1 to 10
|
||||
var result = 0;
|
||||
while (result = tally()) {
|
||||
print result;
|
||||
|
||||
if (result >= 10) {
|
||||
break;
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
//tentatively functional
|
||||
|
||||
//fibonacci sequence
|
||||
fn fib(n) {
|
||||
if (n < 2) return n;
|
||||
@@ -0,0 +1,2 @@
|
||||
//the semicolon is super important
|
||||
print "Hello world!";
|
||||
@@ -1,11 +1,10 @@
|
||||
//find the leap years
|
||||
//is 'n' a leap year
|
||||
fn isLeapYear(n: Int) {
|
||||
if (n % 400 == 0) return true;
|
||||
if (n % 100 == 0) return false;
|
||||
return n % 4 == 0;
|
||||
}
|
||||
|
||||
//check for string reuse
|
||||
{
|
||||
print isLeapYear(1999);
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
|
||||
var randi: Int = 69420;
|
||||
fn rand() {
|
||||
//a quick and dirty random number generator
|
||||
return randi = randi * 1664525 + 1013904223;
|
||||
}
|
||||
|
||||
print rand();
|
||||
print rand();
|
||||
print rand();
|
||||
@@ -8,11 +8,11 @@ fn makeCounter() {
|
||||
return increment;
|
||||
}
|
||||
|
||||
//'tally' becomes a closure
|
||||
var tally = makeCounter();
|
||||
|
||||
while (true) {
|
||||
var result = tally();
|
||||
|
||||
var result = 0;
|
||||
while (result = tally()) {
|
||||
print result;
|
||||
|
||||
if (result >= 10) {
|
||||
@@ -9,7 +9,6 @@
|
||||
#include "toy_compiler.h"
|
||||
#include "toy_vm.h"
|
||||
|
||||
//NOTE: for testing
|
||||
#include "standard_library.h"
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
+161
-24
@@ -1,49 +1,185 @@
|
||||
#include "standard_library.h"
|
||||
#include "toy_console_colors.h"
|
||||
|
||||
#include "toy_print.h"
|
||||
#include "toy_scope.h"
|
||||
#include "toy_stack.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
|
||||
typedef struct CallbackPairs {
|
||||
const char* name;
|
||||
Toy_nativeCallback callback;
|
||||
} CallbackPairs;
|
||||
|
||||
//example callbacks
|
||||
static void answer(Toy_VM* vm, Toy_FunctionNative* self) {
|
||||
(void)vm;
|
||||
//example of how to write and use C bindings
|
||||
static void std_min(Toy_VM* vm, Toy_FunctionNative* self) {
|
||||
(void)self;
|
||||
Toy_print(TOY_CC_DEBUG "This function returns the integer '42' to the calling scope." TOY_CC_RESET);
|
||||
Toy_pushStack(&vm->stack, TOY_VALUE_FROM_INTEGER(42));
|
||||
|
||||
//return the lesser of two values, or null on error
|
||||
Toy_Value first = Toy_popStack(&vm->stack);
|
||||
Toy_Value second = Toy_popStack(&vm->stack);
|
||||
|
||||
//check types
|
||||
if ((!TOY_VALUE_IS_INTEGER(first) && !TOY_VALUE_IS_FLOAT(first)) || (!TOY_VALUE_IS_INTEGER(second) && !TOY_VALUE_IS_FLOAT(second))) {
|
||||
char buffer[256];
|
||||
snprintf(buffer, 256, "Invalid types '%s' and '%s' found in 'min()'", Toy_getValueTypeAsCString(Toy_unwrapValue(first).type), Toy_getValueTypeAsCString(Toy_unwrapValue(second).type));
|
||||
Toy_error(buffer);
|
||||
|
||||
Toy_freeValue(first);
|
||||
Toy_freeValue(second);
|
||||
Toy_pushStack(&vm->stack, TOY_VALUE_FROM_NULL());
|
||||
return;
|
||||
}
|
||||
|
||||
static void identity(Toy_VM* vm, Toy_FunctionNative* self) {
|
||||
//does nothing, but any arguements are left on the stack as results
|
||||
(void)vm;
|
||||
(void)self;
|
||||
//compare ints, or coerce ints into floats if needed
|
||||
if (TOY_VALUE_IS_INTEGER(first) && TOY_VALUE_IS_INTEGER(second)) {
|
||||
Toy_Value result = TOY_VALUE_FROM_INTEGER(TOY_VALUE_AS_INTEGER(first) < TOY_VALUE_AS_INTEGER(second) ? TOY_VALUE_AS_INTEGER(first) : TOY_VALUE_AS_INTEGER(second));
|
||||
Toy_pushStack(&vm->stack, result);
|
||||
return;
|
||||
}
|
||||
else if (TOY_VALUE_IS_INTEGER(first) && TOY_VALUE_IS_FLOAT(second)) {
|
||||
first = TOY_VALUE_FROM_FLOAT( (float)TOY_VALUE_AS_INTEGER(first) );
|
||||
}
|
||||
else if (TOY_VALUE_IS_FLOAT(first) && TOY_VALUE_IS_INTEGER(second)) {
|
||||
second = TOY_VALUE_FROM_FLOAT( (float)TOY_VALUE_AS_INTEGER(second) );
|
||||
}
|
||||
|
||||
static void echo(Toy_VM* vm, Toy_FunctionNative* self) {
|
||||
//finally, do the comparison on floats
|
||||
Toy_Value result = TOY_VALUE_FROM_FLOAT(TOY_VALUE_AS_FLOAT(first) < TOY_VALUE_AS_FLOAT(second) ? TOY_VALUE_AS_FLOAT(first) : TOY_VALUE_AS_FLOAT(second));
|
||||
Toy_pushStack(&vm->stack, result);
|
||||
//NOTE: not freeing scalar values does work, but only in narrow cases
|
||||
}
|
||||
|
||||
static void std_max(Toy_VM* vm, Toy_FunctionNative* self) {
|
||||
(void)self;
|
||||
//pops one argument, and prints it
|
||||
|
||||
//return the lesser of two values, or null on error
|
||||
Toy_Value first = Toy_popStack(&vm->stack);
|
||||
Toy_Value second = Toy_popStack(&vm->stack);
|
||||
|
||||
//check types
|
||||
if ((!TOY_VALUE_IS_INTEGER(first) && !TOY_VALUE_IS_FLOAT(first)) || (!TOY_VALUE_IS_INTEGER(second) && !TOY_VALUE_IS_FLOAT(second))) {
|
||||
char buffer[256];
|
||||
snprintf(buffer, 256, "Invalid types '%s' and '%s' found in 'max()'", Toy_getValueTypeAsCString(Toy_unwrapValue(first).type), Toy_getValueTypeAsCString(Toy_unwrapValue(second).type));
|
||||
Toy_error(buffer);
|
||||
|
||||
Toy_freeValue(first);
|
||||
Toy_freeValue(second);
|
||||
Toy_pushStack(&vm->stack, TOY_VALUE_FROM_NULL());
|
||||
return;
|
||||
}
|
||||
|
||||
//compare ints, or coerce ints into floats if needed
|
||||
if (TOY_VALUE_IS_INTEGER(first) && TOY_VALUE_IS_INTEGER(second)) {
|
||||
Toy_Value result = TOY_VALUE_FROM_INTEGER(TOY_VALUE_AS_INTEGER(first) > TOY_VALUE_AS_INTEGER(second) ? TOY_VALUE_AS_INTEGER(first) : TOY_VALUE_AS_INTEGER(second));
|
||||
Toy_pushStack(&vm->stack, result);
|
||||
return;
|
||||
}
|
||||
else if (TOY_VALUE_IS_INTEGER(first) && TOY_VALUE_IS_FLOAT(second)) {
|
||||
first = TOY_VALUE_FROM_FLOAT( (float)TOY_VALUE_AS_INTEGER(first) );
|
||||
}
|
||||
else if (TOY_VALUE_IS_FLOAT(first) && TOY_VALUE_IS_INTEGER(second)) {
|
||||
second = TOY_VALUE_FROM_FLOAT( (float)TOY_VALUE_AS_INTEGER(second) );
|
||||
}
|
||||
|
||||
//finally, do the comparison on floats
|
||||
Toy_Value result = TOY_VALUE_FROM_FLOAT(TOY_VALUE_AS_FLOAT(first) > TOY_VALUE_AS_FLOAT(second) ? TOY_VALUE_AS_FLOAT(first) : TOY_VALUE_AS_FLOAT(second));
|
||||
Toy_pushStack(&vm->stack, result);
|
||||
//NOTE: not freeing scalar values does work, but only in narrow cases
|
||||
}
|
||||
|
||||
static void std_floor(Toy_VM* vm, Toy_FunctionNative* self) {
|
||||
(void)self;
|
||||
|
||||
Toy_Value value = Toy_popStack(&vm->stack);
|
||||
Toy_String* string = Toy_stringifyValue(&vm->memoryBucket, value);
|
||||
char* cstr = Toy_getStringRaw(string);
|
||||
|
||||
Toy_print(cstr);
|
||||
if (!TOY_VALUE_IS_INTEGER(value) && !TOY_VALUE_IS_FLOAT(value)) {
|
||||
char buffer[256];
|
||||
snprintf(buffer, 256, "Invalid type '%s' found in 'floor()'", Toy_getValueTypeAsCString(Toy_unwrapValue(value).type));
|
||||
Toy_error(buffer);
|
||||
|
||||
free(cstr);
|
||||
Toy_freeString(string);
|
||||
Toy_freeValue(value);
|
||||
Toy_pushStack(&vm->stack, TOY_VALUE_FROM_NULL());
|
||||
return;
|
||||
}
|
||||
|
||||
//this only runs on floats, but converts them to integers
|
||||
if (TOY_VALUE_IS_FLOAT(value)) {
|
||||
double d = (double)TOY_VALUE_AS_FLOAT(value);
|
||||
d = floor(d);
|
||||
value = TOY_VALUE_FROM_INTEGER((int)d);
|
||||
}
|
||||
|
||||
Toy_pushStack(&vm->stack, value);
|
||||
}
|
||||
|
||||
static void std_ceil(Toy_VM* vm, Toy_FunctionNative* self) {
|
||||
(void)self;
|
||||
|
||||
Toy_Value value = Toy_popStack(&vm->stack);
|
||||
|
||||
if (!TOY_VALUE_IS_INTEGER(value) && !TOY_VALUE_IS_FLOAT(value)) {
|
||||
char buffer[256];
|
||||
snprintf(buffer, 256, "Invalid type '%s' found in 'ceil()'", Toy_getValueTypeAsCString(Toy_unwrapValue(value).type));
|
||||
Toy_error(buffer);
|
||||
|
||||
Toy_freeValue(value);
|
||||
Toy_pushStack(&vm->stack, TOY_VALUE_FROM_NULL());
|
||||
return;
|
||||
}
|
||||
|
||||
//this only runs on floats, but converts them to integers
|
||||
if (TOY_VALUE_IS_FLOAT(value)) {
|
||||
double d = (double)TOY_VALUE_AS_FLOAT(value);
|
||||
d = ceil(d);
|
||||
value = TOY_VALUE_FROM_INTEGER((int)d);
|
||||
}
|
||||
|
||||
Toy_pushStack(&vm->stack, value);
|
||||
}
|
||||
|
||||
static void std_sqrt(Toy_VM* vm, Toy_FunctionNative* self) {
|
||||
(void)self;
|
||||
|
||||
Toy_Value value = Toy_popStack(&vm->stack);
|
||||
|
||||
if (!TOY_VALUE_IS_INTEGER(value) && !TOY_VALUE_IS_FLOAT(value)) {
|
||||
char buffer[256];
|
||||
snprintf(buffer, 256, "Invalid type '%s' found in 'sqrt()'", Toy_getValueTypeAsCString(Toy_unwrapValue(value).type));
|
||||
Toy_error(buffer);
|
||||
|
||||
Toy_freeValue(value);
|
||||
Toy_pushStack(&vm->stack, TOY_VALUE_FROM_NULL());
|
||||
return;
|
||||
}
|
||||
|
||||
double d = 0;
|
||||
|
||||
if (TOY_VALUE_IS_INTEGER(value)) d = (double)TOY_VALUE_AS_INTEGER(value);
|
||||
else if (TOY_VALUE_IS_FLOAT(value)) d = (double)TOY_VALUE_AS_FLOAT(value);
|
||||
|
||||
//only works on non-negative values
|
||||
if (d < 0) {
|
||||
char buffer[256];
|
||||
snprintf(buffer, 256, "Can't get the sqrt of a negative number (found '%g')", d);
|
||||
Toy_error(buffer);
|
||||
|
||||
Toy_freeValue(value);
|
||||
Toy_pushStack(&vm->stack, TOY_VALUE_FROM_NULL());
|
||||
return;
|
||||
}
|
||||
|
||||
//do the thing and push the result
|
||||
d = sqrt(d);
|
||||
|
||||
Toy_pushStack(&vm->stack, TOY_VALUE_FROM_FLOAT((float)d));
|
||||
}
|
||||
|
||||
static void next(Toy_VM* vm, Toy_FunctionNative* self) {
|
||||
//used by 'range'
|
||||
//used by 'std_range'
|
||||
if (self->meta2 < self->meta1) {
|
||||
Toy_Value result = TOY_VALUE_FROM_INTEGER(self->meta2);
|
||||
Toy_pushStack(&vm->stack, result);
|
||||
@@ -54,7 +190,7 @@ static void next(Toy_VM* vm, Toy_FunctionNative* self) {
|
||||
}
|
||||
}
|
||||
|
||||
static void range(Toy_VM* vm, Toy_FunctionNative* self) {
|
||||
static void std_range(Toy_VM* vm, Toy_FunctionNative* self) {
|
||||
(void)self;
|
||||
|
||||
//one arg to represent the number of iterations
|
||||
@@ -79,12 +215,13 @@ static void range(Toy_VM* vm, Toy_FunctionNative* self) {
|
||||
Toy_pushStack(&vm->stack, result);
|
||||
}
|
||||
|
||||
|
||||
CallbackPairs callbackPairs[] = {
|
||||
{"dbg_answer", answer},
|
||||
{"dbg_identity", identity},
|
||||
{"dbg_echo", echo},
|
||||
{"range", range},
|
||||
{"min", std_min},
|
||||
{"max", std_max},
|
||||
{"floor", std_floor},
|
||||
{"ceil", std_ceil},
|
||||
{"sqrt", std_sqrt},
|
||||
{"range", std_range},
|
||||
|
||||
{NULL, NULL},
|
||||
};
|
||||
|
||||
@@ -1,16 +0,0 @@
|
||||
//calculate the nth fibonacci number, and print it
|
||||
|
||||
var counter: Int = 0;
|
||||
|
||||
var first: Int = 1;
|
||||
var second: Int = 0;
|
||||
|
||||
while (counter < 100_000) {
|
||||
var third: Int = first + second;
|
||||
first = second;
|
||||
second = third;
|
||||
|
||||
print third;
|
||||
|
||||
++counter;
|
||||
}
|
||||
@@ -1,11 +0,0 @@
|
||||
|
||||
fn output(arg) {
|
||||
print arg;
|
||||
}
|
||||
|
||||
var array = ["alpha", "bravo", "charlie"];
|
||||
|
||||
|
||||
|
||||
array.forEach(echo);
|
||||
array.forEach(output);
|
||||
@@ -1,35 +0,0 @@
|
||||
//WARN: This is just a scratch pad, don't use it
|
||||
//TODO: table.hasValue or table.getKeyFromValue?
|
||||
|
||||
|
||||
//for (var i in array) print i;
|
||||
//for (var i in table) print i;
|
||||
//for (var i in range(10)) print i;
|
||||
//for (range(10)) print "ha";
|
||||
|
||||
|
||||
//example of a `range`-like function
|
||||
fn range(limit: Int) {
|
||||
var counter: Int = 0;
|
||||
|
||||
fn next() {
|
||||
if (counter >= limit) {
|
||||
return null;
|
||||
}
|
||||
else return counter++;
|
||||
}
|
||||
|
||||
return next;
|
||||
}
|
||||
|
||||
var next = range(10);
|
||||
|
||||
|
||||
fn log(x) {
|
||||
if (x == null) return;
|
||||
print x;
|
||||
}
|
||||
|
||||
while (true) {
|
||||
log(next());
|
||||
}
|
||||
@@ -1,21 +0,0 @@
|
||||
|
||||
|
||||
var table = [
|
||||
"Alpha": 1,
|
||||
"Bravo": 2,
|
||||
"Charlie": 3,
|
||||
"Delta": 4,
|
||||
"Echo": 5,
|
||||
"Foxtrot": 6,
|
||||
"Golf": 7,
|
||||
"Hotel": 8,
|
||||
"India": 9,
|
||||
"Juliett": 10,
|
||||
"Kilo": 11,
|
||||
"Lima": 12,
|
||||
"Mike": 13,
|
||||
];
|
||||
|
||||
for (var i in table) {
|
||||
print i;
|
||||
}
|
||||
@@ -1,12 +0,0 @@
|
||||
|
||||
|
||||
|
||||
var randi: Int = 69420;
|
||||
fn rand() {
|
||||
return randi = randi * 1664525 + 1013904223;
|
||||
}
|
||||
|
||||
|
||||
var a = rand();
|
||||
|
||||
|
||||
@@ -56,5 +56,3 @@ TOY_API void Toy_collectBucketGarbage(Toy_Bucket** bucketHandle);
|
||||
#ifndef TOY_BUCKET_IDEAL
|
||||
#define TOY_BUCKET_IDEAL (TOY_BUCKET_64KB - sizeof(Toy_Bucket))
|
||||
#endif
|
||||
|
||||
//TODO: check for leaks when freeBucket is called, for debugging
|
||||
+14
-2
@@ -632,6 +632,12 @@ static unsigned int writeInstructionIfThenElse(Toy_Bytecode** mb, Toy_AstIfThenE
|
||||
//cond-branch
|
||||
writeBytecodeFromAst(mb, ast.condBranch);
|
||||
|
||||
//leave the assigned value on the stack when inside a condition
|
||||
if (checkForChainedAssign(ast.condBranch)) {
|
||||
Toy_AstVarAccess access = { .type = TOY_AST_VAR_ACCESS, .child = ast.condBranch->varAssign.target };
|
||||
writeInstructionAccess(mb, access);
|
||||
}
|
||||
|
||||
//emit the jump word (opcode, type, condition, padding)
|
||||
EMIT_BYTE(mb, code, TOY_OPCODE_JUMP);
|
||||
EMIT_BYTE(mb, code, TOY_OP_PARAM_JUMP_RELATIVE);
|
||||
@@ -677,6 +683,12 @@ static unsigned int writeInstructionWhileThen(Toy_Bytecode** mb, Toy_AstWhileThe
|
||||
//cond-branch
|
||||
writeBytecodeFromAst(mb, ast.condBranch);
|
||||
|
||||
//leave the assigned value on the stack when inside a condition
|
||||
if (checkForChainedAssign(ast.condBranch)) {
|
||||
Toy_AstVarAccess access = { .type = TOY_AST_VAR_ACCESS, .child = ast.condBranch->varAssign.target };
|
||||
writeInstructionAccess(mb, access);
|
||||
}
|
||||
|
||||
//emit the jump word (opcode, type, condition, padding)
|
||||
EMIT_BYTE(mb, code, TOY_OPCODE_JUMP);
|
||||
EMIT_BYTE(mb, code, TOY_OP_PARAM_JUMP_RELATIVE);
|
||||
@@ -775,7 +787,7 @@ static unsigned int writeInstructionForThen(Toy_Bytecode** mb, Toy_AstForThen as
|
||||
|
||||
emitString(mb, ast.condBranch->iterable.left->varDeclare.name);
|
||||
|
||||
//TODO: use a different approach
|
||||
//TODO: use a different approach?
|
||||
//BUGFIX: shadow the iterable's name
|
||||
EMIT_BYTE(mb, code, TOY_OPCODE_READ);
|
||||
EMIT_BYTE(mb, code, TOY_VALUE_NULL);
|
||||
@@ -1452,7 +1464,7 @@ static void writeBytecodeBody(Toy_Bytecode* mb, Toy_Ast* ast) {
|
||||
writeBytecodeFromAst(&mb, ast);
|
||||
|
||||
//append an extra return if needed
|
||||
if (mb->codeCount <= 4 || mb->code[mb->codeCount - 4] != TOY_OPCODE_RETURN) { //if empty or no return statement
|
||||
if (mb->codeCount < 4 || mb->code[mb->codeCount - 4] != TOY_OPCODE_RETURN) { //if empty or no return statement
|
||||
EMIT_BYTE(&mb, code, TOY_OPCODE_RETURN); //end terminator
|
||||
EMIT_BYTE(&mb, code, 0); //4-byte alignment
|
||||
EMIT_BYTE(&mb, code, 0);
|
||||
|
||||
+3
-17
@@ -464,29 +464,15 @@ Toy_String* Toy_stringifyValue(Toy_Bucket** bucketHandle, Toy_Value value) {
|
||||
}
|
||||
|
||||
case TOY_VALUE_INTEGER: {
|
||||
char buffer[16];
|
||||
char buffer[128];
|
||||
sprintf(buffer, "%d", value.as.integer);
|
||||
return Toy_createStringLength(bucketHandle, buffer, strlen(buffer));
|
||||
}
|
||||
|
||||
case TOY_VALUE_FLOAT: {
|
||||
//using printf
|
||||
char buffer[16];
|
||||
sprintf(buffer, "%f", value.as.number);
|
||||
|
||||
//BUGFIX: printf format specificer '%f' will set the precision to 6 decimal places, which means there's trailing zeroes
|
||||
char buffer[128];
|
||||
sprintf(buffer, "%g", value.as.number);
|
||||
unsigned int length = strlen(buffer);
|
||||
|
||||
//find the decimal, if it exists
|
||||
unsigned int decimal = 0;
|
||||
while (decimal != length && buffer[decimal] != '.' && buffer[decimal] != ',') decimal++; //'.' and ',' supports more locales
|
||||
|
||||
//locales are hard, sorry!
|
||||
if (decimal != length && buffer[decimal] == ',') buffer[decimal] = '.';
|
||||
|
||||
//wipe the trailing zeros
|
||||
while(decimal != length && buffer[length-1] == '0') buffer[--length] = '\0';
|
||||
|
||||
return Toy_createStringLength(bucketHandle, buffer, length);
|
||||
}
|
||||
|
||||
|
||||
+2
-2
@@ -546,7 +546,7 @@ static void processIterate(Toy_VM* vm) {
|
||||
processJump(vm);
|
||||
}
|
||||
}
|
||||
//TODO: support closures as a parameter
|
||||
//TODO: support closures in for-loops
|
||||
else {
|
||||
fprintf(stderr, TOY_CC_ERROR "ERROR: Unknown iterable type '%s' found in for loop, exiting\n" TOY_CC_RESET, Toy_getValueTypeAsCString(Toy_unwrapValue(compound).type));
|
||||
exit(-1);
|
||||
@@ -826,7 +826,7 @@ static void processAssert(Toy_VM* vm) {
|
||||
|
||||
//determine the args
|
||||
if (count == 1) {
|
||||
message = TOY_VALUE_FROM_STRING(Toy_toString(&vm->memoryBucket, "assertion failed")); //TODO: better default error message
|
||||
message = TOY_VALUE_FROM_STRING(Toy_toString(&vm->memoryBucket, "assertion failed")); //TODO: better default assert message
|
||||
value = Toy_popStack(&vm->stack);
|
||||
}
|
||||
else if (count == 2) {
|
||||
|
||||
@@ -7,5 +7,3 @@ all:
|
||||
gdb:
|
||||
$(MAKE) -C units -k gdb
|
||||
$(MAKE) -C scripts -k gdb
|
||||
|
||||
#TODO: valgrind
|
||||
@@ -1 +1 @@
|
||||
//TODO: empty test script
|
||||
//URGENT: empty test script
|
||||
@@ -1 +1 @@
|
||||
//TODO: empty test script
|
||||
//URGENT: empty test script
|
||||
@@ -1,4 +1,4 @@
|
||||
//TODO: empty test script
|
||||
//URGENT: empty test script
|
||||
|
||||
//TODO: test iteration on arrays, tables, closures
|
||||
|
||||
|
||||
@@ -1,8 +1,12 @@
|
||||
|
||||
fn empty() { //BUG: there's an extra return in the bytecode
|
||||
fn empty() {
|
||||
//
|
||||
}
|
||||
|
||||
fn almostEmpty() {
|
||||
return;
|
||||
}
|
||||
|
||||
fn full() {
|
||||
fn notEmpty() {
|
||||
return 42;
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
#include <string.h>
|
||||
|
||||
int main(void) {
|
||||
//TODO: Test not yet implemented
|
||||
//URGENT: Test not yet implemented
|
||||
printf(TOY_CC_WARN "Test not yet implemented: %s\n" TOY_CC_RESET, __FILE__);
|
||||
return 0;
|
||||
}
|
||||
@@ -117,7 +117,7 @@ int test_functions_from_bytecodes(void) {
|
||||
}
|
||||
|
||||
int test_functions_from_callbacks(void) {
|
||||
//TODO: Test not yet implemented
|
||||
//URGENT: Test not yet implemented
|
||||
printf(TOY_CC_WARN "WIP test not yet implemented: %s\n" TOY_CC_RESET, __FILE__);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -607,8 +607,8 @@ int main(void) {
|
||||
total += res;
|
||||
}
|
||||
|
||||
//TODO: references
|
||||
//TODO: type coersions
|
||||
//TODO: references?
|
||||
//TODO: type coersions?
|
||||
//TODO: opaques?
|
||||
|
||||
return total;
|
||||
|
||||
Reference in New Issue
Block a user