Compare commits

...

4 Commits

Author SHA1 Message Date
blueloveTH
e2dfad3fce fix docs 2025-04-13 14:29:33 +08:00
blueloveTH
c7dbb8bd7f fix memory leak of chunked_array2d 2025-04-13 14:27:19 +08:00
blueloveTH
efa60ec5cc Update config.h 2025-04-13 13:59:53 +08:00
blueloveTH
dacb1091db remove PK_LOW_MEMORY_MODE 2025-04-13 13:59:04 +08:00
9 changed files with 30 additions and 31 deletions

View File

@ -37,8 +37,6 @@ Please see https://pocketpy.dev for details and try the following resources.
pkpy should work on any platform with a C11 compiler.
These platforms are officially tested.
> C99 compilers may also work currently according to users' feedback.
+ Windows 64-bit
+ Linux 64-bit / 32-bit
+ macOS 64-bit

View File

@ -16,10 +16,11 @@ if [ $? -ne 0 ]; then
fi
SRC=$(find src/ -name "*.c")
SRC2=${1:-src2/main.c}
echo "> Compiling and linking source files... "
clang -std=c11 -O2 -Wfatal-errors -Iinclude -DNDEBUG -o main src2/main.c $SRC -lm -ldl
clang -std=c11 -O2 -Wfatal-errors -Iinclude -DNDEBUG -o main $SRC $SRC2 -lm -ldl
if [ $? -eq 0 ]; then
echo "Build completed. Type \"./main\" to enter REPL."

View File

@ -12,6 +12,8 @@ if [ "$(uname)" == "Darwin" ]; then
SANITIZE_FLAGS="-fsanitize=address,undefined"
fi
echo "Compiling C files..."
clang $FLAGS $SANITIZE_FLAGS $SRC src2/main.c -o main
SRC2=${1:-src2/main.c}
echo "Compiling C files..."
clang $FLAGS $SANITIZE_FLAGS $SRC $SRC2 -o main

View File

@ -34,8 +34,6 @@ print(primes)
pkpy should work on any platform with a C11 compiler.
These platforms are officially tested.
> C99 compilers may also work currently according to users' feedback.
+ Windows 64-bit
+ Linux 64-bit / 32-bit
+ macOS 64-bit

View File

@ -7,12 +7,6 @@
#define PK_VERSION_PATCH 8
/*************** feature settings ***************/
// Reduce the startup memory usage for embedded systems
#ifndef PK_LOW_MEMORY_MODE // can be overridden by cmake
#define PK_LOW_MEMORY_MODE 0
#endif
// Whether to compile os-related modules or not
#ifndef PK_ENABLE_OS // can be overridden by cmake
#define PK_ENABLE_OS 1
@ -20,11 +14,7 @@
// GC min threshold
#ifndef PK_GC_MIN_THRESHOLD // can be overridden by cmake
#if PK_LOW_MEMORY_MODE
#define PK_GC_MIN_THRESHOLD 2048
#else
#define PK_GC_MIN_THRESHOLD 32768
#endif
#define PK_GC_MIN_THRESHOLD 32768
#endif
// Memory allocation functions
@ -37,11 +27,7 @@
// This is the maximum size of the value stack in py_TValue units
// The actual size in bytes equals `sizeof(py_TValue) * PK_VM_STACK_SIZE`
#ifndef PK_VM_STACK_SIZE // can be overridden by cmake
#if PK_LOW_MEMORY_MODE
#define PK_VM_STACK_SIZE 2048
#else
#define PK_VM_STACK_SIZE 16384
#endif
#define PK_VM_STACK_SIZE 16384
#endif
// This is the maximum number of local variables in a function

View File

@ -4,7 +4,7 @@
typedef struct PyObject PyObject;
typedef struct VM VM;
extern VM* pk_current_vm;
extern _Thread_local VM* pk_current_vm;
typedef struct py_TValue {
py_Type type;

View File

@ -81,7 +81,7 @@ PyObject* ManagedHeap__gcnew(ManagedHeap* self, py_Type type, int slots, int uds
PyObject* obj;
// header + slots + udsize
int size = sizeof(PyObject) + PK_OBJ_SLOTS_SIZE(slots) + udsize;
if(!PK_LOW_MEMORY_MODE && size <= kPoolMaxBlockSize) {
if(size <= kPoolMaxBlockSize) {
obj = MultiPool__alloc(&self->small_objects, size);
assert(obj != NULL);
} else {

View File

@ -909,7 +909,10 @@ static py_TValue* c11_chunked_array2d__new_chunk(c11_chunked_array2d* self, c11_
if(!py_isnone(&self->context_builder)) {
py_newvec2i(&data[0], pos);
bool ok = py_call(&self->context_builder, 1, &data[0]);
if(!ok) return NULL;
if(!ok) {
PK_FREE(data);
return NULL;
}
data[0] = *py_retval();
} else {
data[0] = *py_None();
@ -1103,6 +1106,7 @@ static bool chunked_array2d__len__(int argc, py_Ref argv) {
static bool chunked_array2d_clear(int argc, py_Ref argv) {
PY_CHECK_ARGC(1);
c11_chunked_array2d* self = py_touserdata(argv);
c11__foreach(c11_chunked_array2d_chunks_KV, &self->chunks, p_kv) PK_FREE(p_kv->value);
c11_chunked_array2d_chunks__clear(&self->chunks);
self->last_visited.value = NULL;
py_newnone(py_retval());
@ -1166,9 +1170,16 @@ static bool chunked_array2d_remove_chunk(int argc, py_Ref argv) {
PY_CHECK_ARG_TYPE(1, tp_vec2i);
c11_chunked_array2d* self = py_touserdata(argv);
c11_vec2i pos = py_tovec2i(&argv[1]);
bool ok = c11_chunked_array2d_chunks__del(&self->chunks, pos);
self->last_visited.value = NULL;
py_newbool(py_retval(), ok);
py_TValue* data = c11_chunked_array2d_chunks__get(&self->chunks, pos, NULL);
if(data != NULL) {
PK_FREE(data);
bool ok = c11_chunked_array2d_chunks__del(&self->chunks, pos);
assert(ok);
self->last_visited.value = NULL;
py_newbool(py_retval(), ok);
} else {
py_newbool(py_retval(), false);
}
return true;
}

View File

@ -5,14 +5,15 @@
#include "pocketpy/common/utils.h"
#include "pocketpy/interpreter/vm.h"
VM* pk_current_vm;
_Thread_local VM* pk_current_vm;
static bool pk_initialized;
static VM pk_default_vm;
static VM* pk_all_vm[16];
static py_TValue _True, _False, _None, _NIL;
void py_initialize() {
if(pk_current_vm) {
if(pk_initialized) {
// c11__abort("py_initialize() can only be called once!");
return;
}
@ -35,6 +36,8 @@ void py_initialize() {
py_newnone(&_None);
py_newnil(&_NIL);
VM__ctor(&pk_default_vm);
pk_initialized = true;
}
py_GlobalRef py_True() { return &_True; }