From ab458b4af46e786fa94f1377ada90edd8b58b57f Mon Sep 17 00:00:00 2001 From: blueloveTH Date: Wed, 3 Jan 2024 19:15:41 +0800 Subject: [PATCH] some cleanup --- include/pocketpy/compiler.h | 5 ++--- include/pocketpy/error.h | 13 ++++++------ include/pocketpy/vm.h | 2 +- src/collections.cpp | 1 + src/csv.cpp | 1 - src/error.cpp | 40 ++++++++++++++++++++----------------- src/pocketpy.cpp | 4 ++-- src/vm.cpp | 1 - 8 files changed, 35 insertions(+), 32 deletions(-) diff --git a/include/pocketpy/compiler.h b/include/pocketpy/compiler.h index b881fab1..5667d646 100644 --- a/include/pocketpy/compiler.h +++ b/include/pocketpy/compiler.h @@ -17,6 +17,8 @@ struct PrattRule{ }; class Compiler { + PK_ALWAYS_PASS_BY_POINTER(Compiler) + inline static PrattRule rules[kTokenCount]; std::unique_ptr lexer; stack contexts; @@ -134,9 +136,6 @@ class Compiler { public: Compiler(VM* vm, const Str& source, const Str& filename, CompileMode mode, bool unknown_global_scope=false); CodeObject_ compile(); - - Compiler(const Compiler&) = delete; - Compiler& operator=(const Compiler&) = delete; }; } // namespace pkpy \ No newline at end of file diff --git a/include/pocketpy/error.h b/include/pocketpy/error.h index d2465ae9..a56e4804 100644 --- a/include/pocketpy/error.h +++ b/include/pocketpy/error.h @@ -24,16 +24,17 @@ enum CompileMode { }; struct SourceData { - std::string source; // assume '\0' terminated + PK_ALWAYS_PASS_BY_POINTER(SourceData) + Str filename; - std::vector line_starts; CompileMode mode; - SourceData(const SourceData&) = delete; - SourceData& operator=(const SourceData&) = delete; - + std::string source; // assume '\0' terminated + std::vector line_starts; + SourceData(const Str& source, const Str& filename, CompileMode mode); - std::pair get_line(int lineno) const; + SourceData(const Str& filename, CompileMode mode); + std::pair _get_line(int lineno) const; Str snapshot(int lineno, const char* cursor, std::string_view name) const; }; diff --git a/include/pocketpy/vm.h b/include/pocketpy/vm.h index 480648b9..89a236b1 100644 --- a/include/pocketpy/vm.h +++ b/include/pocketpy/vm.h @@ -452,7 +452,7 @@ public: void _unpack_as_list(ArgsView args, List& list); void _unpack_as_dict(ArgsView args, Dict& dict); PyObject* vectorcall(int ARGC, int KWARGC=0, bool op_call=false); - CodeObject_ compile(Str source, Str filename, CompileMode mode, bool unknown_global_scope=false); + CodeObject_ compile(const Str& source, const Str& filename, CompileMode mode, bool unknown_global_scope=false); PyObject* py_negate(PyObject* obj); bool py_bool(PyObject* obj); i64 py_hash(PyObject* obj); diff --git a/src/collections.cpp b/src/collections.cpp index f77a7f3a..211eaecd 100644 --- a/src/collections.cpp +++ b/src/collections.cpp @@ -1,4 +1,5 @@ #include "pocketpy/collections.h" + namespace pkpy { struct PyDequeIter // Iterator for the deque type diff --git a/src/csv.cpp b/src/csv.cpp index c2542a3a..78a1bd4e 100644 --- a/src/csv.cpp +++ b/src/csv.cpp @@ -1,5 +1,4 @@ #include "pocketpy/csv.h" -#include "pocketpy/config.h" namespace pkpy{ diff --git a/src/error.cpp b/src/error.cpp index ebd11915..0bb5dc10 100644 --- a/src/error.cpp +++ b/src/error.cpp @@ -2,7 +2,7 @@ namespace pkpy{ - SourceData::SourceData(const Str& source, const Str& filename, CompileMode mode) { + SourceData::SourceData(const Str& source, const Str& filename, CompileMode mode): filename(filename), mode(mode) { int index = 0; // Skip utf8 BOM if there is any. if (strncmp(source.begin(), "\xEF\xBB\xBF", 3) == 0) index += 3; @@ -12,14 +12,16 @@ namespace pkpy{ if(source[index] != '\r') ss << source[index]; index++; } - - this->filename = filename; this->source = ss.str().str(); + line_starts.push_back(this->source.c_str()); - this->mode = mode; } - std::pair SourceData::get_line(int lineno) const { + SourceData::SourceData(const Str& filename, CompileMode mode): filename(filename), mode(mode) { + line_starts.push_back(this->source.c_str()); + } + + std::pair SourceData::_get_line(int lineno) const { if(lineno == -1) return {nullptr, nullptr}; lineno -= 1; if(lineno < 0) lineno = 0; @@ -34,19 +36,21 @@ namespace pkpy{ SStream ss; ss << " " << "File \"" << filename << "\", line " << lineno; if(!name.empty()) ss << ", in " << name; - ss << '\n'; - std::pair pair = get_line(lineno); - Str line = ""; - int removed_spaces = 0; - if(pair.first && pair.second){ - line = Str(pair.first, pair.second-pair.first).lstrip(); - removed_spaces = pair.second - pair.first - line.length(); - if(line.empty()) line = ""; - } - ss << " " << line; - if(cursor && line != "" && cursor >= pair.first && cursor <= pair.second){ - auto column = cursor - pair.first - removed_spaces; - if(column >= 0) ss << "\n " << std::string(column, ' ') << "^"; + if(!source.empty()){ + ss << '\n'; + std::pair pair = _get_line(lineno); + Str line = ""; + int removed_spaces = 0; + if(pair.first && pair.second){ + line = Str(pair.first, pair.second-pair.first).lstrip(); + removed_spaces = pair.second - pair.first - line.length(); + if(line.empty()) line = ""; + } + ss << " " << line; + if(cursor && line != "" && cursor >= pair.first && cursor <= pair.second){ + auto column = cursor - pair.first - removed_spaces; + if(column >= 0) ss << "\n " << std::string(column, ' ') << "^"; + } } return ss.str(); } diff --git a/src/pocketpy.cpp b/src/pocketpy.cpp index 47ebecc2..4bc25577 100644 --- a/src/pocketpy.cpp +++ b/src/pocketpy.cpp @@ -1720,8 +1720,8 @@ void VM::post_init(){ #endif } -CodeObject_ VM::compile(Str source, Str filename, CompileMode mode, bool unknown_global_scope) { - Compiler compiler(this, std::move(source), filename, mode, unknown_global_scope); +CodeObject_ VM::compile(const Str& source, const Str& filename, CompileMode mode, bool unknown_global_scope) { + Compiler compiler(this, source, filename, mode, unknown_global_scope); try{ return compiler.compile(); }catch(const Exception& e){ diff --git a/src/vm.cpp b/src/vm.cpp index 3087ac83..ae627094 100644 --- a/src/vm.cpp +++ b/src/vm.cpp @@ -1,5 +1,4 @@ #include "pocketpy/vm.h" -#include "pocketpy/error.h" namespace pkpy{