| OLD | NEW | 
|    1 /* |    1 /* | 
|    2  * This file is part of Adblock Plus <https://adblockplus.org/>, |    2  * This file is part of Adblock Plus <https://adblockplus.org/>, | 
|    3  * Copyright (C) 2006-2017 eyeo GmbH |    3  * Copyright (C) 2006-2017 eyeo GmbH | 
|    4  * |    4  * | 
|    5  * Adblock Plus is free software: you can redistribute it and/or modify |    5  * Adblock Plus is free software: you can redistribute it and/or modify | 
|    6  * it under the terms of the GNU General Public License version 3 as |    6  * it under the terms of the GNU General Public License version 3 as | 
|    7  * published by the Free Software Foundation. |    7  * published by the Free Software Foundation. | 
|    8  * |    8  * | 
|    9  * Adblock Plus is distributed in the hope that it will be useful, |    9  * Adblock Plus is distributed in the hope that it will be useful, | 
|   10  * but WITHOUT ANY WARRANTY; without even the implied warranty of |   10  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|   11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the |   11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
|   12  * GNU General Public License for more details. |   12  * GNU General Public License for more details. | 
|   13  * |   13  * | 
|   14  * You should have received a copy of the GNU General Public License |   14  * You should have received a copy of the GNU General Public License | 
|   15  * along with Adblock Plus.  If not, see <http://www.gnu.org/licenses/>. |   15  * along with Adblock Plus.  If not, see <http://www.gnu.org/licenses/>. | 
|   16  */ |   16  */ | 
|   17  |   17  | 
|   18 #include <cstdio> |   18 #include <cstdio> | 
|   19  |   19  | 
|   20 #include <emscripten.h> |  | 
|   21  |  | 
|   22 #include "generator.h" |   20 #include "generator.h" | 
 |   21 #include "library.h" | 
|   23  |   22  | 
|   24 namespace |   23 namespace | 
|   25 { |   24 { | 
|   26   std::vector<bindings_internal::ClassInfo> classes; |   25   std::vector<bindings_internal::ClassInfo> classes; | 
|   27   std::vector<bindings_internal::NamespaceInfo> namespaces; |   26   std::vector<bindings_internal::NamespaceInfo> namespaces; | 
|   28  |   27  | 
|   29   void printProperties(const bindings_internal::PropertyList& properties) |   28   void printProperties(const bindings_internal::PropertyList& properties) | 
|   30   { |   29   { | 
|   31     for (const auto& property : properties) |   30     for (const auto& property : properties) | 
|   32     { |   31     { | 
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  134           break; |  133           break; | 
|  135         case TypeCategory::DOUBLE: |  134         case TypeCategory::DOUBLE: | 
|  136           signature += 'd'; |  135           signature += 'd'; | 
|  137           break; |  136           break; | 
|  138         default: |  137         default: | 
|  139           throw std::runtime_error("Unexpected function argument type"); |  138           throw std::runtime_error("Unexpected function argument type"); | 
|  140       } |  139       } | 
|  141       args.push_back(type); |  140       args.push_back(type); | 
|  142     } |  141     } | 
|  143  |  142  | 
|  144     get_function_name(function, signature.c_str()); |  143     GetFunctionName(name, function, signature.c_str()); | 
|  145   } |  144   } | 
|  146  |  145  | 
|  147   bool FunctionInfo::empty() const |  146   bool FunctionInfo::empty() const | 
|  148   { |  147   { | 
|  149     return name[0] == '\0'; |  148     return name[0] == '\0'; | 
|  150   } |  149   } | 
|  151  |  150  | 
|  152   void FunctionInfo::get_function_name(void* ptr, const char* signature) |  | 
|  153   { |  | 
|  154     // This is a hack, C++ won't let us get the mangled function name. |  | 
|  155     // JavaScript is more dynamic so we pass the pointer to our function |  | 
|  156     // there. With that and the function signature we can call the function - |  | 
|  157     // with a full stack so that we will cause it to abort. Sometimes the |  | 
|  158     // function we are calling will also be missing from the build. The result |  | 
|  159     // is the same: abort() is called which in turn calls stackTrace(). By |  | 
|  160     // replacing stackTrace() we get access to the call stack and search it |  | 
|  161     // for the name of our function. |  | 
|  162  |  | 
|  163     EM_ASM_ARGS({ |  | 
|  164       var signature = AsciiToString($2); |  | 
|  165       var args = []; |  | 
|  166       for (var i = 1; i < signature.length; i++) |  | 
|  167         args.push(0); |  | 
|  168  |  | 
|  169       var oldPrint = Module.print; |  | 
|  170       var oldPrintErr = Module.printErr; |  | 
|  171       var oldStackTrace = stackTrace; |  | 
|  172       var sp = Runtime.stackSave(); |  | 
|  173       Module.print = function(){}; |  | 
|  174       Module.printErr = function(){}; |  | 
|  175       stackTrace = function() |  | 
|  176       { |  | 
|  177         var stack = []; |  | 
|  178         for (var f = arguments.callee.caller; f; f = f.caller) |  | 
|  179         { |  | 
|  180           if (f.name) |  | 
|  181           { |  | 
|  182             if (f.name.indexOf("dynCall") == 0) |  | 
|  183               break; |  | 
|  184             else |  | 
|  185               stack.push(f.name); |  | 
|  186           } |  | 
|  187         } |  | 
|  188  |  | 
|  189         result = stack[stack.length - 1]; |  | 
|  190         if (result && result.indexOf("__wrapper") >= 0) |  | 
|  191           result = stack[stack.length - 2]; |  | 
|  192         throw result; |  | 
|  193       }; |  | 
|  194  |  | 
|  195       Runtime.stackRestore(STACK_MAX); |  | 
|  196  |  | 
|  197       try |  | 
|  198       { |  | 
|  199         Runtime.dynCall(signature, HEAP32[$1 >> 2], args); |  | 
|  200       } |  | 
|  201       catch(e) |  | 
|  202       { |  | 
|  203         Module.stringToAscii(e, $0); |  | 
|  204       } |  | 
|  205       finally |  | 
|  206       { |  | 
|  207         Runtime.stackRestore(sp); |  | 
|  208         Module.print = oldPrint; |  | 
|  209         Module.printErr = oldPrintErr; |  | 
|  210         stackTrace = oldStackTrace; |  | 
|  211       } |  | 
|  212     }, name, ptr, signature); |  | 
|  213   } |  | 
|  214  |  | 
|  215   ClassInfo* find_class(TYPEID classID) |  151   ClassInfo* find_class(TYPEID classID) | 
|  216   { |  152   { | 
|  217     for (auto& classInfo : classes) |  153     for (auto& classInfo : classes) | 
|  218       if (classInfo.id == classID) |  154       if (classInfo.id == classID) | 
|  219         return &classInfo; |  155         return &classInfo; | 
|  220     return nullptr; |  156     return nullptr; | 
|  221   } |  157   } | 
|  222  |  158  | 
|  223   void register_class(const char* name, TYPEID classID, TYPEID baseClassID, |  159   void register_class(const char* name, TYPEID classID, TYPEID baseClassID, | 
|  224                       ptrdiff_t ref_counted_offset) |  160                       ptrdiff_t ref_counted_offset) | 
| (...skipping 339 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  564  |  500  | 
|  565 void printBindings() |  501 void printBindings() | 
|  566 { |  502 { | 
|  567   bindings_internal::printHelpers(); |  503   bindings_internal::printHelpers(); | 
|  568  |  504  | 
|  569   for (const auto& item : classes) |  505   for (const auto& item : classes) | 
|  570     bindings_internal::printClass(item); |  506     bindings_internal::printClass(item); | 
|  571   for (const auto& item : namespaces) |  507   for (const auto& item : namespaces) | 
|  572     bindings_internal::printNamespace(item); |  508     bindings_internal::printNamespace(item); | 
|  573 } |  509 } | 
| OLD | NEW |