This commit is contained in:
blueloveTH 2023-01-29 06:43:39 +08:00
parent b7e45ac2d2
commit 968ac29652
3 changed files with 13 additions and 20 deletions

View File

@ -269,12 +269,6 @@ public:
return v; return v;
} }
PyVarList pop_n_values_reversed_unlimited(VM* vm, int n){
PyVarList v(n);
for(int i=n-1; i>=0; i--) v[i] = pop_value(vm);
return v;
}
pkpy::ArgList pop_n_reversed(int n){ pkpy::ArgList pop_n_reversed(int n){
pkpy::ArgList v(n); pkpy::ArgList v(n);
for(int i=n-1; i>=0; i--) v[i] = pop(); for(int i=n-1; i>=0; i--) v[i] = pop();

View File

@ -36,12 +36,12 @@ public:
typedef emhash8::HashMap<_Str, PyVar> PyVarDict; typedef emhash8::HashMap<_Str, PyVar> PyVarDict;
namespace pkpy { namespace pkpy {
const uint8_t MAX_POOLING_N = 10; const int MAX_POOLING_N = 10;
static thread_local std::vector<PyVar*>* _poolArgList = new std::vector<PyVar*>[MAX_POOLING_N]; static thread_local std::vector<PyVar*>* _poolArgList = new std::vector<PyVar*>[MAX_POOLING_N];
class ArgList { class ArgList {
PyVar* _args; PyVar* _args;
uint8_t _size; int _size;
void __tryAlloc(size_t n){ void __tryAlloc(size_t n){
if(n == 0){ if(n == 0){
@ -49,7 +49,6 @@ namespace pkpy {
this->_size = 0; this->_size = 0;
return; return;
} }
if(n > 255) UNREACHABLE();
if(n >= MAX_POOLING_N || _poolArgList[n].empty()){ if(n >= MAX_POOLING_N || _poolArgList[n].empty()){
this->_args = new PyVar[n]; this->_args = new PyVar[n];
this->_size = n; this->_size = n;
@ -65,7 +64,7 @@ namespace pkpy {
if(_size >= MAX_POOLING_N || _poolArgList[_size].size() > 32){ if(_size >= MAX_POOLING_N || _poolArgList[_size].size() > 32){
delete[] _args; delete[] _args;
}else{ }else{
for(uint8_t i = 0; i < _size; i++) _args[i].reset(); for(int i = 0; i < _size; i++) _args[i].reset();
_poolArgList[_size].push_back(_args); _poolArgList[_size].push_back(_args);
} }
} }
@ -77,7 +76,7 @@ namespace pkpy {
ArgList(const ArgList& other){ ArgList(const ArgList& other){
__tryAlloc(other._size); __tryAlloc(other._size);
for(uint8_t i=0; i<_size; i++) _args[i] = other._args[i]; for(int i=0; i<_size; i++) _args[i] = other._args[i];
} }
ArgList(ArgList&& other) noexcept { ArgList(ArgList&& other) noexcept {
@ -89,14 +88,14 @@ namespace pkpy {
ArgList(PyVarList&& other) noexcept { ArgList(PyVarList&& other) noexcept {
__tryAlloc(other.size()); __tryAlloc(other.size());
for(uint8_t i=0; i<_size; i++){ for(int i=0; i<_size; i++){
_args[i] = std::move(other[i]); _args[i] = std::move(other[i]);
} }
other.clear(); other.clear();
} }
PyVar& operator[](uint8_t i){ return _args[i]; } PyVar& operator[](int i){ return _args[i]; }
const PyVar& operator[](uint8_t i) const { return _args[i]; } const PyVar& operator[](int i) const { return _args[i]; }
ArgList& operator=(ArgList&& other) noexcept { ArgList& operator=(ArgList&& other) noexcept {
__tryRelease(); __tryRelease();
@ -107,18 +106,18 @@ namespace pkpy {
return *this; return *this;
} }
inline uint8_t size() const { return _size; } inline int size() const { return _size; }
PyVarList toList() const { PyVarList toList() const {
PyVarList ret(_size); PyVarList ret(_size);
for(uint8_t i=0; i<_size; i++) ret[i] = _args[i]; for(int i=0; i<_size; i++) ret[i] = _args[i];
return ret; return ret;
} }
void extend_self(const PyVar& self){ void extend_self(const PyVar& self){
static_assert(std::is_standard_layout_v<PyVar>); static_assert(std::is_standard_layout_v<PyVar>);
PyVar* old_args = _args; PyVar* old_args = _args;
uint8_t old_size = _size; int old_size = _size;
__tryAlloc(old_size+1); __tryAlloc(old_size+1);
_args[0] = self; _args[0] = self;
if(old_size == 0) return; if(old_size == 0) return;

View File

@ -198,12 +198,12 @@ protected:
case OP_BUILD_LIST: case OP_BUILD_LIST:
{ {
frame->push(PyList( frame->push(PyList(
frame->pop_n_values_reversed_unlimited(this, byte.arg) frame->pop_n_values_reversed(this, byte.arg).toList()
)); ));
} break; } break;
case OP_BUILD_MAP: case OP_BUILD_MAP:
{ {
PyVarList items = frame->pop_n_values_reversed_unlimited(this, byte.arg*2); pkpy::ArgList items = frame->pop_n_values_reversed(this, byte.arg*2);
PyVar obj = call(builtins->attribs["dict"]); PyVar obj = call(builtins->attribs["dict"]);
for(int i=0; i<items.size(); i+=2){ for(int i=0; i<items.size(); i+=2){
call(obj, __setitem__, pkpy::twoArgs(items[i], items[i+1])); call(obj, __setitem__, pkpy::twoArgs(items[i], items[i+1]));
@ -213,7 +213,7 @@ protected:
case OP_BUILD_SET: case OP_BUILD_SET:
{ {
PyVar list = PyList( PyVar list = PyList(
frame->pop_n_values_reversed_unlimited(this, byte.arg) frame->pop_n_values_reversed(this, byte.arg).toList()
); );
PyVar obj = call(builtins->attribs["set"], pkpy::oneArg(list)); PyVar obj = call(builtins->attribs["set"], pkpy::oneArg(list));
frame->push(obj); frame->push(obj);