This commit is contained in:
blueloveTH 2024-06-02 21:33:03 +08:00
parent 62df3c9b5d
commit b4a836873e
10 changed files with 78 additions and 19 deletions

View File

@ -2,6 +2,6 @@ python prebuild.py
SRC=$(find src/ -name "*.cpp") SRC=$(find src/ -name "*.cpp")
FLAGS="-std=c++17 -Og -stdlib=libc++ -Iinclude -frtti -Wfatal-errors -g" FLAGS="-std=c++17 -Og -stdlib=libc++ -Iinclude -frtti -Wfatal-errors -g -DDEBUG"
clang++ $FLAGS -o main src2/main.cpp $SRC clang++ $FLAGS -o main src2/main.cpp $SRC

View File

@ -31,10 +31,6 @@
#define PK_ENABLE_STD_FUNCTION 0 #define PK_ENABLE_STD_FUNCTION 0
/*************** debug settings ***************/ /*************** debug settings ***************/
// Enable this may help you find bugs
#define PK_DEBUG_EXTRA_CHECK 0
// Do not edit the following settings unless you know what you are doing // Do not edit the following settings unless you know what you are doing
#define PK_DEBUG_CEVAL_STEP 0 #define PK_DEBUG_CEVAL_STEP 0
#define PK_DEBUG_MEMORY_POOL 0 #define PK_DEBUG_MEMORY_POOL 0

View File

@ -1,6 +1,9 @@
#pragma once #pragma once
#include "pocketpy/common/gil.hpp"
#include <cstddef> #include <cstddef>
#include <cassert>
#include <string> #include <string>
namespace pkpy{ namespace pkpy{
@ -13,4 +16,12 @@ void pools_shrink_to_fit() noexcept;
std::string pool64_info() noexcept; std::string pool64_info() noexcept;
std::string pool128_info() noexcept; std::string pool128_info() noexcept;
inline const int kPoolExprBlockSize = 128;
inline const int kPoolFrameBlockSize = 80;
void* PoolExpr_alloc() noexcept;
void PoolExpr_dealloc(void*) noexcept;
void* PoolFrame_alloc() noexcept;
void PoolFrame_dealloc(void*) noexcept;
}; // namespace pkpy }; // namespace pkpy

View File

@ -94,7 +94,7 @@ while(!_items[i].first.empty()) { \
return _items[i].second; return _items[i].second;
} }
T* try_get_2(StrName key) { T* try_get_2(StrName key) const{
bool ok; uint16_t i; bool ok; uint16_t i;
HASH_PROBE_0(key, ok, i); HASH_PROBE_0(key, ok, i);
if(!ok) return nullptr; if(!ok) return nullptr;
@ -109,7 +109,7 @@ while(!_items[i].first.empty()) { \
return try_get(key); return try_get(key);
} }
T* try_get_2_likely_found(StrName key) { T* try_get_2_likely_found(StrName key) const{
uint16_t i = key.index & _mask; uint16_t i = key.index & _mask;
if(_items[i].first == key) return &_items[i].second; if(_items[i].first == key) return &_items[i].second;
i = (i + 1) & _mask; i = (i + 1) & _mask;
@ -152,13 +152,11 @@ while(!_items[i].first.empty()) { \
} }
T operator[](StrName key) const { T operator[](StrName key) const {
T val = try_get_likely_found(key); T* val = try_get_2_likely_found(key);
#if PK_DEBUG_EXTRA_CHECK if(val == nullptr){
if(val == default_invalid_value<T>()){
throw std::runtime_error(_S("NameDict key not found: ", key.escape()).str()); throw std::runtime_error(_S("NameDict key not found: ", key.escape()).str());
} }
#endif return *val;
return val;
} }
array<StrName> keys() const { array<StrName> keys() const {

View File

@ -59,7 +59,8 @@ class Compiler {
template <typename T, typename... Args> template <typename T, typename... Args>
unique_ptr_128<T> make_expr(Args&&... args) { unique_ptr_128<T> make_expr(Args&&... args) {
void* p = pool128_alloc(sizeof(T)); static_assert(sizeof(T) <= kPoolExprBlockSize);
void* p = PoolExpr_alloc();
unique_ptr_128<T> expr(new (p) T(std::forward<Args>(args)...)); unique_ptr_128<T> expr(new (p) T(std::forward<Args>(args)...));
expr->line = prev().line; expr->line = prev().line;
return expr; return expr;

View File

@ -8,7 +8,7 @@ namespace pkpy{
struct CodeEmitContext; struct CodeEmitContext;
struct Expr; struct Expr;
#define PK_POOL128_DELETE(ptr) if(ptr != nullptr) { ptr->~T(); pool128_dealloc(ptr); ptr = nullptr; } #define PK_POOL128_DELETE(ptr) if(ptr != nullptr) { ptr->~T(); PoolExpr_dealloc(ptr); ptr = nullptr; }
template<typename T> template<typename T>
class unique_ptr_128{ class unique_ptr_128{

View File

@ -147,7 +147,8 @@ struct CallStack{
template<typename... Args> template<typename... Args>
void emplace(Args&&... args){ void emplace(Args&&... args){
_tail = new(pool128_alloc(sizeof(LinkedFrame))) LinkedFrame(_tail, std::forward<Args>(args)...); static_assert(sizeof(LinkedFrame) <= kPoolFrameBlockSize);
_tail = new(PoolFrame_alloc()) LinkedFrame(_tail, std::forward<Args>(args)...);
++_size; ++_size;
} }

View File

@ -61,7 +61,7 @@ struct Generator{
~Generator(){ ~Generator(){
if(lf){ if(lf){
lf->~LinkedFrame(); lf->~LinkedFrame();
pool128_dealloc(lf); PoolFrame_dealloc(lf);
} }
} }
}; };

View File

@ -1,5 +1,4 @@
#include "pocketpy/common/memorypool.hpp" #include "pocketpy/common/memorypool.hpp"
#include "pocketpy/common/gil.hpp"
#include "pocketpy/common/config.h" #include "pocketpy/common/config.h"
#include <cstdlib> #include <cstdlib>
@ -273,4 +272,57 @@ void pools_shrink_to_fit() noexcept {
std::string pool64_info() noexcept { return "unavailable"; } std::string pool64_info() noexcept { return "unavailable"; }
std::string pool128_info() noexcept { return pool128.info(); } std::string pool128_info() noexcept { return pool128.info(); }
template<int BlockSize, int BlockCount>
struct FixedMemoryPool{
struct Block{
char data[BlockSize];
};
static_assert(BlockSize % 4 == 0);
static_assert(sizeof(Block) == BlockSize);
Block _blocks[BlockCount];
Block* _free_list[BlockCount];
Block** _free_list_end;
FixedMemoryPool() {
_free_list_end = _free_list + BlockCount;
for(int i = 0; i < BlockCount; ++i){
_free_list[i] = _blocks + i;
} }
}
bool is_valid(void* p){
return p >= _blocks && p < _blocks + BlockCount;
}
void* alloc(){
PK_GLOBAL_SCOPE_LOCK()
if(_free_list_end != _free_list){
--_free_list_end;
return *_free_list_end;
}else{
return std::malloc(BlockSize);
}
}
void dealloc(void* p){
PK_GLOBAL_SCOPE_LOCK()
if(is_valid(p)){
*_free_list_end = static_cast<Block*>(p);
++_free_list_end;
}else{
std::free(p);
}
}
};
static FixedMemoryPool<kPoolExprBlockSize, 32> PoolExpr;
static FixedMemoryPool<kPoolFrameBlockSize, 64> PoolFrame;
void* PoolExpr_alloc() noexcept { return PoolExpr.alloc(); }
void PoolExpr_dealloc(void* p) noexcept { PoolExpr.dealloc(p); }
void* PoolFrame_alloc() noexcept { return PoolFrame.alloc(); }
void PoolFrame_dealloc(void* p) noexcept { PoolFrame.dealloc(p); }
} // namespace pkpy

View File

@ -107,7 +107,7 @@ namespace pkpy{
LinkedFrame* p = _tail; LinkedFrame* p = _tail;
_tail = p->f_back; _tail = p->f_back;
p->~LinkedFrame(); p->~LinkedFrame();
pool128_dealloc(p); PoolFrame_dealloc(p);
--_size; --_size;
} }