mirror of
https://github.com/pocketpy/pocketpy
synced 2025-10-21 20:10:17 +00:00
Merge remote-tracking branch 'upstream/main' into bufan's_test
This commit is contained in:
commit
963862c68e
@ -18,9 +18,9 @@ if(NOT ${PREBUILD_RESULT} EQUAL 0)
|
||||
endif()
|
||||
|
||||
if(MSVC)
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /GR- /EHsc /utf-8 /O2")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /EHsc /utf-8 /O2")
|
||||
else()
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fno-rtti -fexceptions -O2")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fexceptions -O2")
|
||||
endif()
|
||||
|
||||
include_directories(${CMAKE_CURRENT_LIST_DIR}/include)
|
||||
|
@ -40,7 +40,6 @@ To compile it with your project, these flags must be set:
|
||||
|
||||
+ `--std=c++17` flag must be set
|
||||
+ Exception must be enabled
|
||||
+ RTTI is not required
|
||||
|
||||
### Example
|
||||
|
||||
|
6
build.sh
6
build.sh
@ -1,14 +1,16 @@
|
||||
python3 prebuild.py
|
||||
SRC=$(find src/ -name "*.cpp")
|
||||
FLAGS="-std=c++17 -fno-rtti -O2 -stdlib=libc++ -Wfatal-errors -Iinclude"
|
||||
FLAGS="-std=c++17 -O2 -stdlib=libc++ -Wfatal-errors -Iinclude"
|
||||
|
||||
if [[ "$OSTYPE" == "darwin"* ]]; then
|
||||
LIB_EXTENSION=".dylib"
|
||||
FLAGS="$FLAGS -undefined dynamic_lookup"
|
||||
LINK_FLAGS=""
|
||||
else
|
||||
LIB_EXTENSION=".so"
|
||||
LINK_FLAGS="-Wl,-rpath=."
|
||||
fi
|
||||
clang++ $FLAGS -o libpocketpy$LIB_EXTENSION $SRC -fPIC -shared -ldl
|
||||
|
||||
# compile main.cpp and link to libpocketpy.so
|
||||
clang++ $FLAGS -o main src2/main.cpp -L. -lpocketpy -Wl,-rpath=.
|
||||
clang++ $FLAGS -o main src2/main.cpp -L. -lpocketpy $LINK_FLAGS
|
@ -4,4 +4,4 @@ rm -rf web/lib
|
||||
mkdir web/lib
|
||||
|
||||
SRC=$(find src/ -name "*.cpp")
|
||||
em++ $SRC -Iinclude/ -fno-rtti -fexceptions -O3 -sEXPORTED_FUNCTIONS=_pkpy_new_repl,_pkpy_repl_input,_pkpy_new_vm -sEXPORTED_RUNTIME_METHODS=ccall -o web/lib/pocketpy.js
|
||||
em++ $SRC -Iinclude/ -fexceptions -O3 -sEXPORTED_FUNCTIONS=_pkpy_new_repl,_pkpy_repl_input,_pkpy_new_vm -sEXPORTED_RUNTIME_METHODS=ccall -o web/lib/pocketpy.js
|
@ -413,11 +413,11 @@ int main(int argc, char** argv) {
|
||||
|
||||
PRINT_TITLE("test py_repr");
|
||||
check(pkpy_eval(vm, "['1', 2, (3, '4')]"));
|
||||
check(pkpy_py_repr(vm, -1));
|
||||
check(pkpy_py_repr(vm));
|
||||
check(pkpy_to_string(vm, -1, &r_string));
|
||||
for(int i = 0; i < r_string.size; i++) putchar(r_string.data[i]);
|
||||
putchar('\n');
|
||||
check(pkpy_pop(vm, 2));
|
||||
check(pkpy_pop_top(vm));
|
||||
check(pkpy_stack_size(vm) == 0);
|
||||
return 0;
|
||||
}
|
||||
|
@ -6,6 +6,10 @@ order: 8
|
||||
|
||||
### Basic manipulation
|
||||
|
||||
+ `bool pkpy_dup(pkpy_vm*, int)`
|
||||
|
||||
Duplicate the value at the given index.
|
||||
|
||||
+ `bool pkpy_pop(pkpy_vm*, int)`
|
||||
|
||||
Pop `n` values from the stack.
|
||||
@ -70,7 +74,7 @@ PK_EXPORT bool pkpy_is_none(pkpy_vm*, int i);
|
||||
|
||||
+ `pkpy_push_null(pkpy_vm*)`
|
||||
|
||||
Push a `PY_NULL` onto the stack.
|
||||
Push a `PY_NULL` onto the stack. It is used for `pkpy_vectorcall`.
|
||||
|
||||
+ `pkpy_push_function(pkpy_vm*, const char* sig, pkpy_CFunction f)`
|
||||
|
||||
@ -140,10 +144,10 @@ PK_EXPORT bool pkpy_is_none(pkpy_vm*, int i);
|
||||
```
|
||||
[obj] -> [obj.<name> self]
|
||||
```
|
||||
+ `bool pkpy_py_repr(pkpy_vm*, int i)`
|
||||
+ `bool pkpy_py_repr(pkpy_vm*)`
|
||||
|
||||
Get the repr of the value at the given index and push it onto the stack.
|
||||
Get the repr of the value at the top of the stack.
|
||||
|
||||
```
|
||||
[..., value, ...] -> [..., value, ..., repr(value)]
|
||||
[value] -> [repr(value)]
|
||||
```
|
@ -22,7 +22,6 @@ To compile it with your project, these flags must be set:
|
||||
|
||||
+ `--std=c++17` flag must be set
|
||||
+ Exception must be enabled
|
||||
+ RTTI is not required
|
||||
|
||||
### Example
|
||||
|
||||
|
@ -61,11 +61,12 @@ struct Bytes{
|
||||
return _data != rhs._data;
|
||||
}
|
||||
|
||||
std::string str() const noexcept { return std::string(_data.begin(), _data.end()); }
|
||||
Str str() const noexcept { return Str(_data.data(), _data.size()); }
|
||||
|
||||
Bytes() : _data(), _ok(false) {}
|
||||
Bytes(std::vector<char>&& data) : _data(std::move(data)), _ok(true) {}
|
||||
Bytes(const std::string& data) : _data(data.begin(), data.end()), _ok(true) {}
|
||||
Bytes(const Str& data) : _data(data.begin(), data.end()), _ok(true) {}
|
||||
Bytes(std::string_view sv): _data(sv.begin(), sv.end()), _ok(true) {}
|
||||
operator bool() const noexcept { return _ok; }
|
||||
};
|
||||
|
||||
|
@ -27,6 +27,7 @@ PK_EXPORT bool pkpy_exec(pkpy_vm*, const char* source);
|
||||
PK_EXPORT bool pkpy_exec_2(pkpy_vm*, const char* source, const char* filename, int mode, const char* module);
|
||||
|
||||
/* Stack Manipulation */
|
||||
PK_EXPORT bool pkpy_dup(pkpy_vm*, int);
|
||||
PK_EXPORT bool pkpy_pop(pkpy_vm*, int);
|
||||
PK_EXPORT bool pkpy_pop_top(pkpy_vm*);
|
||||
PK_EXPORT bool pkpy_dup_top(pkpy_vm*);
|
||||
@ -75,7 +76,7 @@ PK_EXPORT bool pkpy_setglobal(pkpy_vm*, pkpy_CName);
|
||||
PK_EXPORT bool pkpy_eval(pkpy_vm*, const char* source);
|
||||
PK_EXPORT bool pkpy_unpack_sequence(pkpy_vm*, int size);
|
||||
PK_EXPORT bool pkpy_get_unbound_method(pkpy_vm*, pkpy_CName);
|
||||
PK_EXPORT bool pkpy_py_repr(pkpy_vm*, int i);
|
||||
PK_EXPORT bool pkpy_py_repr(pkpy_vm*);
|
||||
|
||||
/* Error Handling */
|
||||
PK_EXPORT bool pkpy_error(pkpy_vm*, const char* name, pkpy_CString);
|
||||
|
@ -13,12 +13,6 @@ add_library(pocketpy SHARED
|
||||
"pocketpy.cpp"
|
||||
)
|
||||
|
||||
if (NOT MSVC)
|
||||
target_compile_options(pocketpy PRIVATE -fno-rtti)
|
||||
else()
|
||||
target_compile_options(pocketpy PRIVATE /GR- /EHsc)
|
||||
endif()
|
||||
|
||||
set_target_properties(pocketpy PROPERTIES
|
||||
PUBLIC_HEADER pocketpy.h
|
||||
OUTPUT_NAME "pocketpy"
|
||||
|
@ -1,6 +1,6 @@
|
||||
python3 prebuild.py
|
||||
SRC=$(find src/ -name "*.cpp")
|
||||
clang++ -pg -O1 -std=c++17 -fno-rtti -stdlib=libc++ -Wfatal-errors -o main $SRC -Iinclude -ldl
|
||||
clang++ -pg -O1 -std=c++17 -stdlib=libc++ -Wfatal-errors -o main $SRC -Iinclude -ldl
|
||||
time ./main benchmarks/fib.py
|
||||
mv benchmarks/gmon.out .
|
||||
gprof pocketpy gmon.out > gprof.txt
|
||||
|
@ -1,6 +1,6 @@
|
||||
python3 prebuild.py
|
||||
SRC=$(find src/ -name "*.cpp")
|
||||
clang++ -std=c++17 -fno-rtti --coverage -O1 -stdlib=libc++ -Wfatal-errors -o main src2/main.cpp $SRC -Iinclude -ldl
|
||||
clang++ -std=c++17 --coverage -O1 -stdlib=libc++ -Wfatal-errors -o main src2/main.cpp $SRC -Iinclude -ldl
|
||||
python3 scripts/run_tests.py
|
||||
rm -rf .coverage
|
||||
mkdir .coverage
|
||||
|
@ -916,7 +916,8 @@ void init_builtins(VM* _vm) {
|
||||
|
||||
_vm->bind__hash__(_vm->tp_bytes, [](VM* vm, PyObject* obj) {
|
||||
const Bytes& self = _CAST(Bytes&, obj);
|
||||
return (i64)std::hash<std::string>()(self.str());
|
||||
std::string_view view(self.data(), self.size());
|
||||
return (i64)std::hash<std::string_view>()(view);
|
||||
});
|
||||
|
||||
_vm->bind__repr__(_vm->tp_bytes, [](VM* vm, PyObject* obj) {
|
||||
|
@ -89,6 +89,16 @@ bool pkpy_exec_2(pkpy_vm* vm_handle, const char* source, const char* filename, i
|
||||
return res != nullptr;
|
||||
}
|
||||
|
||||
bool pkpy_dup(pkpy_vm* vm_handle, int n){
|
||||
VM* vm = (VM*) vm_handle;
|
||||
PK_ASSERT_NO_ERROR()
|
||||
PK_PROTECTED(
|
||||
PyObject* item = stack_item(vm, n);
|
||||
vm->s_data.push(item);
|
||||
)
|
||||
return true;
|
||||
}
|
||||
|
||||
bool pkpy_pop(pkpy_vm* vm_handle, int n){
|
||||
VM* vm = (VM*) vm_handle;
|
||||
PK_ASSERT_NO_ERROR()
|
||||
@ -461,15 +471,15 @@ bool pkpy_get_unbound_method(pkpy_vm* vm_handle, pkpy_CName name){
|
||||
return true;
|
||||
}
|
||||
|
||||
bool pkpy_py_repr(pkpy_vm* vm_handle, int i) {
|
||||
bool pkpy_py_repr(pkpy_vm* vm_handle) {
|
||||
VM* vm = (VM*) vm_handle;
|
||||
PK_ASSERT_NO_ERROR()
|
||||
PK_ASSERT_N_EXTRA_ELEMENTS(1)
|
||||
PyObject* item = vm->s_data.top();
|
||||
PK_PROTECTED(
|
||||
PyObject* item = stack_item(vm, i);
|
||||
PyObject* repr = vm->py_repr(item);
|
||||
vm->s_data.push(repr);
|
||||
item = vm->py_repr(item);
|
||||
)
|
||||
vm->s_data.top() = item;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -3,3 +3,6 @@ assert a.encode() == b'12345'
|
||||
|
||||
assert b'\xff\xee' != b'1234'
|
||||
assert b'\xff\xee' == b'\xff\xee'
|
||||
|
||||
a = '测试123'
|
||||
assert a == a.encode().decode()
|
Loading…
x
Reference in New Issue
Block a user