summaryrefslogtreecommitdiffstats
path: root/mojo
diff options
context:
space:
mode:
authormpcomplete@chromium.org <mpcomplete@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-01-24 22:56:19 +0000
committermpcomplete@chromium.org <mpcomplete@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2014-01-24 22:56:19 +0000
commitb2c99dd3bd217083fafaca9964e1a89f323ba232 (patch)
tree303f34266f1c365976d17426d446d5f8d6ef933e /mojo
parentb4aaf71e921f4b31d7199dbb9a24f237c03330a2 (diff)
downloadchromium_src-b2c99dd3bd217083fafaca9964e1a89f323ba232.zip
chromium_src-b2c99dd3bd217083fafaca9964e1a89f323ba232.tar.gz
chromium_src-b2c99dd3bd217083fafaca9964e1a89f323ba232.tar.bz2
Support default values for arrays of POD data types in mojom.
TODO: defaults values for structs BUG=320082 Review URL: https://codereview.chromium.org/141893004 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@246994 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'mojo')
-rw-r--r--mojo/public/bindings/generators/cpp_templates/struct_builder_definition.tmpl8
-rw-r--r--mojo/public/bindings/generators/mojom_cpp_generator.py1
-rw-r--r--mojo/public/bindings/generators/mojom_js_generator.py7
-rwxr-xr-xmojo/public/bindings/pylib/parse/mojo_parser.py18
-rw-r--r--mojo/public/bindings/sample/sample_service_unittests.js5
-rw-r--r--mojo/public/tests/bindings/sample_service.mojom2
-rw-r--r--mojo/public/tests/bindings/sample_service_unittest.cc4
7 files changed, 43 insertions, 2 deletions
diff --git a/mojo/public/bindings/generators/cpp_templates/struct_builder_definition.tmpl b/mojo/public/bindings/generators/cpp_templates/struct_builder_definition.tmpl
index 3841f4d..e1fc09e 100644
--- a/mojo/public/bindings/generators/cpp_templates/struct_builder_definition.tmpl
+++ b/mojo/public/bindings/generators/cpp_templates/struct_builder_definition.tmpl
@@ -9,6 +9,14 @@
{%- macro set_default(field) -%}
{%- if field.kind|is_string_kind -%}
set_{{field.name}}(mojo::String({{field.default}}));
+{%- elif field.kind|is_array_kind -%}
+{
+ {{field.kind|cpp_wrapper_type}}::Builder tmp({{field.default|length}});
+{%- for element in field.default %}
+ tmp[{{loop.index0}}] = {{element}};
+{%- endfor %}
+ set_{{field.name}}(tmp.Finish());
+}
{%- elif field.kind|is_object_kind -%}
{
{{field.kind|cpp_wrapper_type}}::Builder tmp;
diff --git a/mojo/public/bindings/generators/mojom_cpp_generator.py b/mojo/public/bindings/generators/mojom_cpp_generator.py
index 2532841..b8067b3 100644
--- a/mojo/public/bindings/generators/mojom_cpp_generator.py
+++ b/mojo/public/bindings/generators/mojom_cpp_generator.py
@@ -107,6 +107,7 @@ class Generator(mojom_generator.Generator):
"is_handle_kind": mojom_generator.IsHandleKind,
"is_object_kind": mojom_generator.IsObjectKind,
"is_string_kind": mojom_generator.IsStringKind,
+ "is_array_kind": lambda kind: isinstance(kind, mojom.Array),
"is_struct_with_handles": IsStructWithHandles,
"struct_size": lambda ps: ps.GetTotalSize() + _HEADER_SIZE,
"struct_from_method": mojom_generator.GetStructFromMethod,
diff --git a/mojo/public/bindings/generators/mojom_js_generator.py b/mojo/public/bindings/generators/mojom_js_generator.py
index 0596e88..427ae99 100644
--- a/mojo/public/bindings/generators/mojom_js_generator.py
+++ b/mojo/public/bindings/generators/mojom_js_generator.py
@@ -33,7 +33,12 @@ _kind_to_javascript_default_value = {
def JavaScriptDefaultValue(field):
if field.default:
- return field.default
+ if isinstance(field.default, list):
+ # TODO(mpcomplete): This will need to be more sophisticated to support
+ # arrays of objects/arrays.
+ return "[" + ", ".join(field.default) + "]"
+ else:
+ return field.default
if field.kind in mojom.PRIMITIVES:
return _kind_to_javascript_default_value[field.kind]
if isinstance(field.kind, mojom.Struct):
diff --git a/mojo/public/bindings/pylib/parse/mojo_parser.py b/mojo/public/bindings/pylib/parse/mojo_parser.py
index 71da823..ccdf828 100755
--- a/mojo/public/bindings/pylib/parse/mojo_parser.py
+++ b/mojo/public/bindings/pylib/parse/mojo_parser.py
@@ -100,6 +100,7 @@ class Parser(object):
def p_default(self, p):
"""default : EQUALS expression
+ | EQUALS expression_array
| """
if len(p) > 2:
p[0] = p[2]
@@ -189,6 +190,23 @@ class Parser(object):
### Expressions ###
+ def p_expression_array(self, p):
+ """expression_array : expression
+ | LBRACKET expression_array_elements RBRACKET """
+ if len(p) < 3:
+ p[0] = p[1]
+ else:
+ p[0] = p[2]
+
+ def p_expression_array_elements(self, p):
+ """expression_array_elements : expression
+ | expression COMMA expression_array_elements
+ | """
+ if len(p) == 2:
+ p[0] = ListFromConcat(p[1])
+ elif len(p) > 3:
+ p[0] = ListFromConcat(p[1], p[3])
+
def p_expression(self, p):
"""expression : conditional_expression"""
p[0] = p[1]
diff --git a/mojo/public/bindings/sample/sample_service_unittests.js b/mojo/public/bindings/sample/sample_service_unittests.js
index 1a8400a..9b9165d 100644
--- a/mojo/public/bindings/sample/sample_service_unittests.js
+++ b/mojo/public/bindings/sample/sample_service_unittests.js
@@ -93,6 +93,11 @@ define([
var foo = new sample.Foo();
expect(foo.name).toBe("Fooby");
expect(foo.a).toBeTruthy();
+
+ expect(foo.data.length).toBe(3);
+ expect(foo.data[0]).toBe(1);
+ expect(foo.data[1]).toBe(2);
+ expect(foo.data[2]).toBe(3);
}
function ServiceImpl() {
diff --git a/mojo/public/tests/bindings/sample_service.mojom b/mojo/public/tests/bindings/sample_service.mojom
index 267ee62..b7d328a 100644
--- a/mojo/public/tests/bindings/sample_service.mojom
+++ b/mojo/public/tests/bindings/sample_service.mojom
@@ -28,7 +28,7 @@ struct Foo {
bool c @4;
Bar bar @5;
Bar[] extra_bars @7;
- uint8[] data @6;
+ uint8[] data = [1,2,3] @6;
handle<message_pipe> source @9;
handle<data_pipe_consumer>[] input_streams @10;
handle<data_pipe_producer>[] output_streams @11;
diff --git a/mojo/public/tests/bindings/sample_service_unittest.cc b/mojo/public/tests/bindings/sample_service_unittest.cc
index b6a75e5..62b144b 100644
--- a/mojo/public/tests/bindings/sample_service_unittest.cc
+++ b/mojo/public/tests/bindings/sample_service_unittest.cc
@@ -321,6 +321,10 @@ TEST(BindingsSampleTest, DefaultValues) {
ASSERT_FALSE(foo.name().is_null());
EXPECT_EQ("Fooby", foo.name().To<std::string>());
EXPECT_TRUE(foo.a());
+ EXPECT_EQ(3u, foo.data().size());
+ EXPECT_EQ(1, foo.data()[0]);
+ EXPECT_EQ(2, foo.data()[1]);
+ EXPECT_EQ(3, foo.data()[2]);
}
} // namespace sample