2
2
are not Objects by creating a blank Object and setting Values to
3
3
it. Subclasses of Objects can only be set using an ObjectReference
4
4
by first casting it as an Object. */
5
-
5
+ # include " assert.h "
6
6
#include " napi.h"
7
7
#include " test_helper.h"
8
8
@@ -16,11 +16,146 @@ ObjectReference casted_weak;
16
16
ObjectReference casted_persistent;
17
17
ObjectReference casted_reference;
18
18
19
- // info[0] is the key, which can be either a string or a number.
20
- // info[1] is the value.
21
- // info[2] is a flag that differentiates whether the key is a
22
- // C string or a JavaScript string.
23
- void SetObjects (const CallbackInfo& info) {
19
+ // Set keys can be one of:
20
+ // C style string, std::string& utf8, and const char *
21
+
22
+ // Set values can be one of:
23
+ // Napi::Value
24
+ // napi_value (req static_cast)
25
+ // const char* (c style string)
26
+ // boolean
27
+ // double
28
+
29
+ enum VAL_TYPES { JS = 0 , C_STR, CPP_STR, BOOL, INT, DOUBLE, JS_CAST };
30
+
31
+ void MoveOperatorsTest (const Napi::CallbackInfo& info) {
32
+ Napi::ObjectReference existingRef;
33
+ Napi::ObjectReference existingRef2;
34
+ Napi::Object testObject = Napi::Object::New (info.Env ());
35
+ testObject.Set (" testProp" , " tProp" );
36
+
37
+ // ObjectReference(Reference<Object>&& other);
38
+ Napi::Reference<Napi::Object> refObj =
39
+ Napi::Reference<Napi::Object>::New (testObject);
40
+ Napi::ObjectReference objRef = std::move (refObj);
41
+ std::string prop = MaybeUnwrap (objRef.Get (" testProp" )).As <Napi::String>();
42
+ assert (prop == " tProp" );
43
+
44
+ // ObjectReference& operator=(Reference<Object>&& other);
45
+ Napi::Reference<Napi::Object> refObj2 =
46
+ Napi::Reference<Napi::Object>::New (testObject);
47
+ existingRef = std::move (refObj2);
48
+ prop = MaybeUnwrap (existingRef.Get (" testProp" )).As <Napi::String>();
49
+ assert (prop == " tProp" );
50
+
51
+ // ObjectReference(ObjectReference&& other);
52
+ Napi::ObjectReference objRef3 = std::move (existingRef);
53
+ prop = MaybeUnwrap (objRef3.Get (" testProp" )).As <Napi::String>();
54
+ assert (prop == " tProp" );
55
+
56
+ // ObjectReference& operator=(ObjectReference&& other);
57
+ existingRef2 = std::move (objRef3);
58
+ prop = MaybeUnwrap (objRef.Get (" testProp" )).As <Napi::String>();
59
+ assert (prop == " tProp" );
60
+ }
61
+
62
+ void SetObjectWithCStringKey (Napi::ObjectReference& obj,
63
+ Napi::Value key,
64
+ Napi::Value val,
65
+ int valType) {
66
+ std::string c_key = key.As <Napi::String>().Utf8Value ();
67
+ switch (valType) {
68
+ case JS:
69
+ obj.Set (c_key.c_str (), val);
70
+ break ;
71
+
72
+ case JS_CAST:
73
+ obj.Set (c_key.c_str (), static_cast <napi_value>(val));
74
+ break ;
75
+
76
+ case C_STR: {
77
+ std::string c_val = val.As <Napi::String>().Utf8Value ();
78
+ obj.Set (c_key.c_str (), c_val.c_str ());
79
+ break ;
80
+ }
81
+
82
+ case BOOL:
83
+ obj.Set (c_key.c_str (), val.As <Napi::Boolean>().Value ());
84
+ break ;
85
+
86
+ case DOUBLE:
87
+ obj.Set (c_key.c_str (), val.As <Napi::Number>().DoubleValue ());
88
+ break ;
89
+ }
90
+ }
91
+
92
+ void SetObjectWithCppStringKey (Napi::ObjectReference& obj,
93
+ Napi::Value key,
94
+ Napi::Value val,
95
+ int valType) {
96
+ std::string c_key = key.As <Napi::String>();
97
+ switch (valType) {
98
+ case JS:
99
+ obj.Set (c_key, val);
100
+ break ;
101
+
102
+ case JS_CAST:
103
+ obj.Set (c_key, static_cast <napi_value>(val));
104
+ break ;
105
+
106
+ case CPP_STR: {
107
+ std::string c_val = val.As <Napi::String>();
108
+ obj.Set (c_key, c_val);
109
+ break ;
110
+ }
111
+
112
+ case BOOL:
113
+ obj.Set (c_key, val.As <Napi::Boolean>().Value ());
114
+ break ;
115
+
116
+ case DOUBLE:
117
+ obj.Set (c_key, val.As <Napi::Number>().DoubleValue ());
118
+ break ;
119
+ }
120
+ }
121
+
122
+ void SetObjectWithIntKey (Napi::ObjectReference& obj,
123
+ Napi::Value key,
124
+ Napi::Value val,
125
+ int valType) {
126
+ uint32_t c_key = key.As <Napi::Number>().Uint32Value ();
127
+ switch (valType) {
128
+ case JS:
129
+ obj.Set (c_key, val);
130
+ break ;
131
+
132
+ case JS_CAST:
133
+ obj.Set (c_key, static_cast <napi_value>(val));
134
+ break ;
135
+
136
+ case C_STR: {
137
+ std::string c_val = val.As <Napi::String>();
138
+ obj.Set (c_key, c_val.c_str ());
139
+ break ;
140
+ }
141
+
142
+ case CPP_STR: {
143
+ std::string cpp_val = val.As <Napi::String>();
144
+ obj.Set (c_key, cpp_val);
145
+ break ;
146
+ }
147
+
148
+ case BOOL:
149
+ obj.Set (c_key, val.As <Napi::Boolean>().Value ());
150
+ break ;
151
+
152
+ case DOUBLE:
153
+ obj.Set (c_key, val.As <Napi::Number>().DoubleValue ());
154
+ break ;
155
+ }
156
+ }
157
+
158
+ void SetObject (const Napi::CallbackInfo& info) {
24
159
Env env = info.Env ();
25
160
HandleScope scope (env);
26
161
@@ -33,20 +168,35 @@ void SetObjects(const CallbackInfo& info) {
33
168
reference = Reference<Object>::New (Object::New (env), 2 );
34
169
reference.SuppressDestruct ();
35
170
36
- if (info[0 ].IsString ()) {
37
- if (info[2 ].As <String>() == String::New (env, " javascript" )) {
38
- weak.Set (info[0 ].As <String>(), info[1 ]);
39
- persistent.Set (info[0 ].As <String>(), info[1 ]);
40
- reference.Set (info[0 ].As <String>(), info[1 ]);
41
- } else {
42
- weak.Set (info[0 ].As <String>().Utf8Value (), info[1 ]);
43
- persistent.Set (info[0 ].As <String>().Utf8Value (), info[1 ]);
44
- reference.Set (info[0 ].As <String>().Utf8Value (), info[1 ]);
45
- }
46
- } else if (info[0 ].IsNumber ()) {
47
- weak.Set (info[0 ].As <Number>(), info[1 ]);
48
- persistent.Set (info[0 ].As <Number>(), info[1 ]);
49
- reference.Set (info[0 ].As <Number>(), info[1 ]);
171
+ Napi::Object configObject = info[0 ].As <Napi::Object>();
172
+
173
+ int keyType =
174
+ MaybeUnwrap (configObject.Get (" keyType" )).As <Napi::Number>().Uint32Value ();
175
+ int valType =
176
+ MaybeUnwrap (configObject.Get (" valType" )).As <Napi::Number>().Uint32Value ();
177
+ Napi::Value key = MaybeUnwrap (configObject.Get (" key" ));
178
+ Napi::Value val = MaybeUnwrap (configObject.Get (" val" ));
179
+
180
+ switch (keyType) {
181
+ case CPP_STR:
182
+ SetObjectWithCppStringKey (weak, key, val, valType);
183
+ SetObjectWithCppStringKey (persistent, key, val, valType);
184
+ SetObjectWithCppStringKey (reference, key, val, valType);
185
+ break ;
186
+
187
+ case C_STR:
188
+ SetObjectWithCStringKey (weak, key, val, valType);
189
+ SetObjectWithCStringKey (persistent, key, val, valType);
190
+ SetObjectWithCStringKey (reference, key, val, valType);
191
+ break ;
192
+
193
+ case INT:
194
+ SetObjectWithIntKey (weak, key, val, valType);
195
+ SetObjectWithIntKey (persistent, key, val, valType);
196
+ SetObjectWithIntKey (reference, key, val, valType);
197
+
198
+ default :
199
+ break ;
50
200
}
51
201
}
52
202
@@ -87,6 +237,53 @@ Value GetFromValue(const CallbackInfo& info) {
87
237
}
88
238
}
89
239
240
+ Value GetHelper (ObjectReference& ref,
241
+ Object& configObject,
242
+ const Napi::Env& env) {
243
+ int keyType =
244
+ MaybeUnwrap (configObject.Get (" keyType" )).As <Napi::Number>().Uint32Value ();
245
+ if (ref.IsEmpty ()) {
246
+ return String::New (env, " No referenced Value" );
247
+ }
248
+
249
+ switch (keyType) {
250
+ case C_STR: {
251
+ std::string c_key =
252
+ MaybeUnwrap (configObject.Get (" key" )).As <String>().Utf8Value ();
253
+ return MaybeUnwrap (ref.Get (c_key.c_str ()));
254
+ break ;
255
+ }
256
+ case CPP_STR: {
257
+ std::string cpp_key =
258
+ MaybeUnwrap (configObject.Get (" key" )).As <String>().Utf8Value ();
259
+ return MaybeUnwrap (ref.Get (cpp_key));
260
+ break ;
261
+ }
262
+ case INT: {
263
+ uint32_t key =
264
+ MaybeUnwrap (configObject.Get (" key" )).As <Number>().Uint32Value ();
265
+ return MaybeUnwrap (ref.Get (key));
266
+ break ;
267
+ }
268
+
269
+ default :
270
+ return String::New (env, " Error: Reached end of getter" );
271
+ break ;
272
+ }
273
+ }
274
+
275
+ Value GetFromGetters (const CallbackInfo& info) {
276
+ std::string object_req = info[0 ].As <String>();
277
+ Object configObject = info[1 ].As <Object>();
278
+ if (object_req == " weak" ) {
279
+ return GetHelper (weak, configObject, info.Env ());
280
+ } else if (object_req == " persistent" ) {
281
+ return GetHelper (persistent, configObject, info.Env ());
282
+ }
283
+
284
+ return GetHelper (reference, configObject, info.Env ());
285
+ }
286
+
90
287
// info[0] is a flag to determine if the weak, persistent, or
91
288
// multiple reference ObjectReference is being requested.
92
289
// info[1] is the key, and it be either a String or a Number.
@@ -207,13 +404,14 @@ Object InitObjectReference(Env env) {
207
404
Object exports = Object::New (env);
208
405
209
406
exports[" setCastedObjects" ] = Function::New (env, SetCastedObjects);
210
- exports[" setObjects " ] = Function::New (env, SetObjects );
407
+ exports[" setObject " ] = Function::New (env, SetObject );
211
408
exports[" getCastedFromValue" ] = Function::New (env, GetCastedFromValue);
212
- exports[" getFromGetter " ] = Function::New (env, GetFromGetter );
409
+ exports[" getFromGetters " ] = Function::New (env, GetFromGetters );
213
410
exports[" getCastedFromGetter" ] = Function::New (env, GetCastedFromGetter);
214
411
exports[" getFromValue" ] = Function::New (env, GetFromValue);
215
412
exports[" unrefObjects" ] = Function::New (env, UnrefObjects);
216
413
exports[" refObjects" ] = Function::New (env, RefObjects);
414
+ exports[" moveOpTest" ] = Function::New (env, MoveOperatorsTest);
217
415
218
416
return exports;
219
417
}
0 commit comments