mirror of
https://github.com/pocketpy/pocketpy
synced 2025-11-09 13:10:17 +00:00
fix bugs
-- fix some compile bugs -- modified README_zh.md
This commit is contained in:
parent
793fa923b0
commit
50cb446145
87
README_zh.md
87
README_zh.md
@ -5,16 +5,24 @@
|
||||
<a href="https://codecov.io/gh/pocketpy/pocketpy" >
|
||||
<img src="https://codecov.io/gh/pocketpy/pocketpy/branch/main/graph/badge.svg?token=TI9KAFL0RG"/>
|
||||
</a>
|
||||
<a href="https://en.wikipedia.org/wiki/C%2B%2B#Standardization">
|
||||
<img alt="C++17" src="https://img.shields.io/badge/C%2B%2B-17-blue.svg"></a>
|
||||
<a href="https://github.com/blueloveth/pocketpy/blob/main/LICENSE">
|
||||
<img alt="GitHub" src="https://img.shields.io/github/license/blueloveth/pocketpy.svg?color=blue"></a>
|
||||
<a href="https://github.com/blueloveth/pocketpy/releases">
|
||||
<img alt="GitHub release" src="https://img.shields.io/github/release/blueloveth/pocketpy.svg"></a>
|
||||
<!-- docs -->
|
||||
<a href="https://pocketpy.dev">
|
||||
<img alt="Website" src="https://img.shields.io/website/https/pocketpy.dev.svg?down_color=red&down_message=offline&up_color=blue&up_message=online"></a>
|
||||
<a title="Discord" href="https://discord.gg/WWaq72GzXv" >
|
||||
<img src="https://img.shields.io/discord/1048978026131640390.svg" /></a>
|
||||
</p>
|
||||
|
||||
pocketpy 是一个轻量级的 Python 解释器,为嵌入至游戏引擎而设计,基于 C++17 和 STL。
|
||||
|
||||
它包含一个编译器和基于字节码的虚拟机,以及交互式命令窗的实现。所有功能均集成在单个头文件 `pocketpy.h` 中,不包含外部依赖项,能很方便地嵌入至你的应用。
|
||||
|
||||
你可以 [在浏览器中体验](https://pocketpy.dev/static/web/) pocketpy 的交互式界面(REPL)。
|
||||
你可以浏览 https://pocketpy.dev 获取更多信息或是 [在浏览器中体验](https://pocketpy.dev/static/web/) pocketpy 的交互式界面(REPL)。
|
||||
|
||||
## 支持的平台
|
||||
|
||||
@ -34,6 +42,31 @@ pkpy 支持任何拥有 C++17 编译器的平台。
|
||||
你可以在 [Github Release](https://github.com/pocketpy/pocketpy/releases) 页面下载 `pocketpy.h`,
|
||||
并加入到你的工程中。请参阅 https://pocketpy.dev 以获取更详细的文档。
|
||||
|
||||
你也可以是用CMake从源代码开始构建。详情请见[CMakeLists.txt](https://github.com/pocketpy/pocketpy/blob/main/CMakeLists.txt)
|
||||
修改以下变量可以控制构建过程
|
||||
+ `PK_BUILD_STATIC_LIB` - 构建静态库 (默认, 推荐)
|
||||
+ `PK_BUILD_SHARED_LIB` - 构建动态库
|
||||
|
||||
在生产中使用 `main` 分支是安全的。
|
||||
|
||||
### 编译标志
|
||||
|
||||
若要将pocketpy与你的项目一起编译,必须设置以下标志:
|
||||
|
||||
+ `--std=c++17` 标志必须被设置
|
||||
+ Exception 必须被允许
|
||||
+ 对于MSVC, `/utf-8` 标志必须被设置
|
||||
|
||||
对于开发者构建,使用以下脚本
|
||||
```bash
|
||||
# 前提
|
||||
pip install cmake
|
||||
# 构建仓库
|
||||
python cmake_build.py
|
||||
# 单元测试
|
||||
python scripts/run_tests.py
|
||||
```
|
||||
|
||||
```cpp
|
||||
#include "pocketpy.h"
|
||||
|
||||
@ -96,10 +129,62 @@ int main(){
|
||||
| 生成器 | `yield i` | ✅ |
|
||||
| 装饰器 | `@cache` | ✅ |
|
||||
|
||||
## 性能
|
||||
|
||||
目前,pkpy的速度与cpython 3.9一样快。
|
||||
cpython 3.9的性能结果适用于pkpy。
|
||||
访问 https://pocketpy.dev/performance/ 以获取详细信息。
|
||||
以下是 Intel i5-12400F、WSL(Ubuntu 20.04 LTS)上的primes基准测试的结果,大致反映了c++、lua、pkpy和cpython之间的性能。
|
||||
|
||||
| name | version | time | file |
|
||||
| ---- | ---- | ---- | ---- |
|
||||
| c++ | gnu++11 | `0.104s ■□□□□□□□□□□□□□□□` | [benchmarks/primes.cpp](https://github.com/pocketpy/pocketpy/blob/9481d653b60b81f4590a4d48f2be496f6962261e/benchmarks/primes.cpp) |
|
||||
| lua | 5.3.3 | `1.576s ■■■■■■■■■□□□□□□□` | [benchmarks/primes.lua](https://github.com/pocketpy/pocketpy/blob/9481d653b60b81f4590a4d48f2be496f6962261e/benchmarks/primes.lua) |
|
||||
| pkpy | 1.2.7 | `2.385s ■■■■■■■■■■■■■□□□` | [benchmarks/primes.py](https://github.com/pocketpy/pocketpy/blob/9481d653b60b81f4590a4d48f2be496f6962261e/benchmarks/primes.py) |
|
||||
| cpython | 3.8.10 | `2.871s ■■■■■■■■■■■■■■■■` | [benchmarks/primes.py](https://github.com/pocketpy/pocketpy/blob/9481d653b60b81f4590a4d48f2be496f6962261e/benchmarks/primes.py) |
|
||||
|
||||
## 被使用
|
||||
|
||||
| | Description |
|
||||
|-----------------------------------------------------------------|--------------------------------------------------------------------------|
|
||||
| [TIC-80](https://github.com/nesbox/TIC-80) | TIC-80 is a fantasy computer for making, playing and sharing tiny games. |
|
||||
| [MiniPythonIDE](https://github.com/CU-Production/MiniPythonIDE) | A python ide base on pocketpy |
|
||||
| [py-js](https://github.com/shakfu/py-js) | Python3 externals for Max / MSP |
|
||||
| [crescent](https://github.com/chukobyte/crescent) | Crescent is a cross-platform 2D fighting and beat-em-up game engine. |
|
||||
|
||||
如果你想添加你的项目,请提交一个pr
|
||||
|
||||
## 贡献
|
||||
|
||||
任何形式的共享都是受欢迎的
|
||||
|
||||
- 提交pr
|
||||
- 修复错误
|
||||
- 添加新的特性
|
||||
- 打开Issue
|
||||
- 任何的建议
|
||||
- 任何的疑问
|
||||
|
||||
如果你觉得pkpy有用,就给这个仓库一颗星星吧 (●'◡'●)
|
||||
|
||||
## 赞助这个项目
|
||||
|
||||
你可以通过以下途径赞助这个项目
|
||||
|
||||
+ [Github Sponsors](https://github.com/sponsors/blueloveTH)
|
||||
+ [Buy me a coffee](https://www.buymeacoffee.com/blueloveth)
|
||||
|
||||
您的赞助将帮助我们不断发展pkpy。
|
||||
|
||||
## 参考
|
||||
|
||||
+ [cpython](https://github.com/python/cpython)
|
||||
+ [byterun](http://qingyunha.github.io/taotao/)
|
||||
+ [box2d](https://box2d.org/)
|
||||
|
||||
## 历史
|
||||
|
||||
[](https://star-history.com/#blueloveth/pocketpy&Date)
|
||||
|
||||
## 开源协议
|
||||
|
||||
|
||||
@ -158,7 +158,7 @@ void _bind(VM* vm, PyObject* obj, const char* sig, Ret(T::*func)(Params...)){
|
||||
wT& self = _CAST(wT&, args[0]); \
|
||||
return VAR_T(wT, *self._()); \
|
||||
}); \
|
||||
vm->bind_method<0>(type, "sizeof", [](VM* vm, ArgsView args){ \
|
||||
vm->bind_method<0>(type, "sizeof", [](VM* vm,[[maybe_unused]] ArgsView args){ \
|
||||
return VAR(sizeof(vT)); \
|
||||
}); \
|
||||
vm->bind__eq__(PK_OBJ_GET(Type, type), [](VM* vm, PyObject* _0, PyObject* _1){ \
|
||||
|
||||
@ -164,7 +164,7 @@ struct Type {
|
||||
operator int() const { return this->index; }
|
||||
};
|
||||
|
||||
#define PK_LAMBDA(x) ([](VM* vm, ArgsView args) { return x; })
|
||||
#define PK_LAMBDA(x) ([](VM* vm, [[maybe_unused]] ArgsView args) { return x; })
|
||||
#define PK_VAR_LAMBDA(x) ([](VM* vm, ArgsView args) { return VAR(x); })
|
||||
#define PK_ACTION(x) ([](VM* vm, ArgsView args) { x; return vm->None; })
|
||||
|
||||
|
||||
@ -33,7 +33,7 @@ class Compiler {
|
||||
const Token& curr() const{ return tokens.at(i); }
|
||||
const Token& next() const{ return tokens.at(i+1); }
|
||||
const Token& err() const{
|
||||
if(i >= tokens.size()) return prev();
|
||||
if(i >= static_cast<int>(tokens.size())) return prev();
|
||||
return curr();
|
||||
}
|
||||
void advance(int delta=1) { i += delta; }
|
||||
|
||||
@ -309,7 +309,7 @@ struct NameDictImpl{
|
||||
|
||||
std::vector<StrName> keys() const{
|
||||
std::vector<StrName> v;
|
||||
apply([&](StrName key, V val){
|
||||
apply([&](StrName key,[[maybe_unused]] V val){
|
||||
v.push_back(key);
|
||||
});
|
||||
return v;
|
||||
|
||||
@ -202,7 +202,7 @@ struct MappingProxy{
|
||||
|
||||
inline void gc_mark_namedict(NameDict& t){
|
||||
if(t.size() == 0) return;
|
||||
t.apply([](StrName name, PyObject* obj){
|
||||
t.apply([]([[maybe_unused]]StrName name, PyObject* obj){
|
||||
PK_OBJ_MARK(obj);
|
||||
});
|
||||
}
|
||||
@ -230,7 +230,7 @@ __T py_cast(VM* vm, PyObject* obj) {
|
||||
}
|
||||
|
||||
template<typename __T>
|
||||
__T _py_cast(VM* vm, PyObject* obj) {
|
||||
__T _py_cast([[maybe_unused]]VM* vm, PyObject* obj) {
|
||||
using T = std::decay_t<__T>;
|
||||
if constexpr(std::is_enum_v<T>){
|
||||
return (__T)_py_cast<i64>(vm, obj);
|
||||
|
||||
@ -416,7 +416,7 @@ public:
|
||||
|
||||
ImportContext _import_context;
|
||||
PyObject* py_import(Str path, bool throw_err=true);
|
||||
~VM();
|
||||
virtual ~VM();
|
||||
|
||||
#if PK_DEBUG_CEVAL_STEP
|
||||
void _log_s_data(const char* title = nullptr);
|
||||
@ -570,7 +570,7 @@ template<> inline CString py_cast<CString>(VM* vm, PyObject* obj){
|
||||
return PK_OBJ_GET(Str, obj).c_str();
|
||||
}
|
||||
|
||||
template<> inline CString _py_cast<CString>(VM* vm, PyObject* obj){
|
||||
template<> inline CString _py_cast<CString>([[maybe_unused]]VM* vm, PyObject* obj){
|
||||
return PK_OBJ_GET(Str, obj).c_str();
|
||||
}
|
||||
|
||||
@ -586,7 +586,7 @@ inline const char* py_cast<const char*>(VM* vm, PyObject* obj){
|
||||
}
|
||||
|
||||
template<>
|
||||
inline const char* _py_cast<const char*>(VM* vm, PyObject* obj){
|
||||
inline const char* _py_cast<const char*>([[maybe_unused]]VM* vm, PyObject* obj){
|
||||
return PK_OBJ_GET(Str, obj).c_str();
|
||||
}
|
||||
|
||||
|
||||
@ -39,7 +39,7 @@ struct Array2d{
|
||||
data[row * n_cols + col] = value;
|
||||
}
|
||||
|
||||
static void _register(VM* vm, PyObject* mod, PyObject* type){
|
||||
static void _register(VM* vm,[[maybe_unused]] PyObject* mod, PyObject* type){
|
||||
vm->bind(type, "__new__(cls, *args, **kwargs)", [](VM* vm, ArgsView args){
|
||||
Type cls = PK_OBJ_GET(Type, args[0]);
|
||||
return vm->heap.gcnew<Array2d>(cls);
|
||||
@ -115,7 +115,7 @@ struct Array2d{
|
||||
return vm->py_iter(VAR(std::move(t)));
|
||||
});
|
||||
|
||||
vm->bind__len__(PK_OBJ_GET(Type, type), [](VM* vm, PyObject* _0){
|
||||
vm->bind__len__(PK_OBJ_GET(Type, type), []([[maybe_unused]]VM* vm, PyObject* _0){
|
||||
Array2d& self = PK_OBJ_GET(Array2d, _0);
|
||||
return (i64)self.n_rows;
|
||||
});
|
||||
|
||||
@ -2,14 +2,14 @@
|
||||
|
||||
namespace pkpy{
|
||||
|
||||
void VoidP::_register(VM* vm, PyObject* mod, PyObject* type){
|
||||
void VoidP::_register(VM* vm, [[maybe_unused]] PyObject* mod, PyObject* type){
|
||||
vm->bind_constructor<2>(type, [](VM* vm, ArgsView args){
|
||||
Type cls = PK_OBJ_GET(Type, args[0]);
|
||||
i64 addr = CAST(i64, args[1]);
|
||||
return vm->heap.gcnew<VoidP>(cls, reinterpret_cast<void*>(addr));
|
||||
});
|
||||
|
||||
vm->bind__hash__(PK_OBJ_GET(Type, type), [](VM* vm, PyObject* obj){
|
||||
vm->bind__hash__(PK_OBJ_GET(Type, type), []([[maybe_unused]] VM* vm, PyObject* obj){
|
||||
VoidP& self = PK_OBJ_GET(VoidP, obj);
|
||||
return reinterpret_cast<i64>(self.ptr);
|
||||
});
|
||||
@ -37,7 +37,7 @@ namespace pkpy{
|
||||
}
|
||||
|
||||
|
||||
void C99Struct::_register(VM* vm, PyObject* mod, PyObject* type){
|
||||
void C99Struct::_register(VM* vm, [[maybe_unused]] PyObject* mod, PyObject* type){
|
||||
vm->bind_constructor<2>(type, [](VM* vm, ArgsView args){
|
||||
Type cls = PK_OBJ_GET(Type, args[0]);
|
||||
int size = CAST(int, args[1]);
|
||||
|
||||
@ -22,13 +22,13 @@ namespace pkpy
|
||||
void _gc_mark() const { PK_OBJ_MARK(ref); }
|
||||
static void _register(VM *vm, PyObject *mod, PyObject *type);
|
||||
};
|
||||
void PyDequeIter::_register(VM *vm, PyObject *mod, PyObject *type)
|
||||
void PyDequeIter::_register(VM *vm, [[maybe_unused]] PyObject *mod, PyObject *type)
|
||||
{
|
||||
// Iterator for the deque type
|
||||
vm->_all_types[PK_OBJ_GET(Type, type)].subclass_enabled = false;
|
||||
vm->bind_notimplemented_constructor<PyDequeIter>(type);
|
||||
|
||||
vm->bind__iter__(PK_OBJ_GET(Type, type), [](VM *vm, PyObject *obj)
|
||||
vm->bind__iter__(PK_OBJ_GET(Type, type), []([[maybe_unused]] VM *vm, PyObject *obj)
|
||||
{ return obj; });
|
||||
vm->bind__next__(PK_OBJ_GET(Type, type), [](VM *vm, PyObject *obj)
|
||||
{
|
||||
@ -61,7 +61,7 @@ namespace pkpy
|
||||
static void _register(VM *vm, PyObject *mod, PyObject *type); // register the type
|
||||
void _gc_mark() const; // needed for container types, mark all objects in the deque for gc
|
||||
};
|
||||
void PyDeque::_register(VM *vm, PyObject *mod, PyObject *type)
|
||||
void PyDeque::_register(VM *vm, [[maybe_unused]] PyObject *mod, PyObject *type)
|
||||
{
|
||||
vm->bind(type, "__new__(cls, iterable=None, maxlen=None)",
|
||||
[](VM *vm, ArgsView args)
|
||||
@ -137,7 +137,7 @@ namespace pkpy
|
||||
if(!is_non_tagged_type(_0, PyDeque::_type(vm))) return vm->NotImplemented;
|
||||
const PyDeque &other = _CAST(PyDeque&, _1);
|
||||
if (self.dequeItems.size() != other.dequeItems.size()) return vm->False;
|
||||
for (int i = 0; i < self.dequeItems.size(); i++){
|
||||
for (int i = 0; i < static_cast<int>(self.dequeItems.size()); i++){
|
||||
if (vm->py_ne(self.dequeItems[i], other.dequeItems[i])) return vm->False;
|
||||
}
|
||||
return vm->True;
|
||||
@ -231,7 +231,7 @@ namespace pkpy
|
||||
{
|
||||
if (vm->py_eq((*it), obj))
|
||||
cnt++;
|
||||
if (sz != self.dequeItems.size())// mutating the deque during iteration is not allowed
|
||||
if (sz != static_cast<int>(self.dequeItems.size()))// mutating the deque during iteration is not allowed
|
||||
vm->RuntimeError("deque mutated during iteration");
|
||||
}
|
||||
return VAR(cnt);
|
||||
@ -290,7 +290,7 @@ namespace pkpy
|
||||
PyDeque &self = _CAST(PyDeque &, args[0]);
|
||||
int index = CAST(int, args[1]);
|
||||
PyObject *obj = args[2];
|
||||
if (self.bounded && self.dequeItems.size() == self.maxlen)
|
||||
if (self.bounded && static_cast<int>(self.dequeItems.size()) == self.maxlen)
|
||||
vm->IndexError("deque already at its maximum size");
|
||||
else
|
||||
self.insertObj(false, false, index, obj); // this index shouldn't be fixed using vm->normalized_index, pass as is
|
||||
@ -364,7 +364,7 @@ namespace pkpy
|
||||
return VAR(self.maxlen);
|
||||
return vm->None;
|
||||
},
|
||||
[](VM *vm, ArgsView args)
|
||||
[](VM *vm, [[maybe_unused]] ArgsView args)
|
||||
{
|
||||
vm->AttributeError("attribute 'maxlen' of 'collections.deque' objects is not writable");
|
||||
return vm->None;
|
||||
|
||||
@ -51,7 +51,7 @@ namespace pkpy{
|
||||
SyntaxError("maximum number of opcodes exceeded");
|
||||
}
|
||||
// pre-compute LOOP_BREAK and LOOP_CONTINUE and FOR_ITER
|
||||
for(int i=0; i<codes.size(); i++){
|
||||
for(int i=0; i< static_cast<int>(codes.size()); i++){
|
||||
Bytecode& bc = codes[i];
|
||||
if(bc.op == OP_LOOP_CONTINUE){
|
||||
bc.arg = ctx()->co->blocks[bc.arg].start;
|
||||
|
||||
@ -20,11 +20,11 @@ void add_module_csv(VM *vm){
|
||||
std::string buffer;
|
||||
__NEXT_LINE:
|
||||
j = 0;
|
||||
while(j < line.size()){
|
||||
while(j < static_cast<int>(line.size())){
|
||||
switch(line[j]){
|
||||
case '"':
|
||||
if(in_quote){
|
||||
if(j+1 < line.size() && line[j+1] == '"'){
|
||||
if(j+1 < static_cast<int>(line.size()) && line[j+1] == '"'){
|
||||
buffer += '"';
|
||||
j++;
|
||||
}else{
|
||||
|
||||
@ -8,7 +8,7 @@ namespace pkpy{
|
||||
if (strncmp(source.data(), "\xEF\xBB\xBF", 3) == 0) index += 3;
|
||||
// Drop all '\r'
|
||||
SStream ss(source.size() + 1);
|
||||
while(index < source.size()){
|
||||
while(index < static_cast<int>(source.size())){
|
||||
if(source[index] != '\r') ss << source[index];
|
||||
index++;
|
||||
}
|
||||
|
||||
@ -327,7 +327,7 @@ namespace pkpy{
|
||||
// TOS is an iterable
|
||||
// items may contain StarredExpr, we should check it
|
||||
int starred_i = -1;
|
||||
for(int i=0; i<items.size(); i++){
|
||||
for(int i=0; i< static_cast<int>(items.size()); i++){
|
||||
if(!items[i]->is_starred()) continue;
|
||||
if(starred_i == -1) starred_i = i;
|
||||
else return false; // multiple StarredExpr not allowed
|
||||
@ -346,7 +346,7 @@ namespace pkpy{
|
||||
// starred assignment target must be in a tuple
|
||||
if(items.size() == 1) return false;
|
||||
// starred assignment target must be the last one (differ from cpython)
|
||||
if(starred_i != items.size()-1) return false;
|
||||
if(starred_i != static_cast<int>(items.size()-1)) return false;
|
||||
// a,*b = [1,2,3]
|
||||
// stack is [1,2,3] -> [1,[2,3]]
|
||||
ctx->emit_(OP_UNPACK_EX, items.size()-1, line);
|
||||
|
||||
@ -50,7 +50,7 @@ namespace pkpy{
|
||||
void Frame::jump_abs_break(int target){
|
||||
int i = co->iblocks[_ip];
|
||||
_next_ip = target;
|
||||
if(_next_ip >= co->codes.size()){
|
||||
if(_next_ip >= static_cast<int>(co->codes.size())){
|
||||
while(i>=0) i = _exit_block(i);
|
||||
}else{
|
||||
// BUG (solved)
|
||||
|
||||
@ -62,7 +62,7 @@ namespace pkpy{
|
||||
|
||||
void FuncDecl::_gc_mark() const{
|
||||
code->_gc_mark();
|
||||
for(int i=0; i<kwargs.size(); i++) PK_OBJ_MARK(kwargs[i].value);
|
||||
for(int i=0; i< static_cast<int>(kwargs.size()); i++) PK_OBJ_MARK(kwargs[i].value);
|
||||
}
|
||||
|
||||
} // namespace pkpy
|
||||
@ -24,7 +24,7 @@ static size_t io_fread(void* buffer, size_t size, size_t count, FILE* fp){
|
||||
#endif
|
||||
|
||||
|
||||
unsigned char* _default_import_handler(const char* name_p, int name_size, int* out_size){
|
||||
unsigned char* _default_import_handler([[maybe_unused]] const char* name_p, [[maybe_unused]] int name_size,[[maybe_unused]] int* out_size){
|
||||
#if PK_ENABLE_OS
|
||||
std::string name(name_p, name_size);
|
||||
bool exists = std::filesystem::exists(std::filesystem::path(name));
|
||||
@ -109,7 +109,7 @@ unsigned char* _default_import_handler(const char* name_p, int name_size, int* o
|
||||
|
||||
#endif
|
||||
|
||||
void add_module_io(VM* vm){
|
||||
void add_module_io([[maybe_unused]] VM* vm){
|
||||
#if PK_ENABLE_OS
|
||||
PyObject* mod = vm->new_module("io");
|
||||
FileIO::register_class(vm, mod);
|
||||
@ -121,7 +121,7 @@ void add_module_io(VM* vm){
|
||||
#endif
|
||||
}
|
||||
|
||||
void add_module_os(VM* vm){
|
||||
void add_module_os([[maybe_unused]] VM* vm){
|
||||
#if PK_ENABLE_OS
|
||||
PyObject* mod = vm->new_module("os");
|
||||
PyObject* path_obj = vm->heap.gcnew<DummyInstance>(vm->tp_object);
|
||||
|
||||
16
src/iter.cpp
16
src/iter.cpp
@ -2,10 +2,10 @@
|
||||
|
||||
namespace pkpy{
|
||||
|
||||
void RangeIter::_register(VM* vm, PyObject* mod, PyObject* type){
|
||||
void RangeIter::_register(VM* vm, [[maybe_unused]] PyObject* mod, PyObject* type){
|
||||
vm->_all_types[PK_OBJ_GET(Type, type)].subclass_enabled = false;
|
||||
vm->bind_notimplemented_constructor<RangeIter>(type);
|
||||
vm->bind__iter__(PK_OBJ_GET(Type, type), [](VM* vm, PyObject* obj){ return obj; });
|
||||
vm->bind__iter__(PK_OBJ_GET(Type, type), []([[maybe_unused]] VM* vm, PyObject* obj){ return obj; });
|
||||
vm->bind__next__(PK_OBJ_GET(Type, type), [](VM* vm, PyObject* obj){
|
||||
RangeIter& self = _CAST(RangeIter&, obj);
|
||||
bool has_next = self.r.step > 0 ? self.current < self.r.stop : self.current > self.r.stop;
|
||||
@ -15,10 +15,10 @@ namespace pkpy{
|
||||
});
|
||||
}
|
||||
|
||||
void ArrayIter::_register(VM* vm, PyObject* mod, PyObject* type){
|
||||
void ArrayIter::_register(VM* vm, [[maybe_unused]] PyObject* mod, PyObject* type){
|
||||
vm->_all_types[PK_OBJ_GET(Type, type)].subclass_enabled = false;
|
||||
vm->bind_notimplemented_constructor<ArrayIter>(type);
|
||||
vm->bind__iter__(PK_OBJ_GET(Type, type), [](VM* vm, PyObject* obj){ return obj; });
|
||||
vm->bind__iter__(PK_OBJ_GET(Type, type), []([[maybe_unused]] VM* vm, PyObject* obj){ return obj; });
|
||||
vm->bind__next__(PK_OBJ_GET(Type, type), [](VM* vm, PyObject* obj){
|
||||
ArrayIter& self = _CAST(ArrayIter&, obj);
|
||||
if(self.current == self.end) return vm->StopIteration;
|
||||
@ -26,10 +26,10 @@ namespace pkpy{
|
||||
});
|
||||
}
|
||||
|
||||
void StringIter::_register(VM* vm, PyObject* mod, PyObject* type){
|
||||
void StringIter::_register(VM* vm, [[maybe_unused]] PyObject* mod, PyObject* type){
|
||||
vm->_all_types[PK_OBJ_GET(Type, type)].subclass_enabled = false;
|
||||
vm->bind_notimplemented_constructor<StringIter>(type);
|
||||
vm->bind__iter__(PK_OBJ_GET(Type, type), [](VM* vm, PyObject* obj){ return obj; });
|
||||
vm->bind__iter__(PK_OBJ_GET(Type, type), []([[maybe_unused]] VM* vm, PyObject* obj){ return obj; });
|
||||
vm->bind__next__(PK_OBJ_GET(Type, type), [](VM* vm, PyObject* obj){
|
||||
StringIter& self = _CAST(StringIter&, obj);
|
||||
if(self.index == self.str->size) return vm->StopIteration;
|
||||
@ -73,10 +73,10 @@ namespace pkpy{
|
||||
}
|
||||
}
|
||||
|
||||
void Generator::_register(VM* vm, PyObject* mod, PyObject* type){
|
||||
void Generator::_register(VM* vm, [[maybe_unused]] PyObject* mod, PyObject* type){
|
||||
vm->_all_types[PK_OBJ_GET(Type, type)].subclass_enabled = false;
|
||||
vm->bind_notimplemented_constructor<Generator>(type);
|
||||
vm->bind__iter__(PK_OBJ_GET(Type, type), [](VM* vm, PyObject* obj){ return obj; });
|
||||
vm->bind__iter__(PK_OBJ_GET(Type, type), []([[maybe_unused]] VM* vm, PyObject* obj){ return obj; });
|
||||
vm->bind__next__(PK_OBJ_GET(Type, type), [](VM* vm, PyObject* obj){
|
||||
Generator& self = _CAST(Generator&, obj);
|
||||
return self.next(vm);
|
||||
|
||||
@ -105,7 +105,7 @@ static Vec2 SmoothDamp(Vec2 current, Vec2 target, PyVec2& currentVelocity, float
|
||||
return Vec2(output_x, output_y);
|
||||
}
|
||||
|
||||
void PyVec2::_register(VM* vm, PyObject* mod, PyObject* type){
|
||||
void PyVec2::_register(VM* vm, [[maybe_unused]] PyObject* mod, PyObject* type){
|
||||
PY_STRUCT_LIKE(PyVec2)
|
||||
|
||||
vm->bind_constructor<3>(type, [](VM* vm, ArgsView args){
|
||||
@ -174,7 +174,7 @@ static Vec2 SmoothDamp(Vec2 current, Vec2 target, PyVec2& currentVelocity, float
|
||||
BIND_VEC_FUNCTION_0(2, normalize_)
|
||||
}
|
||||
|
||||
void PyVec3::_register(VM* vm, PyObject* mod, PyObject* type){
|
||||
void PyVec3::_register(VM* vm, [[maybe_unused]] PyObject* mod, PyObject* type){
|
||||
PY_STRUCT_LIKE(PyVec3)
|
||||
|
||||
vm->bind_constructor<4>(type, [](VM* vm, ArgsView args){
|
||||
@ -208,7 +208,7 @@ static Vec2 SmoothDamp(Vec2 current, Vec2 target, PyVec2& currentVelocity, float
|
||||
BIND_VEC_FUNCTION_0(3, normalize_)
|
||||
}
|
||||
|
||||
void PyVec4::_register(VM* vm, PyObject* mod, PyObject* type){
|
||||
void PyVec4::_register(VM* vm, [[maybe_unused]] PyObject* mod, PyObject* type){
|
||||
PY_STRUCT_LIKE(PyVec4)
|
||||
|
||||
vm->bind_constructor<1+4>(type, [](VM* vm, ArgsView args){
|
||||
@ -248,7 +248,7 @@ static Vec2 SmoothDamp(Vec2 current, Vec2 target, PyVec2& currentVelocity, float
|
||||
#undef BIND_VEC_FUNCTION_0
|
||||
#undef BIND_VEC_FUNCTION_1
|
||||
|
||||
void PyMat3x3::_register(VM* vm, PyObject* mod, PyObject* type){
|
||||
void PyMat3x3::_register(VM* vm, [[maybe_unused]] PyObject* mod, PyObject* type){
|
||||
PY_STRUCT_LIKE(PyMat3x3)
|
||||
|
||||
vm->bind_constructor<-1>(type, [](VM* vm, ArgsView args){
|
||||
|
||||
@ -40,7 +40,7 @@ struct PyStructTime{
|
||||
|
||||
PyStructTime* _() { return this; }
|
||||
|
||||
static void _register(VM* vm, PyObject* mod, PyObject* type){
|
||||
static void _register(VM* vm, [[maybe_unused]] PyObject* mod, PyObject* type){
|
||||
vm->bind_notimplemented_constructor<PyStructTime>(type);
|
||||
PY_READONLY_FIELD(PyStructTime, "tm_year", _, tm_year);
|
||||
PY_READONLY_FIELD(PyStructTime, "tm_mon", _, tm_mon);
|
||||
@ -58,7 +58,7 @@ void add_module_time(VM* vm){
|
||||
PyObject* mod = vm->new_module("time");
|
||||
PyStructTime::register_class(vm, mod);
|
||||
|
||||
vm->bind_func<0>(mod, "time", [](VM* vm, ArgsView args) {
|
||||
vm->bind_func<0>(mod, "time", [](VM* vm, [[maybe_unused]] ArgsView args) {
|
||||
auto now = std::chrono::system_clock::now();
|
||||
return VAR(std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()).count() / 1000.0);
|
||||
});
|
||||
@ -74,7 +74,7 @@ void add_module_time(VM* vm){
|
||||
return vm->None;
|
||||
});
|
||||
|
||||
vm->bind_func<0>(mod, "localtime", [](VM* vm, ArgsView args) {
|
||||
vm->bind_func<0>(mod, "localtime", [](VM* vm, [[maybe_unused]] ArgsView args) {
|
||||
auto now = std::chrono::system_clock::now();
|
||||
std::time_t t = std::chrono::system_clock::to_time_t(now);
|
||||
return VAR_T(PyStructTime, t);
|
||||
@ -206,14 +206,14 @@ void add_module_math(VM* vm){
|
||||
|
||||
void add_module_traceback(VM* vm){
|
||||
PyObject* mod = vm->new_module("traceback");
|
||||
vm->bind_func<0>(mod, "print_exc", [](VM* vm, ArgsView args) {
|
||||
vm->bind_func<0>(mod, "print_exc", [](VM* vm, [[maybe_unused]] ArgsView args) {
|
||||
if(vm->_last_exception==nullptr) vm->ValueError("no exception");
|
||||
Exception& e = _CAST(Exception&, vm->_last_exception);
|
||||
vm->stdout_write(e.summary());
|
||||
return vm->None;
|
||||
});
|
||||
|
||||
vm->bind_func<0>(mod, "format_exc", [](VM* vm, ArgsView args) {
|
||||
vm->bind_func<0>(mod, "format_exc", [](VM* vm, [[maybe_unused]] ArgsView args) {
|
||||
if(vm->_last_exception==nullptr) vm->ValueError("no exception");
|
||||
Exception& e = _CAST(Exception&, vm->_last_exception);
|
||||
return VAR(e.summary());
|
||||
@ -258,7 +258,7 @@ struct LineProfilerW{
|
||||
|
||||
LineProfiler profiler;
|
||||
|
||||
static void _register(VM* vm, PyObject* mod, PyObject* type){
|
||||
static void _register(VM* vm, [[maybe_unused]] PyObject* mod, PyObject* type){
|
||||
vm->bind_default_constructor<LineProfilerW>(type);
|
||||
|
||||
vm->bind(type, "add_function(self, func)", [](VM* vm, ArgsView args){
|
||||
|
||||
@ -109,7 +109,7 @@ void init_builtins(VM* _vm) {
|
||||
return VAR(vm->issubclass(PK_OBJ_GET(Type, args[0]), PK_OBJ_GET(Type, args[1])));
|
||||
});
|
||||
|
||||
_vm->bind_func<0>(_vm->builtins, "globals", [](VM* vm, ArgsView args) {
|
||||
_vm->bind_func<0>(_vm->builtins, "globals", [](VM* vm, [[maybe_unused]] ArgsView args) {
|
||||
PyObject* mod = vm->top_frame()->_module;
|
||||
return VAR(MappingProxy(mod));
|
||||
});
|
||||
@ -340,7 +340,7 @@ void init_builtins(VM* _vm) {
|
||||
_vm->bind__iter__(VM::tp_range, [](VM* vm, PyObject* obj) { return VAR_T(RangeIter, PK_OBJ_GET(Range, obj)); });
|
||||
|
||||
// tp_nonetype
|
||||
_vm->bind__repr__(_vm->_tp(_vm->None), [](VM* vm, PyObject* _0) {
|
||||
_vm->bind__repr__(_vm->_tp(_vm->None), [](VM* vm, [[maybe_unused]] PyObject* _0) {
|
||||
return VAR("None");
|
||||
});
|
||||
|
||||
@ -501,7 +501,7 @@ void init_builtins(VM* _vm) {
|
||||
const Str& self = _CAST(Str&, _0);
|
||||
return VAR(self.index(CAST(Str&, _1)) != -1);
|
||||
});
|
||||
_vm->bind__str__(VM::tp_str, [](VM* vm, PyObject* _0) { return _0; });
|
||||
_vm->bind__str__(VM::tp_str, []([[maybe_unused]] VM* vm, PyObject* _0) { return _0; });
|
||||
_vm->bind__iter__(VM::tp_str, [](VM* vm, PyObject* _0) { return VAR_T(StringIter, _0); });
|
||||
_vm->bind__repr__(VM::tp_str, [](VM* vm, PyObject* _0) {
|
||||
const Str& self = _CAST(Str&, _0);
|
||||
@ -554,7 +554,7 @@ void init_builtins(VM* _vm) {
|
||||
parts = self.split(sep);
|
||||
}
|
||||
List ret(parts.size());
|
||||
for(int i=0; i<parts.size(); i++) ret[i] = VAR(Str(parts[i]));
|
||||
for(int i=0; i< static_cast<int>(parts.size()); i++) ret[i] = VAR(Str(parts[i]));
|
||||
return VAR(std::move(ret));
|
||||
});
|
||||
|
||||
@ -563,7 +563,7 @@ void init_builtins(VM* _vm) {
|
||||
std::vector<std::string_view> parts;
|
||||
parts = self.split('\n');
|
||||
List ret(parts.size());
|
||||
for(int i=0; i<parts.size(); i++) ret[i] = VAR(Str(parts[i]));
|
||||
for(int i=0; i < static_cast<int>(parts.size()); i++) ret[i] = VAR(Str(parts[i]));
|
||||
return VAR(std::move(ret));
|
||||
});
|
||||
|
||||
@ -1014,10 +1014,10 @@ void init_builtins(VM* _vm) {
|
||||
});
|
||||
|
||||
// tp_ellipsis / tp_NotImplementedType
|
||||
_vm->bind__repr__(_vm->_tp(_vm->Ellipsis), [](VM* vm, PyObject* _0) {
|
||||
_vm->bind__repr__(_vm->_tp(_vm->Ellipsis), [](VM* vm, [[maybe_unused]] PyObject* _0) {
|
||||
return VAR("...");
|
||||
});
|
||||
_vm->bind__repr__(_vm->_tp(_vm->NotImplemented), [](VM* vm, PyObject* _0) {
|
||||
_vm->bind__repr__(_vm->_tp(_vm->NotImplemented), [](VM* vm, [[maybe_unused]] PyObject* _0) {
|
||||
return VAR("NotImplemented");
|
||||
});
|
||||
|
||||
@ -1173,7 +1173,7 @@ void init_builtins(VM* _vm) {
|
||||
});
|
||||
|
||||
// tp_dict
|
||||
_vm->bind_constructor<-1>(_vm->_t(VM::tp_dict), [](VM* vm, ArgsView args){
|
||||
_vm->bind_constructor<-1>(_vm->_t(VM::tp_dict), [](VM* vm, [[maybe_unused]] ArgsView args){
|
||||
return VAR(Dict(vm));
|
||||
});
|
||||
|
||||
@ -1416,7 +1416,7 @@ void init_builtins(VM* _vm) {
|
||||
void VM::post_init(){
|
||||
init_builtins(this);
|
||||
|
||||
bind_method<-1>(tp_module, "__init__", [](VM* vm, ArgsView args) {
|
||||
bind_method<-1>(tp_module, "__init__", [](VM* vm, [[maybe_unused]] ArgsView args) {
|
||||
vm->NotImplementedError();
|
||||
return vm->None;
|
||||
});
|
||||
@ -1435,7 +1435,7 @@ void VM::post_init(){
|
||||
});
|
||||
|
||||
// type
|
||||
bind__getitem__(tp_type, [](VM* vm, PyObject* self, PyObject* _){
|
||||
bind__getitem__(tp_type, []([[maybe_unused]] VM* vm, PyObject* self, PyObject* _){
|
||||
PK_UNUSED(_);
|
||||
return self; // for generics
|
||||
});
|
||||
|
||||
@ -19,7 +19,7 @@ typedef int (*LuaStyleFuncC)(VM*);
|
||||
if(vm->_c.error != nullptr) \
|
||||
return false;
|
||||
|
||||
static int count_extra_elements(VM* vm, int n){
|
||||
static int count_extra_elements(VM* vm, [[maybe_unused]] int n){
|
||||
if(vm->callstack.empty()){
|
||||
return vm->s_data.size();
|
||||
}
|
||||
|
||||
@ -10,7 +10,7 @@ struct Random{
|
||||
gen.seed(std::chrono::high_resolution_clock::now().time_since_epoch().count());
|
||||
}
|
||||
|
||||
static void _register(VM* vm, PyObject* mod, PyObject* type){
|
||||
static void _register(VM* vm, [[maybe_unused]] PyObject* mod, PyObject* type){
|
||||
vm->bind_default_constructor<Random>(type);
|
||||
|
||||
vm->bind_method<1>(type, "seed", [](VM* vm, ArgsView args) {
|
||||
|
||||
@ -15,7 +15,7 @@ namespace pkpy {
|
||||
buffer += '\n';
|
||||
int n = buffer.size();
|
||||
if(n>=need_more_lines){
|
||||
for(int i=buffer.size()-need_more_lines; i<buffer.size(); i++){
|
||||
for(int i=buffer.size()-need_more_lines; i< static_cast<int>(buffer.size()); i++){
|
||||
// no enough lines
|
||||
if(buffer[i] != '\n') return true;
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user