Răsfoiți Sursa

record start_line & end_line

blueloveTH 2 ani în urmă
părinte
comite
ac32dfdb2d
3 a modificat fișierele cu 8 adăugiri și 1 ștergeri
  1. 3 0
      include/pocketpy/codeobject.h
  2. 1 1
      src/codeobject.cpp
  3. 4 0
      src/compiler.cpp

+ 3 - 0
include/pocketpy/codeobject.h

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

+ 1 - 1
src/codeobject.cpp

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

+ 4 - 0
src/compiler.cpp

@@ -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){