From 068abe347f80e7c5d68d9cfb779a39c027fe7211 Mon Sep 17 00:00:00 2001 From: blueloveTH Date: Sat, 20 Jan 2024 23:21:42 +0800 Subject: [PATCH] update `Tuple`'s constructor --- 3rd/lua_bridge/src/lua_bridge.cpp | 2 +- include/pocketpy/common.h | 1 - include/pocketpy/tuplelist.h | 4 +++- src/modules.cpp | 2 +- src/pocketpy.cpp | 6 +++--- src/tuplelist.cpp | 12 +++++++++--- 6 files changed, 17 insertions(+), 10 deletions(-) diff --git a/3rd/lua_bridge/src/lua_bridge.cpp b/3rd/lua_bridge/src/lua_bridge.cpp index 6ac78a9b..7b48243c 100644 --- a/3rd/lua_bridge/src/lua_bridge.cpp +++ b/3rd/lua_bridge/src/lua_bridge.cpp @@ -172,7 +172,7 @@ struct PyLuaTable: PyLuaObject{ lua_rawgeti(_L, LUA_REGISTRYINDEX, self.r); List ret; table_apply(vm, [&](PyObject* key, PyObject* val){ - PyObject* item = VAR(Tuple({key, val})); + PyObject* item = VAR(Tuple(key, val)); ret.push_back(item); }); lua_pop(_L, 1); diff --git a/include/pocketpy/common.h b/include/pocketpy/common.h index 1a0ab2d1..478ca27e 100644 --- a/include/pocketpy/common.h +++ b/include/pocketpy/common.h @@ -13,7 +13,6 @@ #include #include #include -#include #include #include #include diff --git a/include/pocketpy/tuplelist.h b/include/pocketpy/tuplelist.h index 00449029..8d08266d 100644 --- a/include/pocketpy/tuplelist.h +++ b/include/pocketpy/tuplelist.h @@ -15,12 +15,14 @@ struct Tuple { int _size; Tuple(int n); - Tuple(std::initializer_list list); Tuple(const Tuple& other); Tuple(Tuple&& other) noexcept; Tuple(List&& other) noexcept; ~Tuple(); + Tuple(PyObject*, PyObject*); + Tuple(PyObject*, PyObject*, PyObject*); + bool is_inlined() const { return _args == _inlined; } PyObject*& operator[](int i){ return _args[i]; } PyObject* operator[](int i) const { return _args[i]; } diff --git a/src/modules.cpp b/src/modules.cpp index 5a6b9bdb..9cf47c3d 100644 --- a/src/modules.cpp +++ b/src/modules.cpp @@ -205,7 +205,7 @@ void add_module_math(VM* vm){ vm->bind_func<1>(mod, "modf", [](VM* vm, ArgsView args) { f64 i; f64 f = std::modf(CAST_F(args[0]), &i); - return VAR(Tuple({VAR(f), VAR(i)})); + return VAR(Tuple(VAR(f), VAR(i))); }); vm->bind_func<1>(mod, "factorial", [](VM* vm, ArgsView args) { diff --git a/src/pocketpy.cpp b/src/pocketpy.cpp index 135d4b32..bc9664f9 100644 --- a/src/pocketpy.cpp +++ b/src/pocketpy.cpp @@ -164,7 +164,7 @@ void init_builtins(VM* _vm) { i64 rhs = CAST(i64, args[1]); if(rhs == 0) vm->ZeroDivisionError(); auto res = std::div(lhs, rhs); - return VAR(Tuple({VAR(res.quot), VAR(res.rem)})); + return VAR(Tuple(VAR(res.quot), VAR(res.rem))); }else{ return vm->call_method(args[0], __divmod__, args[1]); } @@ -1056,7 +1056,7 @@ void init_builtins(VM* _vm) { MappingProxy& self = _CAST(MappingProxy&, args[0]); List items; for(auto& item : self.attr().items()){ - PyObject* t = VAR(Tuple({VAR(item.first.sv()), item.second})); + PyObject* t = VAR(Tuple(VAR(item.first.sv()), item.second)); items.push_back(std::move(t)); } return VAR(std::move(items)); @@ -1216,7 +1216,7 @@ void init_builtins(VM* _vm) { Tuple items(self.size()); int j = 0; self.apply([&](PyObject* k, PyObject* v){ - items[j++] = VAR(Tuple({k, v})); + items[j++] = VAR(Tuple(k, v)); }); return VAR(std::move(items)); }); diff --git a/src/tuplelist.cpp b/src/tuplelist.cpp index 2dec9c8f..708e7ff1 100644 --- a/src/tuplelist.cpp +++ b/src/tuplelist.cpp @@ -33,9 +33,15 @@ Tuple::Tuple(List&& other) noexcept { other._data = nullptr; } -Tuple::Tuple(std::initializer_list list): Tuple(list.size()){ - int i = 0; - for(PyObject* obj: list) _args[i++] = obj; +Tuple::Tuple(PyObject* _0, PyObject* _1): Tuple(2){ + _args[0] = _0; + _args[1] = _1; +} + +Tuple::Tuple(PyObject* _0, PyObject* _1, PyObject* _2): Tuple(3){ + _args[0] = _0; + _args[1] = _1; + _args[2] = _2; } Tuple::~Tuple(){ if(!is_inlined()) pool64_dealloc(_args); }