From 94f7c941f68d402e84a458a1dc61a5b5a4dc9695 Mon Sep 17 00:00:00 2001 From: ValKmjolnir Date: Wed, 12 Apr 2023 19:44:13 +0800 Subject: [PATCH] :bug: fix compilation error in VS --- nasal_gc.h | 37 ++++++++++++++++++++++++------------- test/bf.nas | 48 +++++++++++++++++++++++------------------------- test/life.nas | 2 +- 3 files changed, 48 insertions(+), 39 deletions(-) diff --git a/nasal_gc.h b/nasal_gc.h index 601b4de..25d1a53 100644 --- a/nasal_gc.h +++ b/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>>>>>>>>+<<<<<<<<<]>>>>>>>>>]>>>>>->>>>>>>>>>>>>>>>>>>>>>>>>>>-<<<<<<[<<<< <<<<<]]>>>]"; -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