blob: 839ae2716bac7c3fdabb5022a8ccdd2ed86d2730 [file] [log] [blame]
{% 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<String>::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<String>::FromArguments(args, 1, exception);
if (exception)
goto fail;
String value = DartConverter<String>::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<unsigned>::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<const uint8_t*>("{{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<const uint8_t*>("{{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<const uint8_t*>("{{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 %}
{##############################################################################}