diff options
-rw-r--r-- | src/library.js | 41 | ||||
-rwxr-xr-x | tests/runner.py | 80 |
2 files changed, 104 insertions, 17 deletions
diff --git a/src/library.js b/src/library.js index 4997d6e8..32186eac 100644 --- a/src/library.js +++ b/src/library.js @@ -4755,10 +4755,19 @@ LibraryManager.library = { __cxa_is_number_type: function(type) { var isNumber = false; try { if (type == __ZTIi) isNumber = true } catch(e){} + try { if (type == __ZTIj) isNumber = true } catch(e){} try { if (type == __ZTIl) isNumber = true } catch(e){} + try { if (type == __ZTIm) isNumber = true } catch(e){} try { if (type == __ZTIx) isNumber = true } catch(e){} + try { if (type == __ZTIy) isNumber = true } catch(e){} try { if (type == __ZTIf) isNumber = true } catch(e){} try { if (type == __ZTId) isNumber = true } catch(e){} + try { if (type == __ZTIe) isNumber = true } catch(e){} + try { if (type == __ZTIc) isNumber = true } catch(e){} + try { if (type == __ZTIa) isNumber = true } catch(e){} + try { if (type == __ZTIh) isNumber = true } catch(e){} + try { if (type == __ZTIs) isNumber = true } catch(e){} + try { if (type == __ZTIt) isNumber = true } catch(e){} return isNumber; }, @@ -4839,22 +4848,22 @@ LibraryManager.library = { // RTTI hacks for exception handling, defining type_infos for common types. // The values are dummies. We simply use the addresses of these statically // allocated variables as unique identifiers. - // type_info for int. - _ZTIi: [0], - // type_info for long. - _ZTIl: [0], - // type_info for long long. - _ZTIx: [0], - // type_info for float. - _ZTIf: [0], - // type_info for double. - _ZTId: [0], - // type_info for char. - _ZTIc: [0], - // type_info for void. - _ZTIv: [0], - // type_info for void*. - _ZTIPv: [0], + _ZTIi: [0], // int + _ZTIj: [0], // unsigned int + _ZTIl: [0], // long + _ZTIm: [0], // unsigned long + _ZTIx: [0], // long long + _ZTIy: [0], // unsigned long long + _ZTIf: [0], // float + _ZTId: [0], // double + _ZTIe: [0], // long double + _ZTIc: [0], // char + _ZTIa: [0], // signed char + _ZTIh: [0], // unsigned char + _ZTIs: [0], // short + _ZTIt: [0], // signed short + _ZTIv: [0], // void + _ZTIPv: [0], // void* llvm_uadd_with_overflow_i8: function(x, y) { x = x & 0xff; diff --git a/tests/runner.py b/tests/runner.py index 2a22fa8b..f926c723 100755 --- a/tests/runner.py +++ b/tests/runner.py @@ -5219,7 +5219,85 @@ int main(int argc, char **argv) { return 1; } ''', 'hello world'); - + + def test_typeid(self): + self.do_run(r''' + #include <stdio.h> + #include <string.h> + #include <typeinfo> + int main() { + printf("*\n"); + #define MAX 100 + int ptrs[MAX]; + int groups[MAX]; + memset(ptrs, 0, MAX*sizeof(int)); + memset(groups, 0, MAX*sizeof(int)); + int next_group = 1; + #define TEST(X) { \ + int ptr = (int)&typeid(X); \ + int group = 0; \ + int i; \ + for (i = 0; i < MAX; i++) { \ + if (!groups[i]) break; \ + if (ptrs[i] == ptr) { \ + group = groups[i]; \ + break; \ + } \ + } \ + if (!group) { \ + groups[i] = group = next_group++; \ + ptrs[i] = ptr; \ + } \ + printf("%s:%d\n", #X, group); \ + } + TEST(int); + TEST(unsigned int); + TEST(unsigned); + TEST(signed int); + TEST(long); + TEST(unsigned long); + TEST(signed long); + TEST(long long); + TEST(unsigned long long); + TEST(signed long long); + TEST(short); + TEST(unsigned short); + TEST(signed short); + TEST(char); + TEST(unsigned char); + TEST(signed char); + TEST(float); + TEST(double); + TEST(long double); + TEST(void); + TEST(void*); + printf("*\n"); + } + ''', '''* +int:1 +unsigned int:2 +unsigned:2 +signed int:1 +long:3 +unsigned long:4 +signed long:3 +long long:5 +unsigned long long:6 +signed long long:5 +short:7 +unsigned short:8 +signed short:7 +char:9 +unsigned char:10 +signed char:11 +float:12 +double:13 +long double:14 +void:15 +void*:16 +* +'''); + def test_static_variable(self): if self.emcc_args is None: Settings.SAFE_HEAP = 0 # LLVM mixes i64 and i8 in the guard check src = ''' |