Added assert() to base library

also fixed regression in call()
This commit is contained in:
CPunch 2020-12-27 13:36:17 -06:00
parent e7212b939d
commit 9012f9231b
5 changed files with 33 additions and 5 deletions

View File

@ -5,9 +5,15 @@
#include "cmem.h" #include "cmem.h"
void cosmoB_loadLibrary(CState *state) { void cosmoB_loadLibrary(CState *state) {
// print
cosmoV_pushString(state, "print"); cosmoV_pushString(state, "print");
cosmoV_pushCFunction(state, cosmoB_print); cosmoV_pushCFunction(state, cosmoB_print);
cosmoV_register(state, 1); // sets "print" global to cosmoB_print
// assert (for unit testing)
cosmoV_pushString(state, "assert");
cosmoV_pushCFunction(state, cosmoB_assert);
cosmoV_register(state, 2);
} }
int cosmoB_print(CState *state, int nargs, CValue *args) { int cosmoB_print(CState *state, int nargs, CValue *args) {
@ -20,6 +26,24 @@ int cosmoB_print(CState *state, int nargs, CValue *args) {
return 0; // print doesn't return any args return 0; // print doesn't return any args
} }
int cosmoB_assert(CState *state, int nargs, CValue *args) {
if (nargs != 1) {
cosmoV_error(state, "assert() expected 1 argument, got %d!", nargs);
return 0; // nothing pushed onto the stack to return
}
if (!IS_BOOLEAN(args[0])) {
cosmoV_error(state, "assert() expected <boolean>, got %s!", cosmoV_typeStr(args[0]));
return 0;
}
if (!cosmoV_readBoolean(args[0])) { // expression passed was false, error!
cosmoV_error(state, "assert() failed!");
} // else do nothing :)
return 0;
}
int cosmoB_dsetProto(CState *state, int nargs, CValue *args) { int cosmoB_dsetProto(CState *state, int nargs, CValue *args) {
if (nargs == 2) { if (nargs == 2) {
CObjObject *obj = cosmoV_readObject(args[0]); // object to set proto too CObjObject *obj = cosmoV_readObject(args[0]); // object to set proto too
@ -35,7 +59,7 @@ int cosmoB_dsetProto(CState *state, int nargs, CValue *args) {
int cosmoB_dgetProto(CState *state, int nargs, CValue *args) { int cosmoB_dgetProto(CState *state, int nargs, CValue *args) {
if (nargs != 1) { if (nargs != 1) {
cosmoV_error(state, "Expected 1 parameter, got %d!", nargs); cosmoV_error(state, "Expected 1 argument, got %d!", nargs);
} }
cosmoV_pushValue(state, cosmoV_newObj(cosmoV_readObject(args[0])->proto)); // just return the proto cosmoV_pushValue(state, cosmoV_newObj(cosmoV_readObject(args[0])->proto)); // just return the proto

View File

@ -7,6 +7,6 @@
COSMO_API void cosmoB_loadLibrary(CState *state); COSMO_API void cosmoB_loadLibrary(CState *state);
COSMO_API void cosmoB_loadDebug(CState *state); COSMO_API void cosmoB_loadDebug(CState *state);
COSMO_API int cosmoB_print(CState *state, int nargs, CValue *args); COSMO_API int cosmoB_print(CState *state, int nargs, CValue *args);
COSMO_API int cosmoB_foreach(CState *state, int nargs, CValue *args); COSMO_API int cosmoB_assert(CState *state, int nargs, CValue *args);
#endif #endif

View File

@ -64,7 +64,7 @@ typedef struct CObjFunction {
CChunk chunk; CChunk chunk;
int args; int args;
int upvals; int upvals;
int variadic; bool variadic;
CObjString *name; CObjString *name;
CObjString *module; // name of the "module" CObjString *module; // name of the "module"
} CObjFunction; } CObjFunction;

View File

@ -7,8 +7,12 @@
#include <stdbool.h> #include <stdbool.h>
#include <stdio.h> #include <stdio.h>
#include <assert.h>
//#define NAN_BOXXED //#define NAN_BOXXED
#define COSMOASSERT(x) assert(x)
// forward declare *most* stuff so our headers are cleaner // forward declare *most* stuff so our headers are cleaner
typedef struct CState CState; typedef struct CState CState;
typedef struct CChunk CChunk; typedef struct CChunk CChunk;

View File

@ -173,7 +173,7 @@ bool call(CState *state, CObjClosure *closure, int args, int nresults, int offse
state->top -= extraArgs; state->top -= extraArgs;
pushCallFrame(state, closure, func->args + 1); pushCallFrame(state, closure, func->args + 1);
} else if (args < func->args) { // too few args passed, obvious user error } else if (args != func->args) { // mismatched args
cosmoV_error(state, "Expected %d arguments for %s, got %d!", closure->function->args, closure->function->name == NULL ? UNNAMEDCHUNK : closure->function->name->str, args); cosmoV_error(state, "Expected %d arguments for %s, got %d!", closure->function->args, closure->function->name == NULL ? UNNAMEDCHUNK : closure->function->name->str, args);
return false; return false;
} else { } else {