Commit d0427507 authored by Yuki Shiino's avatar Yuki Shiino Committed by Commit Bot

v8binding: Fix use of zero-length variable length arrays

Fix the bindings generator so that it won't use variable length
arrays with zero sizes, which are forbidden by C++ standard.

Bug: 932489
Change-Id: Ife08fe8be4e6b9907c3c97c8047c0432cdddd4bc
Reviewed-on: https://chromium-review.googlesource.com/c/1490985
Commit-Queue: Yuki Shiino <yukishiino@chromium.org>
Reviewed-by: default avatarKentaro Hara <haraken@chromium.org>
Reviewed-by: default avatarHitoshi Yoshida <peria@chromium.org>
Cr-Commit-Position: refs/heads/master@{#636796}
parent e5844276
......@@ -192,13 +192,18 @@
{% set has_variadic_argument = arguments[-1].is_variadic %}
{% set non_variadic_arguments = arguments | rejectattr('is_variadic') | list %}
{% set variadic_argument = arguments[-1] if has_variadic_argument else None %}
{% set arguments_length = '%d + %s.size()' % (non_variadic_arguments|length, variadic_argument.name) if has_variadic_argument else non_variadic_arguments|length %}
{% for argument in non_variadic_arguments %}
v8::Local<v8::Value> {{argument.v8_name}} = {{argument.cpp_value_to_v8_value}};
{% endfor %}
{% if has_variadic_argument %}
const int argc = {{arguments_length}};
v8::Local<v8::Value> argv[argc];
// Secure one element at least in |argv| to avoid the following restriction.
//
// C++14 8.3.4 Arrays
// If the constant-expression (5.19) is present, it shall be a converted
// constant expression of type std::size_t and its value shall be greater than
// zero.
const int argc = {{non_variadic_arguments|length}} + {{variadic_argument.name}}.size();
v8::Local<v8::Value> argv[std::max(1, argc)];
{% for argument in non_variadic_arguments %}
argv[{{loop.index0}}] = {{argument.v8_name}};
{% endfor %}
......@@ -206,7 +211,7 @@
argv[{{non_variadic_arguments|length}} + i] = ToV8({{variadic_argument.name}}[i], argument_creation_context, GetIsolate());
}
{% else %}{# if has_variadic_argument #}
constexpr int argc = {{arguments_length}};
constexpr int argc = {{non_variadic_arguments|length}};
v8::Local<v8::Value> argv[] = { {{non_variadic_arguments | join(', ', 'v8_name')}} };
static_assert(static_cast<size_t>(argc) == base::size(argv), "size mismatch");
{% endif %}
......
......@@ -84,8 +84,14 @@ v8::Maybe<ScriptValue> V8AnyCallbackFunctionVariadicAnyArgs::Invoke(bindings::V8
v8::Local<v8::Object> argument_creation_context =
callback_relevant_script_state->GetContext()->Global();
ALLOW_UNUSED_LOCAL(argument_creation_context);
// Secure one element at least in |argv| to avoid the following restriction.
//
// C++14 8.3.4 Arrays
// If the constant-expression (5.19) is present, it shall be a converted
// constant expression of type std::size_t and its value shall be greater than
// zero.
const int argc = 0 + arguments.size();
v8::Local<v8::Value> argv[argc];
v8::Local<v8::Value> argv[std::max(1, argc)];
for (wtf_size_t i = 0; i < arguments.size(); ++i) {
argv[0 + i] = ToV8(arguments[i], argument_creation_context, GetIsolate());
}
......@@ -185,8 +191,14 @@ v8::Maybe<ScriptValue> V8AnyCallbackFunctionVariadicAnyArgs::Construct(const Vec
v8::Local<v8::Object> argument_creation_context =
callback_relevant_script_state->GetContext()->Global();
ALLOW_UNUSED_LOCAL(argument_creation_context);
// Secure one element at least in |argv| to avoid the following restriction.
//
// C++14 8.3.4 Arrays
// If the constant-expression (5.19) is present, it shall be a converted
// constant expression of type std::size_t and its value shall be greater than
// zero.
const int argc = 0 + arguments.size();
v8::Local<v8::Value> argv[argc];
v8::Local<v8::Value> argv[std::max(1, argc)];
for (wtf_size_t i = 0; i < arguments.size(); ++i) {
argv[0 + i] = ToV8(arguments[i], argument_creation_context, GetIsolate());
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment