diff options
author | julien.hamaide <julien.hamaide@fishingcactus.com> | 2012-01-25 15:56:27 +0100 |
---|---|---|
committer | julien.hamaide <julien.hamaide@fishingcactus.com> | 2012-01-25 15:56:27 +0100 |
commit | 0040353a176fac6eff5091556afe87c1955e51c3 (patch) | |
tree | b9b2510d4616df4ce7578067ef80e7c739e6131e /src | |
parent | 61e4b6b9d40c966ead0198e9a9a32d1067273ef7 (diff) |
String constants are store in a table to limit variable count
Diffstat (limited to 'src')
-rw-r--r-- | src/intertyper.js | 4 | ||||
-rw-r--r-- | src/jsifier.js | 15 | ||||
-rw-r--r-- | src/parseTools.js | 3 | ||||
-rw-r--r-- | src/preamble.js | 2 | ||||
-rw-r--r-- | src/preamble_sharedlib.js | 1 |
5 files changed, 21 insertions, 4 deletions
diff --git a/src/intertyper.js b/src/intertyper.js index d295a872..010b0d71 100644 --- a/src/intertyper.js +++ b/src/intertyper.js @@ -83,10 +83,12 @@ function intertyper(data, sidePass, baseLineNums) { var global = /([@%\w\d\.\" ]+) = .*/.exec(line); var globalIdent = toNiceIdent(global[1]); var testAlias = /[@%\w\d\.\" ]+ = alias .*/.exec(line); + var testString = /^[^"]+c\"[^"]+"/.exec( line ); Variables.globals[globalIdent] = { name: globalIdent, alias: !!testAlias, - impl: VAR_EMULATED + impl: VAR_EMULATED, + isString : !!testString }; unparsedGlobals.lines.push(line); } else { diff --git a/src/jsifier.js b/src/jsifier.js index 69a64d1a..6548e87f 100644 --- a/src/jsifier.js +++ b/src/jsifier.js @@ -247,7 +247,8 @@ function JSify(data, functionsOnly, givenFunctions) { substrate.addActor('GlobalVariable', { processItem: function(item) { function needsPostSet(value) { - return value[0] in UNDERSCORE_OPENPARENS || value.substr(0, 14) === 'CHECK_OVERFLOW'; + return value[0] in UNDERSCORE_OPENPARENS || value.substr(0, 14) === 'CHECK_OVERFLOW' + || value.substr(0, 13) === 'STRING_TABLE.'; } item.intertype = 'GlobalVariableStub'; @@ -264,7 +265,9 @@ function JSify(data, functionsOnly, givenFunctions) { // they would shadow similarly-named globals in the parent. item.JS = ''; } else { - item.JS = 'var ' + item.ident + ';'; + if(!(item.ident in Variables.globals ) || !Variables.globals[item.ident].isString) { + item.JS = 'var ' + item.ident + ';'; + } } var constant = null; if (item.external) { @@ -313,7 +316,13 @@ function JSify(data, functionsOnly, givenFunctions) { // allocations in a shared library. constant = makePointer(constant, null, BUILD_AS_SHARED_LIB ? 'ALLOC_NORMAL' : 'ALLOC_STATIC', item.type); - var js = item.ident + '=' + constant + ';'; + var js; + + if(Variables.globals[ item.ident ].isString) { + js = 'STRING_TABLE.' + item.ident + '=' + constant + ';'; + } else { + js = item.ident + '=' + constant + ';'; + } // Special case: class vtables. We make sure they are null-terminated, to allow easy runtime operations if (item.ident.substr(0, 5) == '__ZTV') { js += '\n' + makePointer('[0]', null, BUILD_AS_SHARED_LIB ? 'ALLOC_NORMAL' : 'ALLOC_STATIC', ['void*']) + ';'; diff --git a/src/parseTools.js b/src/parseTools.js index 18ce807e..0eaf4e0b 100644 --- a/src/parseTools.js +++ b/src/parseTools.js @@ -1434,6 +1434,9 @@ function finalizeLLVMParameter(param, noIndexizeFunctions) { } } else if (param.intertype == 'value') { ret = param.ident; + if(ret in Variables.globals && Variables.globals[ret].isString) { + ret = "STRING_TABLE." + ret; + } if (param.type == 'i64' && I64_MODE == 1) { ret = parseI64Constant(ret); } diff --git a/src/preamble.js b/src/preamble.js index 5c5c21ea..b9da766f 100644 --- a/src/preamble.js +++ b/src/preamble.js @@ -750,6 +750,8 @@ function intArrayToString(array) { } Module['intArrayToString'] = intArrayToString; +var STRING_TABLE = []; + {{{ unSign }}} {{{ reSign }}} diff --git a/src/preamble_sharedlib.js b/src/preamble_sharedlib.js index 2a071f6b..af204e2f 100644 --- a/src/preamble_sharedlib.js +++ b/src/preamble_sharedlib.js @@ -16,6 +16,7 @@ function callRuntimeCallbacks(callbacks) { } var __ATINIT__ = []; // functions called during startup +var STRING_TABLE = []; function initRuntime() { callRuntimeCallbacks(__ATINIT__); |