Skip to content

Commit 3459932

Browse files
Chad Austinwaywardmonkeys
Chad Austin
authored andcommitted
Fix a bug where a returned handle to a derived JS object would not always correctly increment the reference count of the underlying smart pointer.
1 parent 876ae8a commit 3459932

File tree

2 files changed

+13
-3
lines changed

2 files changed

+13
-3
lines changed

src/embind/embind.js

+12-3
Original file line numberDiff line numberDiff line change
@@ -1216,9 +1216,18 @@ RegisteredPointer.prototype['fromWireType'] = function fromWireType(ptr) {
12161216

12171217
var registeredInstance = getInheritedInstance(this.registeredClass, rawPointer);
12181218
if (undefined !== registeredInstance) {
1219-
var rv = registeredInstance['clone']();
1220-
this.destructor(ptr);
1221-
return rv;
1219+
// JS object has been neutered, time to repopulate it
1220+
if (0 === registeredInstance.$$.count.value) {
1221+
registeredInstance.$$.ptr = rawPointer;
1222+
registeredInstance.$$.smartPtr = ptr;
1223+
return registeredInstance['clone']();
1224+
} else {
1225+
// else, just increment reference count on existing object
1226+
// it already has a reference to the smart pointer
1227+
var rv = registeredInstance['clone']();
1228+
this.destructor(ptr);
1229+
return rv;
1230+
}
12221231
}
12231232

12241233
function makeDefaultHandle() {

tests/embind/embind.test.js

+1
Original file line numberDiff line numberDiff line change
@@ -2410,6 +2410,7 @@ module({
24102410
var back = holder.get();
24112411
assert.equal(back, instance);
24122412
holder.delete();
2413+
back.delete();
24132414
});
24142415
});
24152416

0 commit comments

Comments
 (0)