|
19 | 19 | #include "../../src/Reference.h"
|
20 | 20 | #include "../../src/Utils.h"
|
21 | 21 | #include "../../src/Value.h"
|
| 22 | +#include "PyHelper.hpp" |
22 | 23 | #include "PyReference.hpp"
|
23 | 24 |
|
24 | 25 | namespace script {
|
@@ -61,7 +62,7 @@ void valueConstructorCheck(PyObject* value) {
|
61 | 62 | std::string Local<ValueType>::describeUtf8() const { return asValue().describeUtf8(); }
|
62 | 63 |
|
63 | 64 | #define REF_IMPL_TO_VALUE(ValueType) \
|
64 |
| - Local<Value> Local<ValueType>::asValue() const { return Local<Value>(val_); } |
| 65 | + Local<Value> Local<ValueType>::asValue() const { return Local<Value>(py_backend::incRef(val_)); } |
65 | 66 |
|
66 | 67 | REF_IMPL_BASIC_FUNC(Value)
|
67 | 68 |
|
@@ -146,7 +147,7 @@ bool Local<Value>::isNumber() const { return PyNumber_Check(val_); }
|
146 | 147 |
|
147 | 148 | bool Local<Value>::isBoolean() const { return PyBool_Check(val_); }
|
148 | 149 |
|
149 |
| -bool Local<Value>::isFunction() const { return false; } |
| 150 | +bool Local<Value>::isFunction() const { return PyCallable_Check(val_); } |
150 | 151 |
|
151 | 152 | bool Local<Value>::isArray() const { return false; }
|
152 | 153 |
|
@@ -217,7 +218,26 @@ bool Local<Boolean>::value() const { return false; }
|
217 | 218 |
|
218 | 219 | Local<Value> Local<Function>::callImpl(const Local<Value>& thiz, size_t size,
|
219 | 220 | const Local<Value>* args) const {
|
220 |
| - return {}; |
| 221 | + // PyObject* self = thiz.isObject() ? py_interop::toPy(thiz) : nullptr; |
| 222 | + // TODO: self |
| 223 | + PyObject* ret = nullptr; |
| 224 | + // args to tuple |
| 225 | + if (size == 0) { |
| 226 | + ret = PyObject_CallNoArgs(py_interop::asPy(*this)); |
| 227 | + } else if (size == 1) { |
| 228 | + ret = PyObject_CallOneArg(py_interop::asPy(*this), py_interop::asPy(args[0])); |
| 229 | + } else { |
| 230 | + auto tuple = PyTuple_New(static_cast<Py_ssize_t>(size)); |
| 231 | + py_backend::checkException(); |
| 232 | + for (size_t i = 0; i < size; ++i) { |
| 233 | + PyTuple_SetItem(tuple, static_cast<Py_ssize_t>(i), py_interop::toPy(args[i])); |
| 234 | + py_backend::checkException(); |
| 235 | + } |
| 236 | + ret = PyObject_Call(py_interop::asPy(*this), tuple, nullptr); |
| 237 | + } |
| 238 | + |
| 239 | + py_backend::checkException(); |
| 240 | + return Local<Value>(ret); |
221 | 241 | }
|
222 | 242 |
|
223 | 243 | size_t Local<Array>::size() const { return 0; }
|
|
0 commit comments