aboutsummaryrefslogtreecommitdiff
path: root/src/embind/embind.js
diff options
context:
space:
mode:
authorjinsuck <jkim@imvu.com>2013-04-12 13:00:26 -0700
committerJukka Jylänki <jujjyl@gmail.com>2013-04-18 20:08:12 +0300
commita9539326b89fec17dfe7fb4315eb5d256a1afcf6 (patch)
tree56c2175112b78f4735fe26da8a75c8735d75ea07 /src/embind/embind.js
parente9cd9155f8617581a8e96187eef6a5869cf9eb5f (diff)
Replace Pointer_stringify() with something simpler and faster. The "String.fromCharCode" can be a performance bottleneck if called a lot, like 50,000 times per second. Depending on application it can be necessary. A better solution is not converting from HEAP at all, but it requires more work.
Diffstat (limited to 'src/embind/embind.js')
-rwxr-xr-xsrc/embind/embind.js61
1 files changed, 39 insertions, 22 deletions
diff --git a/src/embind/embind.js b/src/embind/embind.js
index 81af76db..9afbf2fb 100755
--- a/src/embind/embind.js
+++ b/src/embind/embind.js
@@ -1,7 +1,7 @@
/*global Module*/
/*global _malloc, _free, _memcpy*/
/*global FUNCTION_TABLE, HEAP8, HEAPU8, HEAP16, HEAPU16, HEAP32, HEAPU32*/
-/*global Pointer_stringify*/
+/*global readLatin1String*/
/*global __emval_register, _emval_handle_array, __emval_decref*/
/*global ___getTypeName*/
@@ -223,9 +223,26 @@ function whenDependentTypesAreResolved(myTypes, dependentTypes, getTypeConverter
}
}
+var __charCodes = [];
+
+function readLatin1String(ptr) {
+ if (__charCodes.length === 0) {
+ for (var charCodeI = 0; charCodeI < 127; charCodeI++) {
+ __charCodes.push(String.fromCharCode(charCodeI));
+ }
+ }
+
+ var ret = "";
+ var c = ptr;
+ while (HEAPU8[c]) {
+ ret += __charCodes[HEAPU8[c++]];
+ }
+ return ret;
+}
+
function getTypeName(type) {
var ptr = ___getTypeName(type);
- var rv = Pointer_stringify(ptr);
+ var rv = readLatin1String(ptr);
_free(ptr);
return rv;
}
@@ -247,7 +264,7 @@ function requireRegisteredType(rawType, humanName) {
}
function __embind_register_void(rawType, name) {
- name = Pointer_stringify(name);
+ name = readLatin1String(name);
registerType(rawType, {
name: name,
fromWireType: function() {
@@ -257,7 +274,7 @@ function __embind_register_void(rawType, name) {
}
function __embind_register_bool(rawType, name, trueValue, falseValue) {
- name = Pointer_stringify(name);
+ name = readLatin1String(name);
registerType(rawType, {
name: name,
fromWireType: function(wt) {
@@ -274,7 +291,7 @@ function __embind_register_bool(rawType, name, trueValue, falseValue) {
// When converting a number from JS to C++ side, the valid range of the number is
// [minRange, maxRange], inclusive.
function __embind_register_integer(primitiveType, name, minRange, maxRange) {
- name = Pointer_stringify(name);
+ name = readLatin1String(name);
if (maxRange === -1) { // LLVM doesn't have signed and unsigned 32-bit types, so u32 literals come out as 'i32 -1'. Always treat those as max u32.
maxRange = 4294967295;
}
@@ -300,7 +317,7 @@ function __embind_register_integer(primitiveType, name, minRange, maxRange) {
}
function __embind_register_float(rawType, name) {
- name = Pointer_stringify(name);
+ name = readLatin1String(name);
registerType(rawType, {
name: name,
fromWireType: function(value) {
@@ -318,7 +335,7 @@ function __embind_register_float(rawType, name) {
}
function __embind_register_std_string(rawType, name) {
- name = Pointer_stringify(name);
+ name = readLatin1String(name);
registerType(rawType, {
name: name,
fromWireType: function(value) {
@@ -350,7 +367,7 @@ function __embind_register_std_string(rawType, name) {
}
function __embind_register_std_wstring(rawType, charSize, name) {
- name = Pointer_stringify(name);
+ name = readLatin1String(name);
var HEAP, shift;
if (charSize === 2) {
HEAP = HEAPU16;
@@ -387,7 +404,7 @@ function __embind_register_std_wstring(rawType, charSize, name) {
}
function __embind_register_emval(rawType, name) {
- name = Pointer_stringify(name);
+ name = readLatin1String(name);
registerType(rawType, {
name: name,
fromWireType: function(handle) {
@@ -432,7 +449,7 @@ function makeInvoker(name, argCount, argTypes, invoker, fn) {
function __embind_register_function(name, argCount, rawArgTypesAddr, rawInvoker, fn) {
var argTypes = heap32VectorToArray(argCount, rawArgTypesAddr);
- name = Pointer_stringify(name);
+ name = readLatin1String(name);
rawInvoker = FUNCTION_TABLE[rawInvoker];
exposePublicSymbol(name, function() {
@@ -449,7 +466,7 @@ var tupleRegistrations = {};
function __embind_register_tuple(rawType, name, rawConstructor, rawDestructor) {
tupleRegistrations[rawType] = {
- name: Pointer_stringify(name),
+ name: readLatin1String(name),
rawConstructor: FUNCTION_TABLE[rawConstructor],
rawDestructor: FUNCTION_TABLE[rawDestructor],
elements: [],
@@ -538,7 +555,7 @@ function __embind_register_struct(
rawDestructor
) {
structRegistrations[rawType] = {
- name: Pointer_stringify(name),
+ name: readLatin1String(name),
rawConstructor: FUNCTION_TABLE[rawConstructor],
rawDestructor: FUNCTION_TABLE[rawDestructor],
fields: [],
@@ -556,7 +573,7 @@ function __embind_register_struct_field(
setterContext
) {
structRegistrations[structType].fields.push({
- fieldName: Pointer_stringify(fieldName),
+ fieldName: readLatin1String(fieldName),
getterReturnType: getterReturnType,
getter: FUNCTION_TABLE[getter],
getterContext: getterContext,
@@ -913,7 +930,7 @@ function __embind_register_class(
name,
rawDestructor
) {
- name = Pointer_stringify(name);
+ name = readLatin1String(name);
rawDestructor = FUNCTION_TABLE[rawDestructor];
getActualType = FUNCTION_TABLE[getActualType];
upcast = FUNCTION_TABLE[upcast];
@@ -1097,7 +1114,7 @@ function __embind_register_class_function(
context
) {
var rawArgTypes = heap32VectorToArray(argCount, rawArgTypesAddr);
- methodName = Pointer_stringify(methodName);
+ methodName = readLatin1String(methodName);
rawInvoker = FUNCTION_TABLE[rawInvoker];
whenDependentTypesAreResolved([], [rawClassType], function(classType) {
@@ -1163,7 +1180,7 @@ function __embind_register_class_class_function(
fn
) {
var rawArgTypes = heap32VectorToArray(argCount, rawArgTypesAddr);
- methodName = Pointer_stringify(methodName);
+ methodName = readLatin1String(methodName);
rawInvoker = FUNCTION_TABLE[rawInvoker];
whenDependentTypesAreResolved([], [rawClassType], function(classType) {
classType = classType[0];
@@ -1209,7 +1226,7 @@ function __embind_register_class_property(
setter,
setterContext
) {
- fieldName = Pointer_stringify(fieldName);
+ fieldName = readLatin1String(fieldName);
getter = FUNCTION_TABLE[getter];
setter = FUNCTION_TABLE[setter];
@@ -1274,7 +1291,7 @@ function __embind_register_smart_ptr(
rawShare,
rawDestructor
) {
- name = Pointer_stringify(name);
+ name = readLatin1String(name);
rawGetPointee = FUNCTION_TABLE[rawGetPointee];
rawConstructor = FUNCTION_TABLE[rawConstructor];
rawShare = FUNCTION_TABLE[rawShare];
@@ -1304,7 +1321,7 @@ function __embind_register_enum(
rawType,
name
) {
- name = Pointer_stringify(name);
+ name = readLatin1String(name);
function constructor() {
}
@@ -1329,7 +1346,7 @@ function __embind_register_enum_value(
enumValue
) {
var enumType = requireRegisteredType(rawEnumType, 'enum');
- name = Pointer_stringify(name);
+ name = readLatin1String(name);
var Enum = enumType.constructor;
@@ -1347,7 +1364,7 @@ function __embind_register_interface(
rawConstructor,
rawDestructor
) {
- name = Pointer_stringify(name);
+ name = readLatin1String(name);
rawConstructor = FUNCTION_TABLE[rawConstructor];
rawDestructor = FUNCTION_TABLE[rawDestructor];
@@ -1365,7 +1382,7 @@ function __embind_register_interface(
}
function __embind_register_constant(name, type, value) {
- name = Pointer_stringify(name);
+ name = readLatin1String(name);
whenDependentTypesAreResolved([], [type], function(type) {
type = type[0];
Module[name] = type.fromWireType(value);