diff options
-rw-r--r-- | src/parser.js | 45 | ||||
-rw-r--r-- | src/preamble.js | 36 | ||||
-rw-r--r-- | tests/runner.py | 31 |
3 files changed, 79 insertions, 33 deletions
diff --git a/src/parser.js b/src/parser.js index 6ad40d77..299523cc 100644 --- a/src/parser.js +++ b/src/parser.js @@ -251,6 +251,38 @@ function parseBitcast(segment) { return ret; } +function _HexToInt(stringy) { + var ret = 0; + var mul = 1; + var base; + for (var i = (stringy.length - 1); i >= 0; i = i - 1) { + if (stringy.charCodeAt(i) >= "A".charCodeAt(0)) { + base = "A".charCodeAt(0) - 10; + } else { + base = "0".charCodeAt(0); + } + ret = ret + (mul*(stringy.charCodeAt(i) - base)); + mul = mul * 16; + } + return ret; +} + +function IEEEUnHex(stringy) { + var a = _HexToInt(stringy.substr(2, 8)); + var b = _HexToInt(stringy.substr(10)); + var e = (a >> ((52 - 32) & 0x7ff)) - 1023; + return ((((a & 0xfffff | 0x100000) * 1.0) / Math.pow(2,52-32)) * Math.pow(2, e)) + (((b * 1.0) / Math.pow(2, 52)) * Math.pow(2, e)); +} + +function parseNumerical(value, type) { + if ((type == 'double' || type == 'float') && value.substr(0,2) == '0x') { + // Hexadecimal double value, as the llvm docs say, + // "The one non-intuitive notation for constants is the hexadecimal form of floating point constants." + return IEEEUnHex(value); + } + return value; +} + function getLabelIds(labels) { return labels.map(function(label) { return label.ident }); } @@ -430,10 +462,11 @@ function intertyper(data) { selectItem: function(item) { return item.tokens && item.tokens.length >= 3 && item.indent === 0 && item.tokens[1].text == '=' }, processItem: function(item) { if (item.tokens[2].text == 'type') { - // type - //print('// zz ' + dump(item)); + dprint('linenum: ' + item.lineNum + ':' + dump(item)); var fields = []; if (item.tokens[3].text != 'opaque') { + if (item.tokens[3].type == '<') // type <{ i8 }> XXX - check spec + item.tokens[3] = item.tokens[3].item[0]; var subTokens = item.tokens[3].tokens; subTokens.push({text:','}); while (subTokens[0]) { @@ -1975,7 +2008,10 @@ function JSify(data) { //print("zz var: " + item.JS); var impl = getVarData(item.funcData, item.ident); switch (impl) { - case VAR_NATIVE: break; + case VAR_NATIVE: { + value = parseNumerical(value, type); + break; + } case VAR_NATIVIZED: { // SSA, so this must be the alloca. No need for a value if (!item.overrideSSA) value = ''; @@ -2015,6 +2051,9 @@ function JSify(data) { } else { value = toNiceIdent(item.value.ident); } + if (pointingLevels(item.pointerType.text) == 1) { + value = parseNumerical(value, removePointing(item.pointerType.text)); + } //print("// zz seek " + ident + ',' + dump(item)); var impl = getVarData(item.funcData, item.ident); var ret; diff --git a/src/preamble.js b/src/preamble.js index 8f98c113..ce328758 100644 --- a/src/preamble.js +++ b/src/preamble.js @@ -96,9 +96,12 @@ function _printf() { var text = Pointer_stringify(arguments[0]); var textIndex; for (var argIndex = 1; argIndex < arguments.length; argIndex = argIndex + 1) { - textIndex = text.indexOf("%d"); // We only support numbers - use puts for strings! - if (textIndex < 0) textIndex = text.indexOf("%f"); - if (textIndex < 0) break; + // We only support numbers - use puts for strings! + textIndex = Math.min(text.indexOf("%d"), text.indexOf("%f")); + if (textIndex < 0) { + textIndex = Math.max(text.indexOf("%d"), text.indexOf("%f")); + if (textIndex < 0) break; + } text = text.substr(0, textIndex) + String(arguments[argIndex]) + text.substr(textIndex + 2); } print(text); @@ -167,32 +170,5 @@ function intArrayFromString(stringy) { return ret; } -// Utilities - -function _HexToInt(stringy) { - var ret = 0; - var mul = 1; - var base; - for (var i = (stringy.length - 1); i >= 0; i = i - 1) { - if (stringy.charCodeAt(i) >= "A".charCodeAt(0)) { - base = "A".charCodeAt(0) - 10; - } else { - base = "0".charCodeAt(0); - } - ret = ret + (mul*(stringy.charCodeAt(i) - base)); - mul = mul * 16; - } - return ret; -} - -function _IEEEUnHex(stringy) { - var a = _HexToInt(stringy.substr(2, 8)); - var b = _HexToInt(stringy.substr(10)); - var e = (a >> ((52 - 32) & 0x7ff)) - 1023; - return ((((a & 0xfffff | 0x100000) * 1.0) / Math.pow(2,52-32)) * Math.pow(2, e)) + (((b * 1.0) / Math.pow(2, 52)) * Math.pow(2, e)); -} - -var INDENT = ''; // Debugging - // === Body === diff --git a/tests/runner.py b/tests/runner.py index bc72071c..4e550aba 100644 --- a/tests/runner.py +++ b/tests/runner.py @@ -152,6 +152,19 @@ class T(unittest.TestCase): ''' self.do_test(src, '*5,23,10,19,101,1*') + def test_floatvars(self): + src = ''' + #include <stdio.h> + int main() + { + float x = 1.234, y = 3.5; + y *= 3; + printf("*%d,%f,%d,%f\\n", int(y), y, (int)x, x); + return 0; + } + ''' + self.do_test(src, '*10,10.5,1,1.2339') + def test_if(self): src = ''' #include <stdio.h> @@ -378,6 +391,24 @@ class T(unittest.TestCase): ''' self.do_test(src, '*11,74*') + def test_emptyclass(self): + src = ''' + #include <stdio.h> + + struct Randomized { + Randomized(int x) { + printf("*zzcheezzz*\\n"); + } + }; + + int main( int argc, const char *argv[] ) { + new Randomized(55); + + return 0; + } + ''' + self.do_test(src, '*zzcheezzz*') + def zzzzzzzzzzzzzzztest_constglobalstructs(self): # TODO: make this work src = ''' #include <stdio.h> |