| Index: compiled/bindings.ipp |
| =================================================================== |
| --- a/compiled/bindings.ipp |
| +++ b/compiled/bindings.ipp |
| @@ -468,25 +468,19 @@ namespace bindings_internal |
| auto it = classes.find(call.pointerType); |
| if (it == classes.end()) |
| throw std::runtime_error("Function " + std::string(call.name) + " returns pointer to unknown class"); |
| const ClassInfo& cls = it->second; |
| auto offset = cls.subclass_differentiator.offset; |
| if (offset == SIZE_MAX) |
| - result += " result = " + cls.name + "(result);\n"; |
| + result += " result = exports." + cls.name + "(result);\n"; |
| else |
| - { |
| - result += " var type = HEAP32[result + " + std::to_string(offset)+ " >> 2];\n"; |
| - result += " if (type in " + cls.name + "_mapping)\n"; |
| - result += " result = new (exports[" + cls.name + "_mapping[type]])(result);\n"; |
| - result += " else\n"; |
| - result += " throw new Error('Unexpected " + cls.name + " type: ' + type);\n"; |
| - } |
| + result += " result = exports." + cls.name + ".fromPointer(result);\n"; |
| result += " }\n"; |
| result += " else\n"; |
| result += " result = null;\n"; |
| return result; |
| } |
| default: |
| throw std::runtime_error("Unexpected return type for " + std::string(call.name)); |
| @@ -600,29 +594,44 @@ namespace bindings_internal |
| }; |
| return result; |
| } |
| )"); |
| } |
| void printClass(const ClassInfo& cls) |
| { |
| + printf("exports.%s = createClass(%s, %i);\n", cls.name.c_str(), |
| + (cls.baseClass ? ("exports." + cls.baseClass->name).c_str() : "null"), |
| + cls.ref_counted_offset); |
| + |
| DifferentiatorInfo differentiator = cls.subclass_differentiator; |
| if (differentiator.offset != SIZE_MAX) |
| { |
| printf("var %s_mapping = \n", cls.name.c_str()); |
| puts("{"); |
| for (const auto& item : differentiator.mapping) |
| printf(" %i: '%s',\n", item.first, item.second.c_str()); |
| puts("};"); |
| - } |
| - printf("exports.%s = createClass(%s, %i);\n", cls.name.c_str(), |
| - (cls.baseClass ? ("exports." + cls.baseClass->name).c_str() : "null"), |
| - cls.ref_counted_offset); |
| + printf("exports.%s.fromPointer = function(ptr)\n", cls.name.c_str()); |
| + puts("{"); |
| + printf(" var type = HEAP32[ptr + %i >> 2];\n", differentiator.offset); |
| + printf(" if (type in %s_mapping)\n", cls.name.c_str()); |
| + printf(" return new (exports[%s_mapping[type]])(ptr);\n", cls.name.c_str()); |
| + printf(" throw new Error('Unexpected %s type: ' + type);\n", cls.name.c_str()); |
| + puts("};"); |
| + } |
| + else |
| + { |
| + printf("exports.%s.fromPointer = function(ptr)\n", cls.name.c_str()); |
| + puts("{"); |
| + printf(" return new exports.%s(ptr);\n", cls.name.c_str()); |
| + puts("};"); |
| + } |
| for (const auto& item : cls.properties) |
| { |
| printf("Object.defineProperty(exports.%s.prototype, '%s', {%s});\n", |
| cls.name.c_str(), item.name.c_str(), |
| generatePropertyDescriptor(item).c_str()); |
| } |