diff options
author | Chad Austin <chad@imvu.com> | 2013-03-13 01:18:04 -0700 |
---|---|---|
committer | Jukka Jylänki <jujjyl@gmail.com> | 2013-04-12 14:25:50 +0300 |
commit | 0badaf9b00289ffd204b88c8875f442822b1b704 (patch) | |
tree | d291c1c0e563247b90e300755462d8c8641edfb9 | |
parent | 7c49e9f8866314d688b07f99abb34ccdac442db3 (diff) |
Allow smart pointers to have their actual type names.
-rwxr-xr-x | src/embind/embind.js | 29 | ||||
-rwxr-xr-x | system/include/emscripten/bind.h | 2 |
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>), |