Proper parsing of llvm strings

This commit is contained in:
alon@honor 2010-09-10 21:15:40 -07:00
Родитель bcb46261d6
Коммит 285a5ef5d5
2 изменённых файлов: 27 добавлений и 5 удалений

Просмотреть файл

@ -341,6 +341,24 @@ function parseNumerical(value, type) {
return value;
}
// \0Dsometext is really '\r', then sometext
// This function returns an array of int values
function parseLLVMString(str) {
var ret = [];
var i = 0;
while (i < str.length) {
var chr = str[i];
if (chr != '\\') {
ret.push(chr.charCodeAt(0));
i++;
} else {
ret.push(_HexToInt(str[i+1]+str[i+2]));
i += 3;
}
}
return ret;
}
function getLabelIds(labels) {
return labels.map(function(label) { return label.ident });
}
@ -1915,7 +1933,7 @@ function JSify(data) {
return makePointer(JSON.stringify(makeEmptyStruct(type)));
} else if (value.text[0] == '"') {
value.text = value.text.substr(1, value.text.length-2);
return makePointer('intArrayFromString("' + value.text + '")');
return makePointer(JSON.stringify(parseLLVMString(value.text)));
} else {
// Gets an array of constant items, separated by ',' tokens
function handleSegments(tokens) {

Просмотреть файл

@ -224,16 +224,20 @@ class T(unittest.TestCase):
src = '''
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char **argv)
{
printf("*%d", argc);
puts(argv[1]);
puts(argv[2]);
printf("%d*", atoi(argv[3])+2);
printf("%d", atoi(argv[3])+2);
const char *foolingthecompiler = "\\rabcd";
printf("%d", strlen(foolingthecompiler)); // Tests parsing /0D in llvm - should not be a 0 (end string) then a D!
return 0;
}
'''
self.do_test(src, '*4*wowie*too*76*', ['wowie', 'too', '74'], lambda x: x.replace('\n', '*'))
self.do_test(src, '*4*wowie*too*76*5*', ['wowie', 'too', '74'], lambda x: x.replace('\n', '*'))
def test_funcs(self):
src = '''
@ -566,7 +570,7 @@ class T(unittest.TestCase):
return 0;
}
'''
self.do_test(src, '*2,2,5,8,8*\n*8,8,5,8,8*\n*7,2,6,990,7,2*')
self.do_test(src, '*2,2,5,8,8****8,8,5,8,8****7,2,6,990,7,2*', [], lambda x: x.replace('\n', '*'))
def test_llvmswitch(self):
src = '''
@ -666,7 +670,7 @@ class T(unittest.TestCase):
src = open(path_from_root(['tests', 'fasta.cpp']), 'r').read()
self.do_test(src, j, [str(i)], lambda x: x.replace('\n', '*'), no_python=True, no_build=i>1)
def test_sauer(self):
def zzztest_sauer(self):
# XXX Warning: Running this in SpiderMonkey can lead to an extreme amount of memory being
# used, see Mozilla bug 593659.
assert PARSER_ENGINE != SPIDERMONKEY_ENGINE