aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/intertyper.js40
-rw-r--r--src/jsifier.js3
-rw-r--r--src/parseTools.js9
-rw-r--r--tests/runner.py26
4 files changed, 38 insertions, 40 deletions
diff --git a/src/intertyper.js b/src/intertyper.js
index 1db3cf88..ed8d5099 100644
--- a/src/intertyper.js
+++ b/src/intertyper.js
@@ -461,22 +461,18 @@ function intertyper(data, parseFunctions, baseLineNum) {
item.tokens = item.tokens.filter(function(token) {
return !(token.text in LLVM.LINKAGES || token.text in LLVM.PARAM_ATTR || token.text in set('hidden', 'nounwind', 'define', 'inlinehint', '{') || token.text in LLVM.CALLING_CONVENTIONS);
});
- var ret = {
+ var params = parseParamTokens(item.tokens[2].item.tokens);
+ return [{
intertype: 'function',
ident: toNiceIdent(item.tokens[1].text),
returnType: item.tokens[0].text,
- params: parseParamTokens(item.tokens[2].item.tokens),
- lineNum: item.lineNum
- };
- ret.hasVarArgs = false;
- ret.paramIdents = ret.params.map(function(param) {
- if (param.intertype == 'varargs') {
- ret.hasVarArgs = true;
- return null;
- }
- return toNiceIdent(param.ident);
- }).filter(function(param) { return param != null });;
- return [ret];
+ params: params,
+ hasVarArgs: hasVarArgs(params),
+ lineNum: item.lineNum,
+ paramIdents: params.map(function(param) {
+ return (param.intertype == 'varargs') ? null : toNiceIdent(param.ident);
+ }).filter(function(param) { return param != null; })
+ }];
}
});
// label
@@ -799,23 +795,15 @@ function intertyper(data, parseFunctions, baseLineNum) {
item.tokens.splice(1, 1);
}
- var ret = {
+ var params = parseParamTokens(item.tokens[3].item.tokens);
+ return [{
intertype: 'functionStub',
ident: toNiceIdent(item.tokens[2].text),
returnType: item.tokens[1],
- params: parseParamTokens(item.tokens[3].item.tokens),
- hasVarArgs: false,
+ params: params,
+ hasVarArgs: hasVarArgs(params),
lineNum: item.lineNum
- };
-
- for (var i = 0; i < ret.params.length; i++) {
- if (ret.params[i].intertype == 'varargs') {
- ret.hasVarArgs = true;
- break;
- }
- }
-
- return [ret];
+ }];
}
});
// 'unreachable'
diff --git a/src/jsifier.js b/src/jsifier.js
index 1bbd4d20..94f78134 100644
--- a/src/jsifier.js
+++ b/src/jsifier.js
@@ -199,7 +199,8 @@ function JSify(data, functionsOnly, givenFunctions, givenGlobalVariables) {
return ret;
} else {
if (item.external && BUILD_AS_SHARED_LIB) {
- // External variables in shared libraries should not be declared.
+ // External variables in shared libraries should not be declared as
+ // they would shadow similarly-named globals in the parent.
item.JS = '';
} else {
item.JS = 'var ' + item.ident + ';';
diff --git a/src/parseTools.js b/src/parseTools.js
index 5473ff37..4b3e63e1 100644
--- a/src/parseTools.js
+++ b/src/parseTools.js
@@ -333,6 +333,15 @@ function parseParamTokens(params) {
return ret;
}
+function hasVarArgs(params) {
+ for (var i = 0; i < params.length; i++) {
+ if (params[i].intertype == 'varargs') {
+ return true;
+ }
+ }
+ return false;
+}
+
function finalizeParam(param) {
if (param.intertype in PARSABLE_LLVM_FUNCTIONS) {
return finalizeLLVMFunctionCall(param);
diff --git a/tests/runner.py b/tests/runner.py
index e51f8e86..907e2c91 100644
--- a/tests/runner.py
+++ b/tests/runner.py
@@ -1871,14 +1871,14 @@ if 'benchmark' not in sys.argv:
typedef int (*CMP_TYPE)(const void*, const void*);
- CMP_TYPE get_cmp() {
+ extern "C" CMP_TYPE get_cmp() {
return lib_cmp;
}
'''
dirname = self.get_dir()
filename = os.path.join(dirname, 'liblib.cpp')
BUILD_AS_SHARED_LIB = 1
- EXPORTED_FUNCTIONS = ['__Z7get_cmpv']
+ EXPORTED_FUNCTIONS = ['_get_cmp']
self.build(lib_src, dirname, filename)
shutil.move(filename + '.o.js', os.path.join(dirname, 'liblib.so'))
@@ -1908,7 +1908,7 @@ if 'benchmark' not in sys.argv:
printf("Could not load lib.\\n");
return 1;
}
- getter_ptr = (CMP_TYPE (*)()) dlsym(lib_handle, "_Z7get_cmpv");
+ getter_ptr = (CMP_TYPE (*)()) dlsym(lib_handle, "get_cmp");
if (getter_ptr == NULL) {
printf("Could not find func.\\n");
return 1;
@@ -1965,7 +1965,7 @@ if 'benchmark' not in sys.argv:
p_f();
}
- void (*func(int x, void(*fptr)()))() {
+ extern "C" void (*func(int x, void(*fptr)()))() {
printf("In func: %d\\n", x);
fptr();
return lib_fptr;
@@ -1974,7 +1974,7 @@ if 'benchmark' not in sys.argv:
dirname = self.get_dir()
filename = os.path.join(dirname, 'liblib.cpp')
BUILD_AS_SHARED_LIB = 1
- EXPORTED_FUNCTIONS = ['__Z4funciPFvvE']
+ EXPORTED_FUNCTIONS = ['_func']
EXPORTED_GLOBALS = ['_global']
self.build(lib_src, dirname, filename)
shutil.move(filename + '.o.js', os.path.join(dirname, 'liblib.so'))
@@ -2007,9 +2007,9 @@ if 'benchmark' not in sys.argv:
}
// Test looked up function.
- func_fptr = (FUNCTYPE*) dlsym(lib_handle, "_Z4funciPFvvE");
+ func_fptr = (FUNCTYPE*) dlsym(lib_handle, "func");
// Load twice to test cache.
- func_fptr = (FUNCTYPE*) dlsym(lib_handle, "_Z4funciPFvvE");
+ func_fptr = (FUNCTYPE*) dlsym(lib_handle, "func");
if (func_fptr == NULL) {
printf("Could not find func.\\n");
return 1;
@@ -2049,14 +2049,14 @@ if 'benchmark' not in sys.argv:
lib_src = r'''
#include <stdio.h>
extern int parent_global;
- void func() {
+ extern "C" void func() {
printf("Parent global: %d.\n", parent_global);
}
'''
dirname = self.get_dir()
filename = os.path.join(dirname, 'liblib.cpp')
BUILD_AS_SHARED_LIB = 1
- EXPORTED_FUNCTIONS = ['__Z4funcv']
+ EXPORTED_FUNCTIONS = ['_func']
self.build(lib_src, dirname, filename)
shutil.move(filename + '.o.js', os.path.join(dirname, 'liblib.so'))
@@ -2070,7 +2070,7 @@ if 'benchmark' not in sys.argv:
void (*fptr)();
lib_handle = dlopen("liblib.so", RTLD_NOW);
- fptr = (void (*)())dlsym(lib_handle, "_Z4funcv");
+ fptr = (void (*)())dlsym(lib_handle, "func");
fptr();
parent_global = 456;
fptr();
@@ -2096,14 +2096,14 @@ if 'benchmark' not in sys.argv:
global BUILD_AS_SHARED_LIB, EXPORTED_FUNCTIONS
lib_src = r'''
void print_ints(int n, ...);
- void func() {
+ extern "C" void func() {
print_ints(2, 13, 42);
}
'''
dirname = self.get_dir()
filename = os.path.join(dirname, 'liblib.cpp')
BUILD_AS_SHARED_LIB = 1
- EXPORTED_FUNCTIONS = ['__Z4funcv']
+ EXPORTED_FUNCTIONS = ['_func']
self.build(lib_src, dirname, filename)
shutil.move(filename + '.o.js', os.path.join(dirname, 'liblib.so'))
@@ -2128,7 +2128,7 @@ if 'benchmark' not in sys.argv:
print_ints(2, 100, 200);
lib_handle = dlopen("liblib.so", RTLD_NOW);
- fptr = (void (*)())dlsym(lib_handle, "_Z4funcv");
+ fptr = (void (*)())dlsym(lib_handle, "func");
fptr();
return 0;