banger commit
This commit is contained in:
@@ -2,6 +2,8 @@
|
|||||||
|
|
||||||
-- TODO: script the build
|
-- TODO: script the build
|
||||||
|
|
||||||
|
local isBlendi = os.getenv("USER") == "blendi"
|
||||||
|
|
||||||
local function filename(path)
|
local function filename(path)
|
||||||
local s,e = 1, #path
|
local s,e = 1, #path
|
||||||
for i = 1,#path do
|
for i = 1,#path do
|
||||||
@@ -29,14 +31,17 @@ local files = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
local objects = {}
|
local objects = {}
|
||||||
|
|
||||||
|
local coolArgs = {}
|
||||||
|
if not isBlendi then table.insert(coolArgs, '-fsanitize=undefined,address') end
|
||||||
|
|
||||||
for i = 1,#files do
|
for i = 1,#files do
|
||||||
local fname = files[i]
|
local fname = files[i]
|
||||||
local out = "build/" .. filename(fname) .. '.o'
|
local out = "build/" .. filename(fname) .. '.o'
|
||||||
|
|
||||||
runCommand('clang -c -o ' .. out .. ' ' .. fname)
|
runCommand('clang -c -o ' .. out .. ' ' .. fname .. ' ' .. table.concat(coolArgs, ' '))
|
||||||
|
|
||||||
objects[#objects+1] = out;
|
objects[#objects+1] = out;
|
||||||
end
|
end
|
||||||
|
|
||||||
runCommand('clang -o noom ' .. table.concat(objects, ' '))
|
runCommand('clang -o noom ' .. table.concat(objects, ' ') .. ' ' .. table.concat(coolArgs, ' '))
|
||||||
|
|||||||
36
src/noom.h
36
src/noom.h
@@ -1,5 +1,8 @@
|
|||||||
// #define NOOM_USE_NFT
|
// #define NOOM_USE_NFT
|
||||||
|
|
||||||
|
#ifndef NOOM_H
|
||||||
|
#define NOOM_H
|
||||||
|
|
||||||
typedef enum noom_LuaVersion {
|
typedef enum noom_LuaVersion {
|
||||||
// no 5.0, at least for now, cause it doesn't seem to be used much and is a bit *weird*
|
// no 5.0, at least for now, cause it doesn't seem to be used much and is a bit *weird*
|
||||||
NOOM_VERSION_51,
|
NOOM_VERSION_51,
|
||||||
@@ -9,4 +12,37 @@ typedef enum noom_LuaVersion {
|
|||||||
// no you don't get 5.5; if someone wants to do it and maintain it, they can, i'm not gonna.
|
// no you don't get 5.5; if someone wants to do it and maintain it, they can, i'm not gonna.
|
||||||
} noom_LuaVersion;
|
} noom_LuaVersion;
|
||||||
|
|
||||||
|
typedef enum noom_LuaType {
|
||||||
|
NOOM_LUA_TNIL,
|
||||||
|
NOOM_LUA_TBOOL,
|
||||||
|
NOOM_LUA_TNUM,
|
||||||
|
NOOM_LUA_TSTR,
|
||||||
|
NOOM_LUA_TTABLE,
|
||||||
|
NOOM_LUA_TFUNCTION,
|
||||||
|
NOOM_LUA_TTHREAD,
|
||||||
|
NOOM_LUA_TUSERDATA,
|
||||||
|
} noom_LuaType;
|
||||||
|
|
||||||
|
typedef enum noom_Exit {
|
||||||
|
NOOM_OK = 0,
|
||||||
|
NOOM_YIELD,
|
||||||
|
// out of memory
|
||||||
|
NOOM_ENOMEM,
|
||||||
|
// runtime error
|
||||||
|
NOOM_ERUNTIME,
|
||||||
|
// stack overflow
|
||||||
|
NOOM_ENOSTACK,
|
||||||
|
// I/O error
|
||||||
|
NOOM_EIO,
|
||||||
|
// buffer overflow
|
||||||
|
NOOM_ELIMIT,
|
||||||
|
// error in error handler
|
||||||
|
NOOM_EERROR,
|
||||||
|
} noom_Exit;
|
||||||
|
|
||||||
|
typedef struct noom_LuaVM noom_LuaVM;
|
||||||
|
|
||||||
|
typedef noom_Exit noom_CFunction(noom_LuaVM *vm);
|
||||||
|
typedef noom_Exit noom_KFunction(noom_LuaVM *vm, noom_Exit status, void *ctx);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|||||||
@@ -1,6 +1,11 @@
|
|||||||
|
#ifndef NOOM_TYPES
|
||||||
|
#define NOOM_TYPES
|
||||||
|
|
||||||
typedef unsigned long long int noom_uint_t;
|
typedef unsigned long long int noom_uint_t;
|
||||||
typedef signed long long int noom_int_t;
|
typedef signed long long int noom_int_t;
|
||||||
typedef double noom_float_t;
|
typedef double noom_float_t;
|
||||||
typedef unsigned char noom_bool_t;
|
typedef unsigned char noom_bool_t;
|
||||||
typedef void * noom_table_t; // atom figure this shit out
|
typedef void * noom_table_t; // atom figure this shit out
|
||||||
typedef char * noom_string_t;
|
typedef char * noom_string_t;
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|||||||
116
src/vm.h
Normal file
116
src/vm.h
Normal file
@@ -0,0 +1,116 @@
|
|||||||
|
#ifndef NOOM_VM
|
||||||
|
#define NOOM_VM
|
||||||
|
|
||||||
|
#include "types.h"
|
||||||
|
|
||||||
|
// Defines values, threads, bullshit, idc
|
||||||
|
|
||||||
|
typedef enum noomV_ObjTag {
|
||||||
|
NOOMV_OSTR,
|
||||||
|
NOOMV_OFUNC,
|
||||||
|
NOOMV_OCLOSURE,
|
||||||
|
NOOMV_OTABLE,
|
||||||
|
NOOMV_OUSERDATA,
|
||||||
|
NOOMV_OPOINTER,
|
||||||
|
} noomV_ObjTag;
|
||||||
|
|
||||||
|
typedef struct noomV_Object {
|
||||||
|
noomV_ObjTag tag;
|
||||||
|
bool marked;
|
||||||
|
struct noomV_Object *next;
|
||||||
|
struct noomV_Object *nextGray;
|
||||||
|
} noomV_Object;
|
||||||
|
|
||||||
|
typedef enum noomV_ValueTag {
|
||||||
|
NOOMV_VNIL,
|
||||||
|
NOOMV_VBOOL,
|
||||||
|
NOOMV_VINT,
|
||||||
|
NOOMV_VNUM,
|
||||||
|
NOOMV_VLUSER,
|
||||||
|
NOOMV_VCFUNC,
|
||||||
|
NOOMV_VOBJ,
|
||||||
|
} noomV_ValueTag;
|
||||||
|
|
||||||
|
typedef struct noomV_Value {
|
||||||
|
noomV_ValueTag tag;
|
||||||
|
union {
|
||||||
|
noom_bool_t boolean;
|
||||||
|
noom_int_t integer;
|
||||||
|
noom_float_t number;
|
||||||
|
noomV_Object *obj;
|
||||||
|
};
|
||||||
|
} noomV_Value;
|
||||||
|
|
||||||
|
typedef struct noomV_String {
|
||||||
|
noomV_Object obj;
|
||||||
|
noom_uint_t len;
|
||||||
|
// Includes NUL-terminator!
|
||||||
|
char data[];
|
||||||
|
} noomV_String;
|
||||||
|
|
||||||
|
typedef struct noomV_Table {
|
||||||
|
noomV_Object obj;
|
||||||
|
struct noomV_Table *meta;
|
||||||
|
noom_uint_t entries;
|
||||||
|
noomV_Value *entrydata;
|
||||||
|
} noomV_Table;
|
||||||
|
|
||||||
|
typedef struct noomV_Pointer {
|
||||||
|
noomV_Object obj;
|
||||||
|
noomV_Value value;
|
||||||
|
} noomV_Pointer;
|
||||||
|
|
||||||
|
typedef enum noomV_Opcode : unsigned char {
|
||||||
|
NOOMV_NOP,
|
||||||
|
// TODO: rest of ops
|
||||||
|
} noomV_Opcode;
|
||||||
|
|
||||||
|
typedef struct noomV_Inst {
|
||||||
|
noomV_Opcode op;
|
||||||
|
unsigned char A;
|
||||||
|
union {
|
||||||
|
struct {
|
||||||
|
unsigned char B;
|
||||||
|
unsigned char C;
|
||||||
|
};
|
||||||
|
short sD;
|
||||||
|
unsigned short uD;
|
||||||
|
};
|
||||||
|
} noomV_Inst;
|
||||||
|
|
||||||
|
typedef struct noomV_UpvalDesc {
|
||||||
|
char *name;
|
||||||
|
unsigned char idx;
|
||||||
|
noom_bool_t isStack;
|
||||||
|
} noomV_UpvalDesc;
|
||||||
|
|
||||||
|
typedef struct noomV_LocalDesc {
|
||||||
|
char *name;
|
||||||
|
unsigned char stackIdx;
|
||||||
|
// offset of first instruction where local exists
|
||||||
|
unsigned int pcStart;
|
||||||
|
// offset of first instruction where local is dropped
|
||||||
|
unsigned int pcEnd;
|
||||||
|
} noomV_LocalDesc;
|
||||||
|
|
||||||
|
typedef struct noomV_Function {
|
||||||
|
noomV_Object obj;
|
||||||
|
// source location string
|
||||||
|
noomV_String *chunkname;
|
||||||
|
noomV_Inst *code;
|
||||||
|
noomV_Value *consts;
|
||||||
|
noomV_Function **protos;
|
||||||
|
noomV_UpvalDesc *upvals;
|
||||||
|
noomV_LocalDesc *locals;
|
||||||
|
unsigned int codesize;
|
||||||
|
unsigned int linedefined;
|
||||||
|
unsigned int lastlinedefined;
|
||||||
|
unsigned char argc;
|
||||||
|
unsigned char flags;
|
||||||
|
unsigned char constsize;
|
||||||
|
unsigned char protosize;
|
||||||
|
unsigned char upvalsize;
|
||||||
|
unsigned char localsize;
|
||||||
|
} noomV_Function;
|
||||||
|
|
||||||
|
#endif
|
||||||
Reference in New Issue
Block a user