15
15
* limitations under the License.
16
16
*/
17
17
18
- #include < ScriptX/ScriptX.h>
18
+ #include " ../../src/Native.hpp"
19
+ #include " ../../src/Reference.h"
20
+ #include " ../../src/Utils.h"
21
+ #include " ../../src/Value.h"
22
+ #include " PyReference.hpp"
19
23
20
24
namespace script {
21
25
22
- #define REF_IMPL_BASIC_FUNC (ValueType ) \
23
- Local<ValueType>::Local(const Local<ValueType>& copy) : val_(copy.val_) {} \
24
- Local<ValueType>::Local(Local<ValueType>&& move) noexcept : val_(move.val_) {} \
25
- Local<ValueType>::~Local () {} \
26
- Local<ValueType>& Local<ValueType>::operator =(const Local& from) { \
27
- Local (from).swap (*this ); \
28
- return *this ; \
29
- } \
30
- Local<ValueType>& Local<ValueType>::operator =(Local&& move) noexcept { \
31
- Local (std::move (move)).swap (*this ); \
32
- return *this ; \
33
- } \
26
+ namespace py_backend {
27
+ void valueConstructorCheck (PyObject* value) {
28
+ SCRIPTX_UNUSED (value);
29
+ #ifndef NDEBUG
30
+ if (!value) throw Exception (" null reference" );
31
+ #endif
32
+ }
33
+ } // namespace py_backend
34
+
35
+ #define REF_IMPL_BASIC_FUNC (ValueType ) \
36
+ Local<ValueType>::Local(const Local<ValueType>& copy) : val_(py_backend::incRef(copy.val_)) {} \
37
+ Local<ValueType>::Local(Local<ValueType>&& move) noexcept : val_(move.val_) { \
38
+ move.val_ = nullptr ; \
39
+ } \
40
+ Local<ValueType>::~Local () { py_backend::decRef (val_); } \
41
+ Local<ValueType>& Local<ValueType>::operator =(const Local& from) { \
42
+ Local (from).swap (*this ); \
43
+ return *this ; \
44
+ } \
45
+ Local<ValueType>& Local<ValueType>::operator =(Local&& move) noexcept { \
46
+ Local (std::move (move)).swap (*this ); \
47
+ return *this ; \
48
+ } \
34
49
void Local<ValueType>::swap(Local& rhs) noexcept { std::swap (val_, rhs.val_ ); }
35
50
36
51
#define REF_IMPL_BASIC_EQUALS (ValueType ) \
@@ -39,12 +54,14 @@ namespace script {
39
54
}
40
55
41
56
#define REF_IMPL_BASIC_NOT_VALUE (ValueType ) \
42
- Local<ValueType>::Local(InternalLocalRef val) : val_(val) {} \
57
+ Local<ValueType>::Local(InternalLocalRef val) : val_(val) { \
58
+ py_backend::valueConstructorCheck (val); \
59
+ } \
43
60
Local<String> Local<ValueType>::describe() const { return asValue ().describe (); } \
44
61
std::string Local<ValueType>::describeUtf8() const { return asValue ().describeUtf8 (); }
45
62
46
63
#define REF_IMPL_TO_VALUE (ValueType ) \
47
- Local<Value> Local<ValueType>::asValue() const { return Local<Value>(/* TMPL: value */ ); }
64
+ Local<Value> Local<ValueType>::asValue() const { return Local<Value>(val_ ); }
48
65
49
66
REF_IMPL_BASIC_FUNC (Value)
50
67
@@ -92,11 +109,14 @@ REF_IMPL_TO_VALUE(Unsupported)
92
109
93
110
Local<Value>::Local() noexcept : val_() {}
94
111
95
- Local<Value>::Local(InternalLocalRef v8Local ) : val_(v8Local ) {}
112
+ Local<Value>::Local(InternalLocalRef ref ) : val_(ref ) {}
96
113
97
- bool Local<Value>::isNull() const { return false ; }
114
+ bool Local<Value>::isNull() const { return val_ == nullptr ; }
98
115
99
- void Local<Value>::reset() {}
116
+ void Local<Value>::reset() {
117
+ py_backend::decRef (val_);
118
+ val_ = nullptr ;
119
+ }
100
120
101
121
ValueKind Local<Value>::getKind() const {
102
122
if (isNull ()) {
@@ -122,9 +142,9 @@ ValueKind Local<Value>::getKind() const {
122
142
123
143
bool Local<Value>::isString() const { return false ; }
124
144
125
- bool Local<Value>::isNumber() const { return false ; }
145
+ bool Local<Value>::isNumber() const { return PyNumber_Check (val_) ; }
126
146
127
- bool Local<Value>::isBoolean() const { return false ; }
147
+ bool Local<Value>::isBoolean() const { return PyBool_Check (val_) ; }
128
148
129
149
bool Local<Value>::isFunction() const { return false ; }
130
150
0 commit comments