aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/parser.js45
-rw-r--r--src/preamble.js36
2 files changed, 48 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 ===