🐛 fix compilation error in VS
This commit is contained in:
parent
cd21540710
commit
94f7c941f6
37
nasal_gc.h
37
nasal_gc.h
|
@ -72,6 +72,7 @@ struct nas_co; // coroutine
|
|||
struct nas_val; // nas_val includes gc-managed types
|
||||
|
||||
struct var {
|
||||
public:
|
||||
u8 type;
|
||||
union {
|
||||
u32 ret;
|
||||
|
@ -81,6 +82,14 @@ struct var {
|
|||
nas_val* gcobj;
|
||||
} val;
|
||||
|
||||
private:
|
||||
var(u8 t,u32 pc) {type=t;val.ret=pc;}
|
||||
var(u8 t,i64 ct) {type=t;val.cnt=ct;}
|
||||
var(u8 t,f64 n) {type=t;val.num=n;}
|
||||
var(u8 t,var* p) {type=t;val.addr=p;}
|
||||
var(u8 t,nas_val* p) {type=t;val.gcobj=p;}
|
||||
|
||||
public:
|
||||
var() = default;
|
||||
var(const var&) = default;
|
||||
bool operator==(const var& nr) const {return type==nr.type && val.gcobj==nr.val.gcobj;}
|
||||
|
@ -208,7 +217,6 @@ struct context {
|
|||
};
|
||||
|
||||
struct nas_co {
|
||||
|
||||
var stack[STACK_DEPTH];
|
||||
context ctx;
|
||||
coroutine_status status;
|
||||
|
@ -218,7 +226,6 @@ struct nas_co {
|
|||
};
|
||||
|
||||
struct nas_val {
|
||||
|
||||
gc_status mark;
|
||||
u8 type; // value type
|
||||
u8 unmut; // used to mark if a string is unmutable
|
||||
|
@ -444,35 +451,31 @@ bool var::objchk(obj_type objtype) {
|
|||
}
|
||||
|
||||
var var::none() {
|
||||
return {vm_none,{0}};
|
||||
return {vm_none,(u32)0};
|
||||
}
|
||||
|
||||
var var::nil() {
|
||||
return {vm_nil,{0}};
|
||||
return {vm_nil,(u32)0};
|
||||
}
|
||||
|
||||
var var::ret(u32 pc) {
|
||||
return {vm_ret,{.ret=pc}};
|
||||
return {vm_ret,pc};
|
||||
}
|
||||
|
||||
var var::cnt(i64 n) {
|
||||
return {vm_cnt,{.cnt=n}};
|
||||
return {vm_cnt,n};
|
||||
}
|
||||
|
||||
var var::num(f64 n) {
|
||||
return {vm_num,{.num=n}};
|
||||
return {vm_num,n};
|
||||
}
|
||||
|
||||
var var::gcobj(nas_val* p) {
|
||||
var tmp={p->type,{0}};
|
||||
tmp.val.gcobj=p;
|
||||
return tmp;
|
||||
return {p->type,p};
|
||||
}
|
||||
|
||||
var var::addr(var* p) {
|
||||
var tmp={vm_addr,{0}};
|
||||
tmp.val.addr=p;
|
||||
return tmp;
|
||||
return {vm_addr,p};
|
||||
}
|
||||
|
||||
var* var::addr () {return val.addr; }
|
||||
|
@ -722,11 +725,19 @@ void gc::info() {
|
|||
|
||||
usize ident=0;
|
||||
for(u8 i=0;i<gc_type_size;++i) {
|
||||
#ifndef _MSC_VER
|
||||
usize len=std::max({
|
||||
std::to_string(gcnt[i]).length(),
|
||||
std::to_string(acnt[i]).length(),
|
||||
std::to_string(size[i]).length()
|
||||
});
|
||||
#else // VS is a piece of shit
|
||||
usize len=std::to_string(gcnt[i]).length();
|
||||
ident=ident<len?len:ident;
|
||||
len=std::to_string(acnt[i]).length();
|
||||
ident=ident<len?len:ident;
|
||||
len=std::to_string(size[i]).length();
|
||||
#endif
|
||||
ident=ident<len?len:ident;
|
||||
}
|
||||
|
||||
|
|
48
test/bf.nas
48
test/bf.nas
|
@ -145,38 +145,28 @@ var mandelbrot=
|
|||
+[-[->>>>>>>>>+<<<<<<<<<]>>>>>>>>>]>>>>>->>>>>>>>>>>>>>>>>>>>>>>>>>>-<<<<<<[<<<<
|
||||
<<<<<]]>>>]";
|
||||
|
||||
var paper=[];
|
||||
var (ptr,pc)=(0,0);
|
||||
var (code,inum,stack,char)=([],[],[],[]);
|
||||
var (add,mov,jt,jf,in,out)=(0,1,2,3,4,5);
|
||||
setsize(char,256);
|
||||
var (ptr,pc,paper,inum)=(0,0,[],[]);
|
||||
|
||||
var color=[
|
||||
"\e[31m","\e[32m","\e[33m","\e[34m","\e[35m","\e[36m",
|
||||
"\e[90m","\e[91m","\e[92m","\e[93m","\e[94m","\e[95m","\e[96m"
|
||||
];
|
||||
|
||||
func() {
|
||||
var cnt=0;
|
||||
forindex(var i;char) {
|
||||
char[i]=color[cnt]~chr(i)~"\e[0m";
|
||||
cnt+=1;
|
||||
if(cnt>12)
|
||||
cnt=0;
|
||||
var character=func() {
|
||||
var res=[];
|
||||
setsize(res,256);
|
||||
forindex(var i;res) {
|
||||
res[i]="\e[38;5;"~i~"m"~chr(i)~"\e[0m";
|
||||
}
|
||||
return res;
|
||||
}();
|
||||
|
||||
var funcs=[
|
||||
var (add,mov,jt,jf,in,out)=(
|
||||
func {paper[ptr]+=inum[pc];},
|
||||
func {ptr+=inum[pc];},
|
||||
func {if(paper[ptr])pc=inum[pc];},
|
||||
func {if(!paper[ptr])pc=inum[pc];},
|
||||
func {paper[ptr]=input()[0];},
|
||||
func {print(char[paper[ptr]]);}
|
||||
];
|
||||
func {print(character[paper[ptr]]);}
|
||||
);
|
||||
|
||||
var bf=func(program) {
|
||||
setsize(paper,131072);
|
||||
var codegen=func(program) {
|
||||
var (code,stack)=([],[]);
|
||||
var len=size(program);
|
||||
for(var i=0;i<len;i+=1) {
|
||||
var c=chr(program[i]);
|
||||
|
@ -228,19 +218,27 @@ var bf=func(program) {
|
|||
}
|
||||
|
||||
if(size(stack)) {
|
||||
die("lack ]");
|
||||
die("lack "~size(stack)~" \"]\"");
|
||||
return;
|
||||
}
|
||||
|
||||
return code;
|
||||
}
|
||||
|
||||
var bf=func(program) {
|
||||
# enable ANSI escape sequence
|
||||
if(os.platform()=="windows") {
|
||||
system("color");
|
||||
}
|
||||
|
||||
# code generation
|
||||
var code=codegen(program);
|
||||
|
||||
# execute
|
||||
len=size(code);
|
||||
setsize(paper,131072);
|
||||
var len=size(code);
|
||||
for(pc=0;pc<len;pc+=1) {
|
||||
funcs[code[pc]]();
|
||||
code[pc]();
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -154,5 +154,5 @@ var ppm_gen=func(width,height){
|
|||
if (size(runtime.argv()) and runtime.argv()[0]=="--generate-ppm") {
|
||||
ppm_gen(1500*4,1500);
|
||||
} else {
|
||||
run(60,25);
|
||||
run(40,25);
|
||||
}
|
Loading…
Reference in New Issue