record start_line & end_line

This commit is contained in:
blueloveTH 2024-02-07 17:07:55 +08:00
parent 933e19bd27
commit ac32dfdb2d
3 changed files with 8 additions and 1 deletions

View File

@ -72,6 +72,9 @@ struct CodeObject {
NameDictInt labels; NameDictInt labels;
std::vector<FuncDecl_> func_decls; std::vector<FuncDecl_> func_decls;
int start_line;
int end_line;
const CodeBlock& _get_block_codei(int codei) const{ const CodeBlock& _get_block_codei(int codei) const{
return blocks[iblocks[codei]]; return blocks[iblocks[codei]];
} }

View File

@ -3,7 +3,7 @@
namespace pkpy{ namespace pkpy{
CodeObject::CodeObject(std::shared_ptr<SourceData> src, const Str& name): CodeObject::CodeObject(std::shared_ptr<SourceData> src, const Str& name):
src(src), name(name) {} src(src), name(name), start_line(-1), end_line(-1) {}
void CodeObject::_gc_mark() const { void CodeObject::_gc_mark() const {
for(PyObject* v : consts) PK_OBJ_MARK(v); for(PyObject* v : consts) PK_OBJ_MARK(v);

View File

@ -10,6 +10,7 @@ namespace pkpy{
CodeObject_ Compiler::push_global_context(){ CodeObject_ Compiler::push_global_context(){
CodeObject_ co = std::make_shared<CodeObject>(lexer->src, lexer->src->filename); CodeObject_ co = std::make_shared<CodeObject>(lexer->src, lexer->src->filename);
co->start_line = prev().line;
contexts.push(CodeEmitContext(vm, co, contexts.size())); contexts.push(CodeEmitContext(vm, co, contexts.size()));
return co; return co;
} }
@ -17,6 +18,7 @@ namespace pkpy{
FuncDecl_ Compiler::push_f_context(Str name){ FuncDecl_ Compiler::push_f_context(Str name){
FuncDecl_ decl = std::make_shared<FuncDecl>(); FuncDecl_ decl = std::make_shared<FuncDecl>();
decl->code = std::make_shared<CodeObject>(lexer->src, name); decl->code = std::make_shared<CodeObject>(lexer->src, name);
decl->code->start_line = prev().line;
decl->nested = name_scope() == NAME_LOCAL; decl->nested = name_scope() == NAME_LOCAL;
contexts.push(CodeEmitContext(vm, decl->code, contexts.size())); contexts.push(CodeEmitContext(vm, decl->code, contexts.size()));
contexts.top().func = decl; contexts.top().func = decl;
@ -31,6 +33,8 @@ namespace pkpy{
// previously, we only do this if the last opcode is not a return // previously, we only do this if the last opcode is not a return
// however, this is buggy...since there may be a jump to the end (out of bound) even if the last opcode is a return // however, this is buggy...since there may be a jump to the end (out of bound) even if the last opcode is a return
ctx()->emit_(OP_RETURN_VALUE, 1, BC_KEEPLINE); ctx()->emit_(OP_RETURN_VALUE, 1, BC_KEEPLINE);
ctx()->co->end_line = prev().line;
// some check here // some check here
std::vector<Bytecode>& codes = ctx()->co->codes; std::vector<Bytecode>& codes = ctx()->co->codes;
if(ctx()->co->varnames.size() > PK_MAX_CO_VARNAMES){ if(ctx()->co->varnames.size() > PK_MAX_CO_VARNAMES){