From aa5b1d3d664c1c34191fef3dfe35dc9b5e9a27f0 Mon Sep 17 00:00:00 2001 From: ValKmjolnir Date: Sun, 11 Sep 2022 17:22:00 +0800 Subject: [PATCH] :rocket: import information output of dbg, vm and codegen --- nasal_ast.h | 132 +++++++++++++++++++++++++----------------------- nasal_builtin.h | 8 +-- nasal_codegen.h | 125 ++++++++++++++++++++++++--------------------- nasal_dbg.h | 12 +++-- nasal_err.h | 22 ++++---- nasal_gc.h | 4 +- nasal_vm.h | 45 +++++++---------- 7 files changed, 177 insertions(+), 171 deletions(-) diff --git a/nasal_ast.h b/nasal_ast.h index e533727..0ba7fc3 100644 --- a/nasal_ast.h +++ b/nasal_ast.h @@ -1,6 +1,9 @@ #ifndef __NASAL_AST_H__ #define __NASAL_AST_H__ +#include +#include + enum ast_node:u32 { ast_null=0, // null node @@ -128,14 +131,15 @@ const char* ast_name[]= class nasal_ast { private: - u32 _line; - u32 _column; - u32 _type; - f64 _num; - string _str; - std::vector _child; + u32 node_line; + u32 node_col; + u32 node_type; + f64 node_num; + string node_str; + std::vector node_child; public: - nasal_ast(const u32 l,const u32 c,const u32 t):_line(l),_column(c),_type(t),_num(0){} + nasal_ast(const u32 l,const u32 c,const u32 t): + node_line(l),node_col(c),node_type(t),node_num(0){} nasal_ast(const nasal_ast&); nasal_ast(nasal_ast&&); void tree(); @@ -144,74 +148,74 @@ public: nasal_ast& operator=(const nasal_ast&); nasal_ast& operator=(nasal_ast&&); - nasal_ast& operator[](usize n){return _child[n];} - const nasal_ast& operator[](usize n) const {return _child[n];} - usize size() const {return _child.size();} + nasal_ast& operator[](usize n){return node_child[n];} + const nasal_ast& operator[](usize n) const {return node_child[n];} + usize size() const {return node_child.size();} - void add(nasal_ast&& ast){_child.push_back(std::move(ast));} - void add(const nasal_ast& ast){_child.push_back(ast);} - void set_line(const u32 l){_line=l;} - void set_type(const u32 t){_type=t;} - void set_str(const string& s){_str=s;} - void set_num(const f64 n){_num=n;} + void add(nasal_ast&& ast){node_child.push_back(std::move(ast));} + void add(const nasal_ast& ast){node_child.push_back(ast);} + void set_line(const u32 l){node_line=l;} + void set_type(const u32 t){node_type=t;} + void set_str(const string& s){node_str=s;} + void set_num(const f64 n){node_num=n;} - inline u32 line() const {return _line;} - inline u32 col() const {return _column;} - inline u32 type() const {return _type;} - inline f64 num() const {return _num;} - inline const string& str() const {return _str;} - inline const std::vector& child() const {return _child;} - inline std::vector& child(){return _child;} + inline u32 line() const {return node_line;} + inline u32 col() const {return node_col;} + inline u32 type() const {return node_type;} + inline f64 num() const {return node_num;} + inline const string& str() const {return node_str;} + inline const std::vector& child() const {return node_child;} + inline std::vector& child(){return node_child;} }; nasal_ast::nasal_ast(const nasal_ast& tmp): - _str(tmp._str),_child(tmp._child) + node_str(tmp.node_str),node_child(tmp.node_child) { - _line=tmp._line; - _column=tmp._column; - _type=tmp._type; - _num =tmp._num; + node_line=tmp.node_line; + node_col=tmp.node_col; + node_type=tmp.node_type; + node_num =tmp.node_num; } nasal_ast::nasal_ast(nasal_ast&& tmp) { - _line=tmp._line; - _column=tmp._column; - _type=tmp._type; - _num =tmp._num; - _str.swap(tmp._str); - _child.swap(tmp._child); + node_line=tmp.node_line; + node_col=tmp.node_col; + node_type=tmp.node_type; + node_num =tmp.node_num; + node_str.swap(tmp.node_str); + node_child.swap(tmp.node_child); } nasal_ast& nasal_ast::operator=(const nasal_ast& tmp) { - _line=tmp._line; - _column=tmp._column; - _type=tmp._type; - _num=tmp._num; - _str=tmp._str; - _child=tmp._child; + node_line=tmp.node_line; + node_col=tmp.node_col; + node_type=tmp.node_type; + node_num=tmp.node_num; + node_str=tmp.node_str; + node_child=tmp.node_child; return *this; } nasal_ast& nasal_ast::operator=(nasal_ast&& tmp) { - _line=tmp._line; - _column=tmp._column; - _type=tmp._type; - _num=tmp._num; - _str.swap(tmp._str); - _child.swap(tmp._child); + node_line=tmp.node_line; + node_col=tmp.node_col; + node_type=tmp.node_type; + node_num=tmp.node_num; + node_str.swap(tmp.node_str); + node_child.swap(tmp.node_child); return *this; } void nasal_ast::clear() { - _line=_column=0; - _num=0; - _str=""; - _type=ast_null; - _child.clear(); + node_line=node_col=0; + node_num=0; + node_str.clear(); + node_type=ast_null; + node_child.clear(); } void nasal_ast::tree() @@ -224,14 +228,16 @@ void nasal_ast::print(u32 depth,bool last,std::vector& indent) { for(auto& i:indent) std::cout<& indent) #else indent.back()="│ "; #endif - for(u32 i=0;i<_child.size();++i) + for(u32 i=0;i>24)&0xff)<<" " - <>16)&0xff)<<" " - <>8)&0xff)<<" " - <>31);break; - case op_lnkeqc: - std::cout<>31);break; - case op_addc: case op_subc: case op_mulc: case op_divc: - case op_lessc: case op_leqc: case op_grtc: case op_geqc: - case op_pnum: - std::cout<";break; - case op_upval: case op_mupval: case op_loadu: - std::cout<>16)&0xffff) - <<"[0x"<<(num&0xffff)<<"]"<>24)&0xff)<<" " + <>16)&0xff)<<" " + <>8)&0xff)<<" " + <>31);break; + case op_lnkeqc: + out<>31);break; + case op_addc: case op_subc: case op_mulc: case op_divc: + case op_lessc: case op_leqc: case op_grtc: case op_geqc: + case op_pnum: + out<";break; + case op_upval: case op_mupval: case op_loadu: + out<>16)&0xffff) + <<"[0x"<<(num&0xffff)<<"]"<>3)==0?0:((line>>3)<<3); + u32 end=(1+(line>>3))<<3; src.load(files[bytecode[pc].fidx]); std::cout<<"\nsource code:\n"; - begin=(line>>3)==0?0:((line>>3)<<3); - end=(1+(line>>3))<<3; for(u32 i=begin;i ":" ")< ":" ")<>3)==0?0:((pc>>3)<<3); end=(1+(pc>>3))<<3; for(u32 i=begin;i ":" ",i); + std::cout + <<(i==pc?back_white:reset)<<(i==pc?"--> ":" ") + <\n"; std::exit(1); } string line; - while(!fin.eof()) + while(!in.eof()) { - std::getline(fin,line); + std::getline(in,line); res.push_back(line); } } - void clear() - { - std::vector tmp; - res.swap(tmp); - } const string& operator[](usize n){return res[n];} const string& name(){return file;} usize size(){return res.size();} diff --git a/nasal_gc.h b/nasal_gc.h index bd9b1e4..909ae6d 100644 --- a/nasal_gc.h +++ b/nasal_gc.h @@ -723,9 +723,7 @@ void nasal_gc::ctxreserve() // use to print error log and return error value nas_ref nas_err(const string& err_f,const string& info) { - std::cerr< #include - -#include "nasal_err.h" +#include "nasal_codegen.h" class nasal_vm { @@ -39,7 +38,6 @@ protected: /* debug functions */ bool detail_info; void valinfo(nas_ref&); - void bytecodeinfo(const char*,const u32); void traceback(); void stackinfo(const u32); void reginfo(); @@ -200,22 +198,17 @@ void nasal_vm::valinfo(nas_ref& val) } std::cout<<"\n"; } -void nasal_vm::bytecodeinfo(const char* header,const u32 p) -{ - const opcode& c=bytecode[p]; - c.print(header,num_table,str_table,p,true); - std::cout<<" ("< ret; - for(nas_ref* i=bottom;i<=main_ctx_top;++i) - if(i->type==vm_ret) + for(nas_ref* i=bottom;i<=ctx_top;++i) + if(i->type==vm_ret && i->ret()!=0) ret.push(i->ret()); ret.push(pc); // store the position program crashed - std::cout<<"trace back:\n"; + std::cout<<"trace back ("<<(gc.stack==stack?"main":"coroutine")<<")\n"; for(u32 p=0,same=0,prev=0xffffffff;!ret.empty();prev=p,ret.pop()) { if((p=ret.top())==prev) @@ -228,18 +221,18 @@ void nasal_vm::traceback() <<" 0x"<, limit "<, limit "<=bottom;++i,--t) { @@ -251,7 +244,7 @@ void nasal_vm::stackinfo(const u32 limit=10) } void nasal_vm::reginfo() { - std::cout<<"registers("<<(gc.cort?"coroutine":"main")<<")\n"<)\n"<)\n"<)\n"<)\n"<