| Left: | ||
| Right: |
| LEFT | RIGHT |
|---|---|
| 1 #pragma once | 1 #pragma once |
| 2 | 2 |
| 3 #include <cstddef> | |
| 3 #include <cstdint> | 4 #include <cstdint> |
| 4 #include <cstdio> | 5 #include <cstdio> |
| 5 #include <cstdlib> | 6 #include <cstdlib> |
| 6 #include <exception> | 7 #include <exception> |
| 7 #include <map> | 8 #include <map> |
| 8 #include <string> | 9 #include <string> |
| 9 #include <type_traits> | 10 #include <type_traits> |
| 10 #include <utility> | 11 #include <utility> |
| 11 #include <vector> | 12 #include <vector> |
| 12 | 13 |
| (...skipping 257 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 270 }; | 271 }; |
| 271 | 272 |
| 272 struct ClassInfo | 273 struct ClassInfo |
| 273 { | 274 { |
| 274 ClassInfo* baseClass; | 275 ClassInfo* baseClass; |
| 275 std::string name; | 276 std::string name; |
| 276 std::vector<PropertyInfo> properties; | 277 std::vector<PropertyInfo> properties; |
| 277 std::vector<MethodInfo> methods; | 278 std::vector<MethodInfo> methods; |
| 278 std::vector<FunctionInfo> initializers; | 279 std::vector<FunctionInfo> initializers; |
| 279 DifferentiatorInfo subclass_differentiator; | 280 DifferentiatorInfo subclass_differentiator; |
| 280 int ref_counted_offset; | 281 ptrdiff_t ref_counted_offset; |
| 281 }; | 282 }; |
| 282 | 283 |
| 283 std::map<TYPEID, ClassInfo> classes; | 284 std::map<TYPEID, ClassInfo> classes; |
| 284 | 285 |
| 285 void register_class(const char* name, TYPEID classID, TYPEID baseClassID, | 286 void register_class(const char* name, TYPEID classID, TYPEID baseClassID, |
| 286 int ref_counted_offset) | 287 ptrdiff_t ref_counted_offset) |
| 287 { | 288 { |
| 288 auto it = classes.find(classID); | 289 auto it = classes.find(classID); |
| 289 if (it != classes.end()) | 290 if (it != classes.end()) |
| 290 throw std::runtime_error(std::string("Duplicate definition for class ") + name); | 291 throw std::runtime_error(std::string("Duplicate definition for class ") + name); |
| 291 | 292 |
| 292 ClassInfo* baseClass = nullptr; | 293 ClassInfo* baseClass = nullptr; |
| 293 if (baseClassID != TypeInfo<NoBaseClass>()) | 294 if (baseClassID != TypeInfo<NoBaseClass>()) |
| 294 { | 295 { |
| 295 it = classes.find(baseClassID); | 296 it = classes.find(baseClassID); |
| 296 if (it == classes.end()) | 297 if (it == classes.end()) |
| (...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 478 if (!property.setter.empty()) | 479 if (!property.setter.empty()) |
| 479 result += ", set: " + wrapCall(property.setter); | 480 result += ", set: " + wrapCall(property.setter); |
| 480 return result; | 481 return result; |
| 481 } | 482 } |
| 482 | 483 |
| 483 void printHelpers() | 484 void printHelpers() |
| 484 { | 485 { |
| 485 printf("var sizeofString = %i;\n", sizeof(String)); | 486 printf("var sizeofString = %i;\n", sizeof(String)); |
| 486 | 487 |
| 487 puts(R"( | 488 puts(R"( |
| 488 function copyString(str, buffer) | 489 function copyString(str, buffer) |
| 489 { | 490 { |
| 490 var length = str.length; | 491 var length = str.length; |
| 491 for (var i = 0, pointer = (buffer >> 1); i < length; i++, pointer++) | 492 for (var i = 0, pointer = (buffer >> 1); i < length; i++, pointer++) |
| 492 HEAP16[pointer] = str.charCodeAt(i); | 493 HEAP16[pointer] = str.charCodeAt(i); |
| 493 return length; | 494 return length; |
| 494 } | 495 } |
| 495 | 496 |
| 496 function createString(str) | 497 function createString(str) |
| 497 { | 498 { |
| 498 var length = 0; | 499 var length = 0; |
| 499 var buffer = 0; | 500 var buffer = 0; |
| 500 if (str) | 501 if (str) |
| 501 { | 502 { |
| 502 buffer = Runtime.stackAlloc(str.length * 2); | 503 buffer = Runtime.stackAlloc(str.length * 2); |
| 503 length = copyString(str, buffer); | 504 length = copyString(str, buffer); |
| 504 } | 505 } |
| 505 | 506 |
| 506 var result = Runtime.stackAlloc(sizeofString); | 507 var result = Runtime.stackAlloc(sizeofString); |
|
Wladimir Palant
2017/03/15 11:02:48
We don't need to call this via Module, and above w
| |
| 507 Module._InitString(result, buffer, length); | 508 Module._InitString(result, buffer, length); |
| 508 return result; | 509 return result; |
| 509 } | 510 } |
| 510 | 511 |
| 511 function readString(str) | 512 function readString(str) |
| 512 { | 513 { |
| 513 var length = Module._GetStringLength(str); | 514 var length = Module._GetStringLength(str); |
| 514 var pointer = Module._GetStringData(str) >> 1; | 515 var pointer = Module._GetStringData(str) >> 1; |
| 515 return String.fromCharCode.apply(String, HEAP16.slice(pointer, pointer + len gth)); | 516 return String.fromCharCode.apply(String, HEAP16.slice(pointer, pointer + length)); |
| 516 } | 517 } |
| 517 | 518 |
| 518 function createClass(superclass, ref_counted_offset) | 519 function createClass(superclass, ref_counted_offset) |
| 519 { | 520 { |
| 520 var result = function(pointer) | 521 var result = function(pointer) |
| 521 { | 522 { |
| 522 this._pointer = pointer; | 523 this._pointer = pointer; |
| 523 }; | 524 }; |
| 524 if (superclass) | 525 if (superclass) |
| 525 result.prototype = Object.create(superclass.prototype); | 526 result.prototype = Object.create(superclass.prototype); |
| 526 result.prototype.delete = function() | 527 result.prototype.delete = function() |
| 527 { | 528 { |
| 528 Module._ReleaseRef(this._pointer + ref_counted_offset); | 529 Module._ReleaseRef(this._pointer + ref_counted_offset); |
| 529 }; | 530 }; |
| 530 return result; | 531 return result; |
| 531 } | 532 } |
| 532 )"); | 533 )"); |
|
Wladimir Palant
2017/03/15 11:02:48
Surprisingly, this is the only change that was rea
sergei
2017/03/20 17:41:49
Should spaces at the beginning of ` )");` be re
sergei
2017/03/20 17:41:49
Actually the whole last line is removed. I think i
Wladimir Palant
2017/03/21 10:18:59
Luckily, we don't care about the resulting code be
| |
| 533 } | 534 } |
| 534 | 535 |
| 535 void printClass(const ClassInfo& cls) | 536 void printClass(const ClassInfo& cls) |
| 536 { | 537 { |
| 537 DifferentiatorInfo differentiator = cls.subclass_differentiator; | 538 DifferentiatorInfo differentiator = cls.subclass_differentiator; |
| 538 if (differentiator.offset != SIZE_MAX) | 539 if (differentiator.offset != SIZE_MAX) |
| 539 { | 540 { |
| 540 printf("var %s_mapping = \n", cls.name.c_str()); | 541 printf("var %s_mapping = \n", cls.name.c_str()); |
| 541 puts("{"); | 542 puts("{"); |
| 542 for (const auto& item : differentiator.mapping) | 543 for (const auto& item : differentiator.mapping) |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 640 | 641 |
| 641 template<typename ClassType, | 642 template<typename ClassType, |
| 642 typename BaseClass = bindings_internal::NoBaseClass, | 643 typename BaseClass = bindings_internal::NoBaseClass, |
| 643 typename std::enable_if<std::is_base_of<ref_counted, ClassType>::value>::typ e* = nullptr> | 644 typename std::enable_if<std::is_base_of<ref_counted, ClassType>::value>::typ e* = nullptr> |
| 644 class class_ | 645 class class_ |
| 645 { | 646 { |
| 646 public: | 647 public: |
| 647 class_(const char* name) | 648 class_(const char* name) |
| 648 { | 649 { |
| 649 ClassType* ptr = reinterpret_cast<ClassType*>(0x10000000); | 650 ClassType* ptr = reinterpret_cast<ClassType*>(0x10000000); |
| 650 int ref_counted_offset = | 651 ptrdiff_t ref_counted_offset = |
| 651 reinterpret_cast<int>(dynamic_cast<ref_counted*>(ptr)) - | 652 reinterpret_cast<char*>(static_cast<ref_counted*>(ptr)) - |
| 652 reinterpret_cast<int>(ptr); | 653 reinterpret_cast<char*>(ptr); |
| 653 bindings_internal::register_class(name, | 654 bindings_internal::register_class(name, |
| 654 bindings_internal::TypeInfo<ClassType>(), | 655 bindings_internal::TypeInfo<ClassType>(), |
| 655 bindings_internal::TypeInfo<BaseClass>(), | 656 bindings_internal::TypeInfo<BaseClass>(), |
| 656 ref_counted_offset | 657 ref_counted_offset |
| 657 ); | 658 ); |
| 658 } | 659 } |
| 659 | 660 |
| 660 template<typename FieldType> | 661 template<typename FieldType> |
| 661 const class_& property(const char* name, | 662 const class_& property(const char* name, |
| 662 FieldType (ClassType::*getter)() const, | 663 FieldType (ClassType::*getter)() const, |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 718 | 719 |
| 719 std::vector<std::pair<int, std::string>> mapping; | 720 std::vector<std::pair<int, std::string>> mapping; |
| 720 for (const auto& item : list) | 721 for (const auto& item : list) |
| 721 mapping.emplace_back(item.first, item.second); | 722 mapping.emplace_back(item.first, item.second); |
| 722 | 723 |
| 723 bindings_internal::register_differentiator( | 724 bindings_internal::register_differentiator( |
| 724 bindings_internal::TypeInfo<ClassType>(), offset, mapping); | 725 bindings_internal::TypeInfo<ClassType>(), offset, mapping); |
| 725 return *this; | 726 return *this; |
| 726 } | 727 } |
| 727 }; | 728 }; |
| LEFT | RIGHT |