{% extends 'interface_base_cpp.template' %} {# TODO(terry): Implement setter and deleter too #} {##############################################################################} {% block named_property_getter %} {% if named_property_getter and not named_property_getter.is_custom %} static void namedPropertyGetter(Dart_NativeArguments args) { {{cpp_class}}* /* FIXME(vsm): Remove this. */ ALLOW_UNUSED receiver = GetReceiver<{{cpp_class}}>(args); Dart_Handle exception = nullptr; { {% if named_property_getter.is_raises_exception %} ExceptionState es; {% endif %} String name = DartConverter::FromArguments(args, 1, exception); if (exception) goto fail; {{named_property_getter.cpp_type}} result = {{named_property_getter.cpp_value}}; if (!result) return; {{named_property_getter.dart_set_return_value}}; return; } fail: Dart_ThrowException(exception); ASSERT_NOT_REACHED(); } {% endif %} {% endblock %} {##############################################################################} {% block named_property_setter %} {% if named_property_setter and not named_property_setter.is_custom %} static void namedPropertySetter(Dart_NativeArguments args) { {{cpp_class}}* /* FIXME(vsm): Remove this. */ ALLOW_UNUSED receiver = GetReceiver<{{cpp_class}}>(args); Dart_Handle exception = nullptr; { {% if named_property_setter.is_raises_exception %} ExceptionState es; {% endif %} String name = DartConverter::FromArguments(args, 1, exception); if (exception) goto fail; String value = DartConverter::FromArgumentsWithNullCheck(args, 2, exception); if (exception) goto fail; {{named_property_setter.cpp_value}}; return; } fail: Dart_ThrowException(exception); ASSERT_NOT_REACHED(); } {% endif %} {% endblock %} {##############################################################################} {% block indexed_property_getter %} {% if indexed_property_getter and not indexed_property_getter.is_custom %} {% set getter = indexed_property_getter %} static void indexedPropertyGetter(Dart_NativeArguments args) { {{cpp_class}}* /* FIXME(vsm): Remove this. */ ALLOW_UNUSED receiver = GetReceiver<{{cpp_class}}>(args); Dart_Handle exception = nullptr; { {% if indexed_property_getter.is_raises_exception %} ExceptionState es; {% endif %} {# TODO(terry): Assume index is unsigned long, which all currently are. #} unsigned index = DartConverter::FromArguments(args, 1, exception); if (exception) goto fail; {{indexed_property_getter.cpp_type}} result = {{indexed_property_getter.cpp_value}}; if (!result) return; {{indexed_property_getter.dart_set_return_value}}; return; } fail: Dart_ThrowException(exception); ASSERT_NOT_REACHED(); } {% endif %} {# TODO(terry): Should handle custom index getter - none today. #} {% endblock %} {##############################################################################} {% block indexed_property_getter_resolver %} {# TODO(terry): Support all indexed and named properties today only indexed getter is supported. #} {# Resolver indexed properties #} {% if indexed_property_getter and not indexed_property_getter.is_custom %} {% for native_entry in indexed_property_getter.native_entries %} {% set resolver_string = native_entry.resolver_string %} if (argumentCount == 2 && name == "{{resolver_string}}") { *autoSetupScope = true; return {{dart_class}}Internal::indexedPropertyGetter; } {% endfor %} {% endif %} {% endblock %} {##############################################################################} {% block named_property_getter_resolver %} {# Resolver named properties #} {% if named_property_getter and not named_property_getter.is_custom %} {% for native_entry in named_property_getter.native_entries %} {% set resolver_string = native_entry.resolver_string %} if (argumentCount == 2 && (name == "{{resolver_string}}")) { *autoSetupScope = true; return {{dart_class}}Internal::namedPropertyGetter; } {% endfor %} {% endif %} {% endblock %} {##############################################################################} {% block named_property_setter_resolver %} {# Resolver named properties #} {% if named_property_setter and not named_property_setter.is_custom %} {% for native_entry in named_property_setter.native_entries %} {% set resolver_string = native_entry.resolver_string %} if (argumentCount == 3 && (name == "{{resolver_string}}")) { *autoSetupScope = true; return {{dart_class}}Internal::namedPropertySetter; } {% endfor %} {% endif %} {% endblock %} {##############################################################################} {% block generate_symbolizer_indexed_property_getter %} {% if indexed_property_getter and not indexed_property_getter.is_custom %} {% for native_entry in indexed_property_getter.native_entries %} {% set resolver_string = native_entry.resolver_string %} if (native_function == {{dart_class}}Internal::indexedPropertyGetter) { return reinterpret_cast("{{resolver_string}}"); } {% endfor %} {% endif %} {% endblock %} {##############################################################################} {% block generate_symbolizer_named_property_getter %} {% if named_property_getter %} {% for native_entry in named_property_getter.native_entries %} {% set resolver_string = native_entry.resolver_string %} if (native_function == {{dart_class}}Internal::namedPropertyGetter) { return reinterpret_cast("{{resolver_string}}"); } {% endfor %} {% endif %} {% endblock %} {##############################################################################} {% block generate_symbolizer_named_property_setter %} {% if named_property_setter %} {% for native_entry in named_property_setter.native_entries %} {% set resolver_string = native_entry.resolver_string %} if (native_function == {{dart_class}}Internal::namedPropertySetter) { return reinterpret_cast("{{resolver_string}}"); } {% endfor %} {% endif %} {% endblock %} {##############################################################################} {% from 'methods_cpp.template' import static_method_name with context %} {##############################################################################} {% block overloaded_constructor %} {% if constructor_overloads %} static void constructorCallbackDispatcher(Dart_NativeArguments args) { Dart_Handle exception = nullptr; const int argOffset = 0; int argCount = Dart_GetNativeArgumentCount(args) + argOffset; {# 2. Initialize argcount to be min(maxarg, n). #} switch (std::min({{constructor_overloads.maxarg}}, argCount)) { {# 3. Remove from S all entries whose type list is not of length argcount. #} {% for length, tests_constructors in constructor_overloads.length_tests_methods %} case {{length}}: {# Then resolve by testing argument #} {% for test, constructor in tests_constructors %} {# 10. If i = d, then: #} if ({{test}}) { {% if constructor.is_custom %} {{static_method_name(constructor.name)}}(args); {% else %} {{static_method_name(constructor.name, constructor.overload_index)}}(args); {% endif %} return; } {% endfor %} break; {% endfor %} default: {# Invalid arity, throw error #} {# Report full list of valid arities if gaps and above minimum #} {% if constructor_overloads.valid_arities %} if (argCount >= {{overloads.minarg}}) { const String message = "Wrong arity, expected one of {{constructor_overloads.valid_arities}}"; // TODO(dart): exception = DartUtilities::coreArgumentErrorException(message); goto fail; } {% endif %} {# Otherwise just report "not enough arguments" #} { const String message = "Not enough arguments (at least {{constructor_overloads.minarg}} required)"; // TODO(dart): exception = DartUtilities::coreArgumentErrorException(message); goto fail; } return; } {# No match, throw error #} { const String message = "No matching constructor signature."; // TODO(dart): exception = DartUtilities::coreArgumentErrorException(message); goto fail; } return; fail: Dart_ThrowException(exception); ASSERT_NOT_REACHED(); } {% endif %} {% endblock %} {##############################################################################}