aboutsummaryrefslogtreecommitdiff
path: root/src/library.js
diff options
context:
space:
mode:
authorAlon Zakai <alonzakai@gmail.com>2011-11-07 18:22:16 -0800
committerAlon Zakai <alonzakai@gmail.com>2011-11-07 18:22:16 -0800
commit6fe0acce5da7f625ecadc9718842aef08faabd57 (patch)
tree7dfeb3f595e6b85bb56f4aaae1f429b16e611fad /src/library.js
parent938b1212234200018ae886762f0b2eb938e81a94 (diff)
basic support for dynamic_cast
Diffstat (limited to 'src/library.js')
-rw-r--r--src/library.js21
1 files changed, 21 insertions, 0 deletions
diff --git a/src/library.js b/src/library.js
index 2e0adb64..73caa37c 100644
--- a/src/library.js
+++ b/src/library.js
@@ -4051,6 +4051,27 @@ LibraryManager.library = {
return 1;
},
+ _ZTVN10__cxxabiv117__class_type_infoE: [1], // no inherited classes
+ _ZTVN10__cxxabiv120__si_class_type_infoE: [2], // yes inherited classes
+
+ __dynamic_cast: function(ptr, knownTI, attemptedTI, idunno) {
+ var ptrTV = {{{ makeGetValue('ptr', '0', '*') }}};
+ var count = {{{ makeGetValue('ptrTV', '0', '*') }}};
+ ptrTV -= {{{ QUANTUM_SIZE }}};
+ var TI = {{{ makeGetValue('ptrTV', '0', '*') }}};
+ do {
+ if (TI == attemptedTI) return 1;
+ // Go to parent class
+ var type_infoAddr = {{{ makeGetValue('TI', '0', '*') }}} - {{{ QUANTUM_SIZE*2 }}};
+ var type_info = {{{ makeGetValue('type_infoAddr', '0', '*') }}};
+ if (type_info == 1) return 0; // no parent class
+ var TIAddr = TI + {{{ QUANTUM_SIZE*2 }}};
+ var TI = {{{ makeGetValue('TIAddr', '0', '*') }}};
+ } while (1);
+
+ return 0;
+ },
+
// Exceptions
__cxa_allocate_exception: function(size) {
return _malloc(size);