aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChad Austin <chad@imvu.com>2013-04-30 15:01:08 -0700
committerChad Austin <chad@imvu.com>2013-05-02 18:55:07 -0700
commit9607e5be25f12ac986436622bdd3b710505a596c (patch)
treeabefc96801dca8f0579b28ea8e46a038a7449245
parent54526667562b394f1c3673a48780b18000d798a6 (diff)
Add isAliasOf for seeing if two embind handles point to the same underlying object.
Conflicts: tests/embind/embind_test.cpp
-rwxr-xr-xsrc/embind/embind.js20
-rwxr-xr-xtests/embind/embind.test.js11
-rw-r--r--tests/embind/embind_test.cpp15
3 files changed, 39 insertions, 7 deletions
diff --git a/src/embind/embind.js b/src/embind/embind.js
index 78f54e31..cadee700 100755
--- a/src/embind/embind.js
+++ b/src/embind/embind.js
@@ -1061,8 +1061,24 @@ ClassHandle.prototype.isAliasOf = function(other) {
if (!(other instanceof ClassHandle)) {
return false;
}
- return this.$$.ptr == other.$$.ptr;
-}
+
+ var leftClass = this.$$.ptrType.registeredClass;
+ var left = this.$$.ptr;
+ var rightClass = other.$$.ptrType.registeredClass;
+ var right = other.$$.ptr;
+
+ while (leftClass.baseClass) {
+ left = leftClass.upcast(left);
+ leftClass = leftClass.baseClass;
+ }
+
+ while (rightClass.baseClass) {
+ right = rightClass.upcast(right);
+ rightClass = rightClass.baseClass;
+ }
+
+ return leftClass === rightClass && left === right;
+};
ClassHandle.prototype.clone = function() {
if (!this.$$.ptr) {
diff --git a/tests/embind/embind.test.js b/tests/embind/embind.test.js
index 812c3b8b..2f407471 100755
--- a/tests/embind/embind.test.js
+++ b/tests/embind/embind.test.js
@@ -1695,12 +1695,13 @@ module({
f.delete();
});
- BaseFixture.extend("smart pointers compare with raw", function() {
- // todo
- });
-
BaseFixture.extend("derived-with-offset types compare with base", function() {
- // todo
+ var e = new cm.DerivedWithOffset;
+ var f = cm.return_Base_from_DerivedWithOffset(e);
+ assert.true(e.isAliasOf(f));
+ assert.true(f.isAliasOf(e));
+ e.delete();
+ f.delete();
});
});
diff --git a/tests/embind/embind_test.cpp b/tests/embind/embind_test.cpp
index 48da45b8..21fbee65 100644
--- a/tests/embind/embind_test.cpp
+++ b/tests/embind/embind_test.cpp
@@ -2141,3 +2141,18 @@ EMSCRIPTEN_BINDINGS(constants) {
StructVector sv(1, 2, 3, 4);
constant("VALUE_STRUCT_CONSTANT", sv);
}
+
+class DerivedWithOffset : public DummyDataToTestPointerAdjustment, public Base {
+};
+
+std::shared_ptr<Base> return_Base_from_DerivedWithOffset(std::shared_ptr<DerivedWithOffset> ptr) {
+ return ptr;
+}
+
+EMSCRIPTEN_BINDINGS(with_adjustment) {
+ class_<DerivedWithOffset, base<Base>>("DerivedWithOffset")
+ .smart_ptr_constructor(&std::make_shared<DerivedWithOffset>)
+ ;
+
+ function("return_Base_from_DerivedWithOffset", &return_Base_from_DerivedWithOffset);
+}