🐛 fix compilation error in VS

This commit is contained in:
ValKmjolnir 2023-04-12 19:44:13 +08:00
parent cd21540710
commit 94f7c941f6
3 changed files with 48 additions and 39 deletions

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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);
}