diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/embind/embind.js | 30 | ||||
-rw-r--r-- | src/embind/emval.js | 17 |
2 files changed, 40 insertions, 7 deletions
diff --git a/src/embind/embind.js b/src/embind/embind.js index dfe4c014..d1508269 100644 --- a/src/embind/embind.js +++ b/src/embind/embind.js @@ -131,6 +131,7 @@ function extendError(baseErrorType, errorName) { // from https://github.com/imvu/imvujs/blob/master/src/function.js function createNamedFunction(name, body) { + name = makeLegalFunctionName(name); /*jshint evil:true*/ return new Function( "body", @@ -453,6 +454,33 @@ function __embind_register_emval(rawType, name) { }); } +function __embind_register_memory_view(rawType, name) { + var typeMapping = [ + Int8Array, + Uint8Array, + Int16Array, + Uint16Array, + Int32Array, + Uint32Array, + Float32Array, + Float64Array, + ]; + + name = readLatin1String(name); + registerType(rawType, { + name: name, + 'fromWireType': function(handle) { + var type = HEAP32[handle >> 2]; + var size = HEAP32[(handle >> 2) + 1]; // in elements + var data = HEAP32[(handle >> 2) + 2]; // byte offset into emscripten heap + _free(handle); + var TA = typeMapping[type]; + return new TA(HEAP8.buffer, data, size); + }, + destructorFunction: function(ptr) { _free(ptr); }, + }); +} + function runDestructors(destructors) { while (destructors.length) { var ptr = destructors.pop(); @@ -681,7 +709,7 @@ function __embind_finalize_tuple(rawTupleType) { }, 'toWireType': function(destructors, o) { if (elementsLength !== o.length) { - throw new TypeError("Incorrect number of tuple elements"); + throw new TypeError("Incorrect number of tuple elements for " + reg.name + ": expected=" + elementsLength + ", actual=" + o.length); } var ptr = rawConstructor(); for (var i = 0; i < elementsLength; ++i) { diff --git a/src/embind/emval.js b/src/embind/emval.js index bfce63b6..96024269 100644 --- a/src/embind/emval.js +++ b/src/embind/emval.js @@ -1,5 +1,6 @@ /*global Module, Runtime*/ /*global HEAP32*/ +/*global createNamedFunction*/ /*global readLatin1String, writeStringToMemory*/ /*global requireRegisteredType, throwBindingError*/ @@ -192,11 +193,14 @@ function parseParameters(argCount, argTypes, argWireTypes) { function __emval_call(handle, argCount, argTypes) { requireHandle(handle); + var types = lookupTypes(argCount, argTypes); + + var args = new Array(argCount); + for (var i = 0; i < argCount; ++i) { + args[i] = types[i].fromWireType(arguments[3 + i]); + } + var fn = _emval_handle_array[handle].value; - var args = parseParameters( - argCount, - argTypes, - Array.prototype.slice.call(arguments, 3)); var rv = fn.apply(undefined, args); return __emval_register(rv); } @@ -214,7 +218,8 @@ function lookupTypes(argCount, argTypes, argWireTypes) { function __emval_get_method_caller(argCount, argTypes) { var types = lookupTypes(argCount, argTypes); - return Runtime.addFunction(function(handle, name) { + var signatureName = types[0].name + "_$" + types.slice(1).map(function(t){return t.name;}).join("_") + "$"; + return Runtime.addFunction(createNamedFunction(signatureName, function(handle, name) { requireHandle(handle); name = getStringOrSymbol(name); @@ -225,7 +230,7 @@ function __emval_get_method_caller(argCount, argTypes) { var obj = _emval_handle_array[handle].value; return types[0].toWireType([], obj[name].apply(obj, args)); - }); + })); } function __emval_has_function(handle, name) { |