mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-22 20:40:18 +00:00
improve performance
This commit is contained in:
parent
2fdf09f652
commit
160bc99d04
@ -9,7 +9,7 @@ typedef struct FixedMemoryPool {
|
|||||||
int exceeded_bytes;
|
int exceeded_bytes;
|
||||||
|
|
||||||
char** _free_list;
|
char** _free_list;
|
||||||
char** _free_list_end;
|
int _free_list_length;
|
||||||
} FixedMemoryPool;
|
} FixedMemoryPool;
|
||||||
|
|
||||||
void FixedMemoryPool__ctor(FixedMemoryPool* self, int BlockSize, int BlockCount);
|
void FixedMemoryPool__ctor(FixedMemoryPool* self, int BlockSize, int BlockCount);
|
||||||
|
@ -11,7 +11,7 @@ void FixedMemoryPool__ctor(FixedMemoryPool* self, int BlockSize, int BlockCount)
|
|||||||
self->data = PK_MALLOC(BlockSize * BlockCount);
|
self->data = PK_MALLOC(BlockSize * BlockCount);
|
||||||
self->data_end = self->data + BlockSize * BlockCount;
|
self->data_end = self->data + BlockSize * BlockCount;
|
||||||
self->_free_list = PK_MALLOC(sizeof(void*) * BlockCount);
|
self->_free_list = PK_MALLOC(sizeof(void*) * BlockCount);
|
||||||
self->_free_list_end = self->_free_list;
|
self->_free_list_length = BlockCount;
|
||||||
for(int i = 0; i < BlockCount; i++) {
|
for(int i = 0; i < BlockCount; i++) {
|
||||||
self->_free_list[i] = self->data + i * BlockSize;
|
self->_free_list[i] = self->data + i * BlockSize;
|
||||||
}
|
}
|
||||||
@ -23,9 +23,9 @@ void FixedMemoryPool__dtor(FixedMemoryPool* self) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void* FixedMemoryPool__alloc(FixedMemoryPool* self) {
|
void* FixedMemoryPool__alloc(FixedMemoryPool* self) {
|
||||||
if(self->_free_list_end != self->_free_list) {
|
if(self->_free_list_length > 0) {
|
||||||
self->_free_list_end--;
|
self->_free_list_length--;
|
||||||
return *self->_free_list_end;
|
return self->_free_list[self->_free_list_length];
|
||||||
} else {
|
} else {
|
||||||
self->exceeded_bytes += self->BlockSize;
|
self->exceeded_bytes += self->BlockSize;
|
||||||
return PK_MALLOC(self->BlockSize);
|
return PK_MALLOC(self->BlockSize);
|
||||||
@ -35,8 +35,8 @@ void* FixedMemoryPool__alloc(FixedMemoryPool* self) {
|
|||||||
void FixedMemoryPool__dealloc(FixedMemoryPool* self, void* p) {
|
void FixedMemoryPool__dealloc(FixedMemoryPool* self, void* p) {
|
||||||
bool is_valid = (char*)p >= self->data && (char*)p < self->data_end;
|
bool is_valid = (char*)p >= self->data && (char*)p < self->data_end;
|
||||||
if(is_valid) {
|
if(is_valid) {
|
||||||
*self->_free_list_end = p;
|
self->_free_list[self->_free_list_length] = p;
|
||||||
self->_free_list_end++;
|
self->_free_list_length++;
|
||||||
} else {
|
} else {
|
||||||
self->exceeded_bytes -= self->BlockSize;
|
self->exceeded_bytes -= self->BlockSize;
|
||||||
PK_FREE(p);
|
PK_FREE(p);
|
||||||
|
@ -199,13 +199,14 @@ FrameResult VM__run_top_frame(VM* self) {
|
|||||||
/*****************************************/
|
/*****************************************/
|
||||||
case OP_LOAD_FAST: {
|
case OP_LOAD_FAST: {
|
||||||
assert(!frame->is_locals_special);
|
assert(!frame->is_locals_special);
|
||||||
PUSH(&frame->locals[byte.arg]);
|
py_Ref val = &frame->locals[byte.arg];
|
||||||
if(py_isnil(TOP())) {
|
if(!py_isnil(val)) {
|
||||||
py_Name name = c11__getitem(uint16_t, &frame->co->varnames, byte.arg);
|
PUSH(val);
|
||||||
UnboundLocalError(name);
|
DISPATCH();
|
||||||
goto __ERROR;
|
|
||||||
}
|
}
|
||||||
DISPATCH();
|
py_Name name = c11__getitem(uint16_t, &frame->co->varnames, byte.arg);
|
||||||
|
UnboundLocalError(name);
|
||||||
|
goto __ERROR;
|
||||||
}
|
}
|
||||||
case OP_LOAD_NAME: {
|
case OP_LOAD_NAME: {
|
||||||
assert(frame->is_locals_special);
|
assert(frame->is_locals_special);
|
||||||
|
@ -447,7 +447,9 @@ static bool
|
|||||||
}
|
}
|
||||||
|
|
||||||
FrameResult VM__vectorcall(VM* self, uint16_t argc, uint16_t kwargc, bool opcall) {
|
FrameResult VM__vectorcall(VM* self, uint16_t argc, uint16_t kwargc, bool opcall) {
|
||||||
|
#ifndef NDEBUG
|
||||||
pk_print_stack(self, self->top_frame, (Bytecode){0});
|
pk_print_stack(self, self->top_frame, (Bytecode){0});
|
||||||
|
#endif
|
||||||
|
|
||||||
py_Ref p1 = self->stack.sp - kwargc * 2;
|
py_Ref p1 = self->stack.sp - kwargc * 2;
|
||||||
py_Ref p0 = p1 - argc - 2;
|
py_Ref p0 = p1 - argc - 2;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user