aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChad Austin <chad@imvu.com>2014-05-08 21:52:21 -0700
committerBruce Mitchener <bruce.mitchener@gmail.com>2014-05-21 22:59:01 +0700
commit3147a2175cc90c1ceca368979bad72870b02561b (patch)
treea502276fa160ddf7937782ffd05a6c3ce47d0149
parentc75048adf764b9f14ed7a91dc46dfaee66dcbf3a (diff)
handle some scenarios where you mix delete() and deleteLater()
-rw-r--r--src/embind/embind.js5
-rw-r--r--tests/embind/embind.test.js26
2 files changed, 28 insertions, 3 deletions
diff --git a/src/embind/embind.js b/src/embind/embind.js
index f9bfa9e8..27fa87b8 100644
--- a/src/embind/embind.js
+++ b/src/embind/embind.js
@@ -1322,8 +1322,7 @@ ClassHandle.prototype['delete'] = function ClassHandle_delete() {
throwInstanceAlreadyDeleted(this);
}
- // TODO: test for multiple deleteLater() on JS instance handle
- if (this.$$.deleteScheduled) {
+ if (this.$$.deleteScheduled && !this.$$.preservePointerOnDelete) {
throwBindingError('Object already scheduled for deletion');
}
@@ -1348,7 +1347,7 @@ ClassHandle.prototype['deleteLater'] = function deleteLater() {
if (!this.$$.ptr) {
throwInstanceAlreadyDeleted(this);
}
- if (this.$$.deleteScheduled) {
+ if (this.$$.deleteScheduled && !this.$$.preservePointerOnDelete) {
throwBindingError('Object already scheduled for deletion');
}
deletionQueue.push(this);
diff --git a/tests/embind/embind.test.js b/tests/embind/embind.test.js
index b174b52d..bc0a6154 100644
--- a/tests/embind/embind.test.js
+++ b/tests/embind/embind.test.js
@@ -1799,6 +1799,32 @@ module({
assert.equal(impl, rv);
rv.delete();
});
+
+ test("deleteLater() works for JavaScript implementations", function() {
+ var parent = cm.HeldAbstractClass;
+ var C = parent.extend("C", {
+ method: function() {
+ }
+ });
+ var impl = new C;
+ var rv = cm.passHeldAbstractClass(impl);
+ impl.deleteLater();
+ rv.deleteLater();
+ cm.flushPendingDeletes();
+ });
+
+ test("deleteLater() combined with delete() works for JavaScript implementations", function() {
+ var parent = cm.HeldAbstractClass;
+ var C = parent.extend("C", {
+ method: function() {
+ }
+ });
+ var impl = new C;
+ var rv = cm.passHeldAbstractClass(impl);
+ impl.deleteLater();
+ rv.delete();
+ cm.flushPendingDeletes();
+ });
});
BaseFixture.extend("registration order", function() {