mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-21 12:00:18 +00:00
record start_line & end_line
This commit is contained in:
parent
933e19bd27
commit
ac32dfdb2d
@ -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]];
|
||||||
}
|
}
|
||||||
|
@ -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);
|
||||||
|
@ -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){
|
||||||
|
Loading…
x
Reference in New Issue
Block a user