diff --git a/nasal.h b/nasal.h index 0c2ebfd..041fed3 100644 --- a/nasal.h +++ b/nasal.h @@ -132,7 +132,7 @@ f64 str2num(const char* str) return negative?-res:res; } -int utf8_hdchk(const char head) +i32 utf8_hdchk(const char head) { // RFC-2279 but now we use RFC-3629 so nbytes is less than 4 const u8 c=(u8)head; diff --git a/nasal_builtin.h b/nasal_builtin.h index 4810305..e0c5a55 100644 --- a/nasal_builtin.h +++ b/nasal_builtin.h @@ -356,7 +356,7 @@ nas_ref builtin_rand(nas_ref* local,nasal_gc& gc) return builtin_err("rand","\"seed\" must be nil or number"); if(val.type==vm_num) { - srand((unsigned int)val.num()); + srand((u32)val.num()); return nil; } f64 num=0; @@ -662,10 +662,9 @@ nas_ref builtin_left(nas_ref* local,nasal_gc& gc) return builtin_err("left","\"string\" must be string"); if(len.type!=vm_num) return builtin_err("left","\"length\" must be number"); - int length=(int)len.num(); - if(length<0) - length=0; - return gc.newstr(str.str().substr(0,length)); + if(len.num()<0) + return gc.newstr(""); + return gc.newstr(str.str().substr(0,len.num())); } nas_ref builtin_right(nas_ref* local,nasal_gc& gc) { @@ -675,13 +674,13 @@ nas_ref builtin_right(nas_ref* local,nasal_gc& gc) return builtin_err("right","\"string\" must be string"); if(len.type!=vm_num) return builtin_err("right","\"length\" must be number"); - int length=(int)len.num(); - int srclen=str.str().length(); + i32 length=(i32)len.num(); + i32 srclen=str.str().length(); if(length>srclen) length=srclen; if(length<0) length=0; - return gc.newstr(str.str().substr(srclen-length, srclen)); + return gc.newstr(str.str().substr(srclen-length,srclen)); } nas_ref builtin_cmp(nas_ref* local,nasal_gc& gc) { @@ -716,7 +715,7 @@ nas_ref builtin_chr(nas_ref* local,nasal_gc& gc) nas_ref code=local[1]; if(code.type!=vm_num) return builtin_err("chr","\"code\" must be number"); - int num=code.num(); + i32 num=code.num(); if(0<=num && num<128) return gc.newstr((char)num); else if(128<=num && num<256) @@ -974,7 +973,7 @@ nas_ref builtin_sleep(nas_ref* local,nasal_gc& gc) nas_ref builtin_pipe(nas_ref* local,nasal_gc& gc) { #ifndef _WIN32 - int fd[2]; + i32 fd[2]; nas_ref res=gc.alloc(vm_vec); if(pipe(fd)==-1) return builtin_err("pipe","failed to create pipe"); @@ -1001,8 +1000,8 @@ nas_ref builtin_waitpid(nas_ref* local,nasal_gc& gc) if(pid.type!=vm_num || nohang.type!=vm_num) return builtin_err("waitpid","pid and nohang must be number"); #ifndef _WIN32 - int ret_pid; - int status; + i32 ret_pid; + i32 status; ret_pid=waitpid(pid.num(),&status,nohang.num()==0?0:WNOHANG); nas_ref vec=gc.alloc(vm_vec); vec.vec().elems.push_back({vm_num,(f64)ret_pid}); diff --git a/nasal_codegen.h b/nasal_codegen.h index 49bf78d..d10fea4 100644 --- a/nasal_codegen.h +++ b/nasal_codegen.h @@ -1,7 +1,7 @@ #ifndef __NASAL_CODEGEN_H__ #define __NASAL_CODEGEN_H__ -enum op_code +enum op_code:u8 { op_exit, // stop the virtual machine op_intg, // global scope size @@ -82,7 +82,7 @@ enum op_code struct { - int type; + u8 type; const char* name; }code_table[]= { @@ -160,8 +160,7 @@ struct {op_mupval,"mupval"}, {op_mcallv,"mcallv"}, {op_mcallh,"mcallh"}, - {op_ret, "ret "}, - {-1, nullptr }, + {op_ret, "ret "} }; struct opcode @@ -253,12 +252,12 @@ private: std::vector num_res; std::vector str_res; std::vector code; - std::list> continue_ptr; - std::list> break_ptr; + std::list> continue_ptr; + std::list> break_ptr; // global : max 4095 values - std::unordered_map global; + std::unordered_map global; // local : max 32768 upvalues 65536 values - std::list> local; + std::list> local; // func end stack, reserved for code print std::stack fbstk; @@ -269,9 +268,9 @@ private: void regist_str(const string&); void find_symbol(const nasal_ast&); void add_sym(const string&); - int local_find(const string&); - int global_find(const string&); - int upvalue_find(const string&); + i32 local_find(const string&); + i32 global_find(const string&); + i32 upvalue_find(const string&); void gen(u8,u32,u32); void num_gen(const nasal_ast&); void str_gen(const nasal_ast&); @@ -293,7 +292,7 @@ private: void multi_assign_gen(const nasal_ast&); void conditional_gen(const nasal_ast&); void loop_gen(const nasal_ast&); - void load_continue_break(int,int); + void load_continue_break(i32,i32); void while_gen(const nasal_ast&); void for_gen(const nasal_ast&); void forindex_gen(const nasal_ast&); @@ -372,32 +371,32 @@ void nasal_codegen::add_sym(const string& name) { if(global.count(name)) return; - int index=global.size(); + i32 index=global.size(); global[name]=index; return; } if(local.back().count(name)) return; - int index=local.back().size(); + i32 index=local.back().size(); local.back()[name]=index; } -int nasal_codegen::local_find(const string& name) +i32 nasal_codegen::local_find(const string& name) { if(local.empty()) return -1; return local.back().count(name)?local.back()[name]:-1; } -int nasal_codegen::global_find(const string& name) +i32 nasal_codegen::global_find(const string& name) { return global.count(name)?global[name]:-1; } -int nasal_codegen::upvalue_find(const string& name) +i32 nasal_codegen::upvalue_find(const string& name) { // 32768 level 65536 upvalues - int index=-1; + i32 index=-1; usize size=local.size(); if(size<=1) return -1; @@ -530,7 +529,7 @@ void nasal_codegen::call_id(const nasal_ast& ast) die("builtin functions work in a local scope.",ast.line()); return; } - int index; + i32 index; if((index=local_find(str))>=0) { gen(op_calll,index,ast.line()); @@ -646,7 +645,7 @@ void nasal_codegen::mcall_id(const nasal_ast& ast) die("cannot change builtin function.",ast.line()); return; } - int index; + i32 index; if((index=local_find(str))>=0) { gen(op_mcalll,index,ast.line()); @@ -723,12 +722,12 @@ void nasal_codegen::def_gen(const nasal_ast& ast) void nasal_codegen::multi_assign_gen(const nasal_ast& ast) { - int size=ast[0].size(); + i32 size=ast[0].size(); if(ast[1].type()==ast_multi_scalar) { - for(int i=size-1;i>=0;--i) + for(i32 i=size-1;i>=0;--i) calc_gen(ast[1][i]); - for(int i=0;i jmp_label; + std::vector jmp_label; for(auto& tmp:ast.child()) { if(tmp.type()==ast_if || tmp.type()==ast_elsif) @@ -796,8 +795,8 @@ void nasal_codegen::conditional_gen(const nasal_ast& ast) void nasal_codegen::loop_gen(const nasal_ast& ast) { - continue_ptr.push_front(std::vector()); - break_ptr.push_front(std::vector()); + continue_ptr.push_front(std::vector()); + break_ptr.push_front(std::vector()); switch(ast.type()) { case ast_while: while_gen(ast); break; @@ -807,7 +806,7 @@ void nasal_codegen::loop_gen(const nasal_ast& ast) } } -void nasal_codegen::load_continue_break(int continue_place,int break_place) +void nasal_codegen::load_continue_break(i32 continue_place,i32 break_place) { for(auto i:continue_ptr.front()) code[i].num=continue_place; diff --git a/nasal_dbg.h b/nasal_dbg.h index e04f7d2..96f63a8 100644 --- a/nasal_dbg.h +++ b/nasal_dbg.h @@ -192,7 +192,7 @@ void nasal_dbg::interact() std::cout<<"cannot find file named `"<=size) + i32 size=elems.size(); + if(n<-size || n>=size) return {vm_none}; - return elems[index>=0?index:index+size]; + return elems[n>=0?n:n+size]; } -nas_ref* nas_vec::get_mem(const int index) +nas_ref* nas_vec::get_mem(const i32 n) { - int size=elems.size(); - if(index<-size || index>=size) + i32 size=elems.size(); + if(n<-size || n>=size) return nullptr; - return &elems[index>=0?index:index+size]; + return &elems[n>=0?n:n+size]; } void nas_vec::print() { diff --git a/nasal_parse.h b/nasal_parse.h index 1822fd7..ce48687 100644 --- a/nasal_parse.h +++ b/nasal_parse.h @@ -123,7 +123,7 @@ void nasal_parse::compile(const nasal_lexer& lexer) } void nasal_parse::die(u32 line,string info,bool report_prev=false) { - int col=(int)tokens[ptr].col-(tokens[ptr].type==tok_eof?0:(int)tokens[ptr].str.length()); + i32 col=(i32)tokens[ptr].col-(tokens[ptr].type==tok_eof?0:(i32)tokens[ptr].str.length()); if(tokens[ptr].type==tok_str) col-=2; // tok_str's str has no \" if(report_prev && ptr) // used to report lack of ',' ';' diff --git a/nasal_vm.h b/nasal_vm.h index 0e46537..e383d71 100644 --- a/nasal_vm.h +++ b/nasal_vm.h @@ -640,8 +640,8 @@ inline void nasal_vm::o_callv() else if(vec.type==vm_str) { string& str=vec.str(); - int num=val.tonum(); - int len=str.length(); + i32 num=val.tonum(); + i32 len=str.length(); if(num<-len || num>=len) die("callv: index out of range:"+std::to_string(val.tonum())); top[0]={vm_num,f64((u8)str[num>=0? num:num+len])}; @@ -802,9 +802,9 @@ inline void nasal_vm::o_slc2() std::vector& aim=top[0].vec().elems; u8 type1=val1.type,type2=val2.type; - int num1=val1.tonum(); - int num2=val2.tonum(); - int size=ref.size(); + i32 num1=val1.tonum(); + i32 num2=val2.tonum(); + i32 size=ref.size(); if(type1==vm_nil && type2==vm_nil) { num1=0; @@ -822,7 +822,7 @@ inline void nasal_vm::o_slc2() else if(num2<-size || num2>=size) die("slc2: end index out of range: "+std::to_string(num2)); else - for(int i=num1;i<=num2;++i) + for(i32 i=num1;i<=num2;++i) aim.push_back(i>=0?ref[i]:ref[i+size]); } inline void nasal_vm::o_mcallg()