@@ -108,6 +108,9 @@ struct ValueHolder {
108
108
void setPtr (Value* v) {
109
109
valuePtr = v;
110
110
}
111
+ Value* getPtrConst () const {
112
+ return valuePtr;
113
+ }
111
114
static Value* staticGetPtr () {
112
115
static Value v;
113
116
return &v;
@@ -265,6 +268,7 @@ int main() {
265
268
266
269
console.log (" valueHolder.valueReference" );
267
270
valueProp = valueHolder.valueReference ;
271
+ assert (valueProp instanceof Module.Value );
268
272
// Check that both references are updated.
269
273
valueProp.setName (" reference" );
270
274
valueProp = valueHolder.valueReference ;
@@ -295,6 +299,72 @@ int main() {
295
299
Module.assertDestructed (1 );
296
300
Module.assertAllCountsZero ();
297
301
302
+ console.log (" valueHolder.getterValueDefault" );
303
+ valueProp = valueHolder.getterValueDefault ;
304
+ assert (valueProp instanceof Module.Value );
305
+ valueProp.delete ();
306
+ // TODO: Investigate if this can be made to only create one copy. The getter
307
+ // wrapper appears to create an extra copy.
308
+ Module.assertCopy (2 );
309
+ Module.assertDestructed (2 );
310
+ Module.assertAllCountsZero ();
311
+
312
+ console.log (" valueHolder.getterValueTakeOwnership" );
313
+ valueProp = valueHolder.getterValueTakeOwnership ;
314
+ assert (valueProp instanceof Module.Value );
315
+ valueProp.delete ();
316
+ // TODO: Investigate if the copy can be removed.
317
+ Module.assertCopy (1 );
318
+ Module.assertMove (1 );
319
+ Module.assertDestructed (2 );
320
+ Module.assertAllCountsZero ();
321
+
322
+ console.log (" valueHolder.getterValuePtrTakeOwnership" );
323
+ valueProp = valueHolder.getterValuePtrTakeOwnership ;
324
+ assert (valueProp instanceof Module.Value );
325
+ Module.assertAllCountsZero ();
326
+
327
+ console.log (" valueHolder.getterValuePtrReference" );
328
+ valueProp = valueHolder.getterValuePtrReference ;
329
+ assert (valueProp instanceof Module.Value );
330
+ Module.assertAllCountsZero ();
331
+
332
+ console.log (" valueHolder.getterSetterValueDefault" );
333
+ valueProp = valueHolder.getterSetterValueDefault ;
334
+ assert (valueProp instanceof Module.Value );
335
+ valueProp.delete ();
336
+ // TODO: Investigate if this can be made to only create one copy. The getter
337
+ // wrapper appears to create an extra copy.
338
+ Module.assertCopy (2 );
339
+ Module.assertDestructed (2 );
340
+ Module.assertAllCountsZero ();
341
+
342
+ console.log (" valueHolder.getterSetterValueTakeOwnership" );
343
+ valueProp = valueHolder.getterSetterValueTakeOwnership ;
344
+ assert (valueProp instanceof Module.Value );
345
+ valueProp.delete ();
346
+ // TODO: Investigate if the copy can be removed.
347
+ Module.assertCopy (1 );
348
+ Module.assertMove (1 );
349
+ Module.assertDestructed (2 );
350
+ Module.assertAllCountsZero ();
351
+
352
+ console.log (" valueHolder.getterSetterPtrReference" );
353
+ valueHolder.initializeValuePtr ();
354
+ valueProp = valueHolder.getterSetterPtrReference ;
355
+ assert (valueProp instanceof Module.Value );
356
+ Module.assertDefault (1 );
357
+ Module.assertAllCountsZero ();
358
+
359
+ console.log (" valueHolder.getterSetterPtrTakeOwnership" );
360
+ valueHolder.initializeValuePtr ();
361
+ valueProp = valueHolder.getterSetterPtrTakeOwnership ;
362
+ assert (valueProp instanceof Module.Value );
363
+ valueProp.delete ();
364
+ Module.assertDefault (1 );
365
+ Module.assertDestructed (1 );
366
+ Module.assertAllCountsZero ();
367
+
298
368
valueHolder.delete ();
299
369
);
300
370
}
@@ -341,16 +411,30 @@ EMSCRIPTEN_BINDINGS(xxx) {
341
411
.property (" valueTakeOwnership" , &ValueHolder::value, return_value_policy::take_ownership ())
342
412
343
413
// Test binding raw pointers with the various methods.
414
+ // Skip the test for default since that is forbidden.
344
415
.property (" valuePtrReference" , &ValueHolder::valuePtr, return_value_policy::reference ())
345
416
.property (" valuePtrTakeOwnership" , &ValueHolder::valuePtr, return_value_policy::take_ownership ())
346
417
347
- // Check that compiling with getter and setter methods works as expected.
348
- // These are only tested for compilation since they use the same underlying
349
- // mechanisms as the other property bindings.
350
- // Getter only.
351
- .property (" getterValue" , &ValueHolder::get, return_value_policy::reference ())
352
- // Getter and setter.
353
- .property (" getterSetterValue" , &ValueHolder::get, &ValueHolder::set, return_value_policy::reference ())
418
+ // Getter method only with value.
419
+ .property (" getterValueDefault" , &ValueHolder::get)
420
+ // Skip the test for rvp::reference since that is forbidden.
421
+ .property (" getterValueTakeOwnership" , &ValueHolder::get, return_value_policy::take_ownership ())
422
+
423
+ // Getter method only with pointer.
424
+ // Skip the test for default since that is not allowed.
425
+ .property (" getterValuePtrReference" , &ValueHolder::getPtrConst, return_value_policy::reference ())
426
+ .property (" getterValuePtrTakeOwnership" , &ValueHolder::getPtrConst, return_value_policy::take_ownership ())
427
+
428
+ // Getter and setter with value.
429
+ .property (" getterSetterValueDefault" , &ValueHolder::get, &ValueHolder::set)
430
+ // Skip the test for rvp::reference since that is forbidden.
431
+ .property (" getterSetterValueTakeOwnership" , &ValueHolder::get, &ValueHolder::set, return_value_policy::take_ownership ())
432
+
433
+ // Getter and setter with pointer.
434
+ // Skip the test for default since that is not allowed.
435
+ .property (" getterSetterPtrReference" , &ValueHolder::getPtrConst, &ValueHolder::setPtr, return_value_policy::reference ())
436
+ .property (" getterSetterPtrTakeOwnership" , &ValueHolder::getPtrConst, &ValueHolder::setPtr, return_value_policy::take_ownership ())
437
+
354
438
// std::function getter.
355
439
.property (" getterPtrWithStdFunctionReference" , std::function<const Value*(const ValueHolder&)>(&value_holder), return_value_policy::reference ())
356
440
;
0 commit comments