aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/embind/embind.js30
-rw-r--r--src/embind/emval.js17
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) {