aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChad Austin <chad@imvu.com>2013-03-13 01:18:04 -0700
committerJukka Jylänki <jujjyl@gmail.com>2013-04-12 14:25:50 +0300
commit0badaf9b00289ffd204b88c8875f442822b1b704 (patch)
treed291c1c0e563247b90e300755462d8c8641edfb9
parent7c49e9f8866314d688b07f99abb34ccdac442db3 (diff)
Allow smart pointers to have their actual type names.
-rwxr-xr-xsrc/embind/embind.js29
-rwxr-xr-xsystem/include/emscripten/bind.h2
2 files changed, 19 insertions, 12 deletions
diff --git a/src/embind/embind.js b/src/embind/embind.js
index c52c6e4d..de6826aa 100755
--- a/src/embind/embind.js
+++ b/src/embind/embind.js
@@ -522,8 +522,8 @@ RegisteredPointer.prototype.toWireType = function(destructors, handle) {
return 0;
}
}
- if (!(handle instanceof ClassHandle)) {
- throwBindingError('Expected pointer or null, got ' + IMVU.repr(handle));
+ if (!(handle instanceof this.registeredClass.constructor)) {
+ throwBindingError('Expected null or instance of ' + this.name + ', got ' + IMVU.repr(handle));
}
if (this.isSmartPointer && undefined === handle.$$.smartPtr) {
throwBindingError('Passing raw pointer to smart pointer is illegal');
@@ -645,6 +645,7 @@ function ClassHandle() {
function RegisteredClass(
name,
+ constructor,
isPolymorphic,
baseClassRawType,
baseClass,
@@ -652,6 +653,7 @@ function RegisteredClass(
downcast
) {
this.name = name;
+ this.constructor = constructor;
this.isPolymorphic = isPolymorphic;
this.baseClassRawType = baseClassRawType;
this.baseClass = baseClass;
@@ -690,14 +692,6 @@ function __embind_register_class(
basePrototype = ClassHandle.prototype;
}
- var registeredClass = new RegisteredClass(
- name,
- isPolymorphic,
- baseClassRawType,
- baseClass,
- upcast,
- downcast);
-
var Handle = createNamedFunction(name, function(registeredPointer, ptr) {
Object.defineProperty(this, '$$', {
value: {
@@ -709,6 +703,15 @@ function __embind_register_class(
});
});
+ var registeredClass = new RegisteredClass(
+ name,
+ Handle,
+ isPolymorphic,
+ baseClassRawType,
+ baseClass,
+ upcast,
+ downcast);
+
Handle.prototype = Object.create(basePrototype, {
constructor: { value: Handle },
});
@@ -948,6 +951,10 @@ function __embind_register_class_property(
});
}
+function makeLegalFunctionName(name) {
+ return '_' + name.replace(/[^a-zA-Z0-9_]/g, '$');
+}
+
function __embind_register_smart_ptr(
rawType,
rawPointeeType,
@@ -967,7 +974,7 @@ function __embind_register_smart_ptr(
whenDependentTypesAreResolved([rawPointeeType], function(pointeeType) {
pointeeType = pointeeType[0];
- var Handle = createNamedFunction(name, function(registeredPointer, ptr) {
+ var Handle = createNamedFunction(makeLegalFunctionName(name), function(registeredPointer, ptr) {
Object.defineProperty(this, '$$', {
value: {
registeredPointer: registeredPointer,
diff --git a/system/include/emscripten/bind.h b/system/include/emscripten/bind.h
index 6f6a6255..f06ca69c 100755
--- a/system/include/emscripten/bind.h
+++ b/system/include/emscripten/bind.h
@@ -731,7 +731,7 @@ namespace emscripten {
_embind_register_smart_ptr(
TypeID<PointerType>::get(),
TypeID<PointeeType>::get(),
- "SmartPtr", // TODO: generate unique name, if one is needed at all
+ typeid(PointerType).name(),
PointerTrait::get_sharing_policy(),
reinterpret_cast<GenericFunction>(&PointerTrait::get),
reinterpret_cast<GenericFunction>(&operator_new<PointerType>),