From 35cb1fba24b83579a0aa5f093be3157387df8526 Mon Sep 17 00:00:00 2001 From: blueloveTH Date: Thu, 6 Jun 2024 23:30:12 +0800 Subject: [PATCH] some fix --- include/pocketpy/common/vector.hpp | 8 +------- include/pocketpy/interpreter/profiler.hpp | 3 ++- src/interpreter/profiler.cpp | 23 ++++++++++++++--------- src2/main.cpp | 3 +-- 4 files changed, 18 insertions(+), 19 deletions(-) diff --git a/include/pocketpy/common/vector.hpp b/include/pocketpy/common/vector.hpp index b57c7564..878c8b74 100644 --- a/include/pocketpy/common/vector.hpp +++ b/include/pocketpy/common/vector.hpp @@ -196,12 +196,6 @@ struct vector { _capacity = cap; } - void resize(int size) { - reserve(size); - std::uninitialized_default_construct_n(_data + _size, size - _size); - _size = size; - } - template void emplace_back(Args&&... args) { if(_size == _capacity) reserve(_capacity * 2); @@ -432,7 +426,7 @@ struct small_map { Item* data() const { return _data.data(); } void insert(const K& key, const V& value) { - auto it = std::lower_bound(_data.begin(), _data.end(), key); + Item* it = std::lower_bound(_data.begin(), _data.end(), key); assert(it == _data.end() || it->first != key); _data.insert(it, {key, value}); } diff --git a/include/pocketpy/interpreter/profiler.hpp b/include/pocketpy/interpreter/profiler.hpp index 2b97c569..03f110b3 100644 --- a/include/pocketpy/interpreter/profiler.hpp +++ b/include/pocketpy/interpreter/profiler.hpp @@ -25,7 +25,7 @@ struct _FrameRecord { struct LineProfiler { // filename -> records - small_map> records; + small_map records; vector<_FrameRecord> frames; vector functions; @@ -34,6 +34,7 @@ struct LineProfiler { void _step_end(int, Frame*, int); void end(); Str stats(); + ~LineProfiler(); }; } // namespace pkpy diff --git a/src/interpreter/profiler.cpp b/src/interpreter/profiler.cpp index 42cacab3..1aa037e3 100644 --- a/src/interpreter/profiler.cpp +++ b/src/interpreter/profiler.cpp @@ -28,14 +28,16 @@ void LineProfiler::_step(int callstack_size, Frame* frame) { _step_end(callstack_size, frame, line); } - auto& file_records = *records.try_get(filename); - if(file_records.empty()) { - // initialize file_records + _LineRecord* file_records; + + auto p = records.try_get(filename); + if(p == nullptr) { int total_lines = frame->co->src->line_starts.size(); - file_records.resize(total_lines + 1); - for(int i = 1; i <= total_lines; i++) { - file_records[i].line = i; - } + file_records = new _LineRecord[total_lines + 1]; + for(int i = 1; i <= total_lines; i++) file_records[i].line = i; + records.insert(filename, file_records); + }else{ + file_records = *p; } frames.back().prev_record = &file_records[line]; @@ -85,8 +87,7 @@ Str LineProfiler::stats() { int end_line = decl->code->end_line; if(start_line == -1 || end_line == -1) continue; std::string_view filename = decl->code->src->filename.sv(); - vector<_LineRecord>& file_records = *records.try_get(filename); - if(file_records.empty()) continue; + const _LineRecord* file_records = records[filename]; clock_t total_time = 0; for(int line = start_line; line <= end_line; line++) { total_time += file_records[line].time; @@ -120,4 +121,8 @@ Str LineProfiler::stats() { return ss.str(); } +LineProfiler::~LineProfiler() { + for(auto& p: records) delete p.second; +} + } // namespace pkpy diff --git a/src2/main.cpp b/src2/main.cpp index 70c6ed4c..e38ce954 100644 --- a/src2/main.cpp +++ b/src2/main.cpp @@ -25,8 +25,7 @@ std::string pkpy_platform_getline(bool* eof) { } std::wstring wideInput = wss.str(); int length = WideCharToMultiByte(CP_UTF8, 0, wideInput.c_str(), (int)wideInput.length(), NULL, 0, NULL, NULL); - std::string output; - output.resize(length); + std::string output(length); WideCharToMultiByte(CP_UTF8, 0, wideInput.c_str(), (int)wideInput.length(), &output[0], length, NULL, NULL); if(!output.empty() && output.back() == '\r') output.pop_back(); return output;