diff --git a/src/__stl__.h b/src/__stl__.h index 321bc764..7bbec654 100644 --- a/src/__stl__.h +++ b/src/__stl__.h @@ -19,4 +19,10 @@ #include #include -#include \ No newline at end of file +#include + +#ifdef POCKETPY_H +#define UNREACHABLE() throw std::runtime_error( "L" + std::to_string(__LINE__) + " UNREACHABLE()! This should be a bug, please report it"); +#else +#define UNREACHABLE() throw std::runtime_error( __FILE__ + std::string(":") + std::to_string(__LINE__) + " UNREACHABLE()!"); +#endif \ No newline at end of file diff --git a/src/obj.h b/src/obj.h index a6aa4efd..c4e994fb 100644 --- a/src/obj.h +++ b/src/obj.h @@ -76,12 +76,6 @@ typedef std::variant<_Int,_Float,bool,_Str,PyVarList,_CppFunc,_Func,std::shared_ const int _SIZEOF_VALUE = sizeof(_Value); -#ifdef POCKETPY_H -#define UNREACHABLE() throw std::runtime_error( "L" + std::to_string(__LINE__) + " UNREACHABLE()! This should be a bug, please report it"); -#else -#define UNREACHABLE() throw std::runtime_error( __FILE__ + std::string(":") + std::to_string(__LINE__) + " UNREACHABLE()!"); -#endif - struct PyObject { PyVarDict attribs; _Value _native; diff --git a/src/safestl.h b/src/safestl.h index e965f2b5..a65c8a36 100644 --- a/src/safestl.h +++ b/src/safestl.h @@ -55,21 +55,22 @@ public: namespace pkpy { - const uint16_t MAX_POOLING_N = 16; + const uint8_t MAX_POOLING_N = 16; static std::deque* _poolArgList = new std::deque[MAX_POOLING_N]; class ArgList { PyVar* _args = nullptr; - uint16_t _size = 0; + uint8_t _size = 0; - inline void __checkIndex(uint16_t i) const { + inline void __checkIndex(uint8_t i) const { if (i >= _size){ auto msg = "pkpy:ArgList index out of range, " + std::to_string(i) + " not in [0, " + std::to_string(size()) + ")"; throw std::out_of_range(msg); } } - void __tryAlloc(uint16_t n){ + void __tryAlloc(uint8_t n){ + if(n > 255) UNREACHABLE(); if(n >= MAX_POOLING_N || _poolArgList[n].empty()){ this->_size = n; this->_args = new PyVar[n]; @@ -82,7 +83,7 @@ namespace pkpy { void __tryRelease(){ if(_size == 0 || _args == nullptr) return; - if(_size >= MAX_POOLING_N){ + if(_size >= MAX_POOLING_N || _poolArgList[_size].size() > 32){ delete[] _args; }else{ for(int i = 0; i < _size; i++) _args[i].reset(); @@ -124,12 +125,12 @@ namespace pkpy { for(auto& arg: args) this->_args[i++] = arg; } - PyVar& operator[](uint16_t i){ + PyVar& operator[](uint8_t i){ __checkIndex(i); return _args[i]; } - const PyVar& operator[](uint16_t i) const { + const PyVar& operator[](uint8_t i) const { __checkIndex(i); return _args[i]; } @@ -146,7 +147,7 @@ namespace pkpy { return *this; } - uint16_t size() const { + uint8_t size() const { return _size; }