mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-20 19:40:18 +00:00
up
This commit is contained in:
parent
b7e45ac2d2
commit
968ac29652
@ -269,12 +269,6 @@ public:
|
||||
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 v(n);
|
||||
for(int i=n-1; i>=0; i--) v[i] = pop();
|
||||
|
@ -36,12 +36,12 @@ public:
|
||||
typedef emhash8::HashMap<_Str, PyVar> PyVarDict;
|
||||
|
||||
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];
|
||||
|
||||
class ArgList {
|
||||
PyVar* _args;
|
||||
uint8_t _size;
|
||||
int _size;
|
||||
|
||||
void __tryAlloc(size_t n){
|
||||
if(n == 0){
|
||||
@ -49,7 +49,6 @@ namespace pkpy {
|
||||
this->_size = 0;
|
||||
return;
|
||||
}
|
||||
if(n > 255) UNREACHABLE();
|
||||
if(n >= MAX_POOLING_N || _poolArgList[n].empty()){
|
||||
this->_args = new PyVar[n];
|
||||
this->_size = n;
|
||||
@ -65,7 +64,7 @@ namespace pkpy {
|
||||
if(_size >= MAX_POOLING_N || _poolArgList[_size].size() > 32){
|
||||
delete[] _args;
|
||||
}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);
|
||||
}
|
||||
}
|
||||
@ -77,7 +76,7 @@ namespace pkpy {
|
||||
|
||||
ArgList(const ArgList& other){
|
||||
__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 {
|
||||
@ -89,14 +88,14 @@ namespace pkpy {
|
||||
|
||||
ArgList(PyVarList&& other) noexcept {
|
||||
__tryAlloc(other.size());
|
||||
for(uint8_t i=0; i<_size; i++){
|
||||
for(int i=0; i<_size; i++){
|
||||
_args[i] = std::move(other[i]);
|
||||
}
|
||||
other.clear();
|
||||
}
|
||||
|
||||
PyVar& operator[](uint8_t i){ return _args[i]; }
|
||||
const PyVar& operator[](uint8_t i) const { return _args[i]; }
|
||||
PyVar& operator[](int i){ return _args[i]; }
|
||||
const PyVar& operator[](int i) const { return _args[i]; }
|
||||
|
||||
ArgList& operator=(ArgList&& other) noexcept {
|
||||
__tryRelease();
|
||||
@ -107,18 +106,18 @@ namespace pkpy {
|
||||
return *this;
|
||||
}
|
||||
|
||||
inline uint8_t size() const { return _size; }
|
||||
inline int size() const { return _size; }
|
||||
|
||||
PyVarList toList() const {
|
||||
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;
|
||||
}
|
||||
|
||||
void extend_self(const PyVar& self){
|
||||
static_assert(std::is_standard_layout_v<PyVar>);
|
||||
PyVar* old_args = _args;
|
||||
uint8_t old_size = _size;
|
||||
int old_size = _size;
|
||||
__tryAlloc(old_size+1);
|
||||
_args[0] = self;
|
||||
if(old_size == 0) return;
|
||||
|
6
src/vm.h
6
src/vm.h
@ -198,12 +198,12 @@ protected:
|
||||
case OP_BUILD_LIST:
|
||||
{
|
||||
frame->push(PyList(
|
||||
frame->pop_n_values_reversed_unlimited(this, byte.arg)
|
||||
frame->pop_n_values_reversed(this, byte.arg).toList()
|
||||
));
|
||||
} break;
|
||||
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"]);
|
||||
for(int i=0; i<items.size(); i+=2){
|
||||
call(obj, __setitem__, pkpy::twoArgs(items[i], items[i+1]));
|
||||
@ -213,7 +213,7 @@ protected:
|
||||
case OP_BUILD_SET:
|
||||
{
|
||||
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));
|
||||
frame->push(obj);
|
||||
|
Loading…
x
Reference in New Issue
Block a user