Index: tools/json_schema_compiler/cc_generator.py |
diff --git a/tools/json_schema_compiler/cc_generator.py b/tools/json_schema_compiler/cc_generator.py |
index 0904e39b366cd0ea6b6a7a1efab5174039f22af8..267d9fe8f106a4368a726cd1432e3cb2e10344fe 100644 |
--- a/tools/json_schema_compiler/cc_generator.py |
+++ b/tools/json_schema_compiler/cc_generator.py |
@@ -43,6 +43,7 @@ class _Generator(object): |
.Append() |
.Append(self._util_cc_helper.GetIncludePath()) |
.Append('#include "base/logging.h"') |
+ .Append('#include "base/memory/ptr_util.h"') |
.Append('#include "base/strings/string_number_conversions.h"') |
.Append('#include "base/strings/utf_string_conversions.h"') |
.Append('#include "%s/%s.h"' % |
@@ -317,7 +318,7 @@ class _Generator(object): |
c.Append('const base::DictionaryValue* dict = ' |
'static_cast<const base::DictionaryValue*>(&value);') |
if self._generate_error_messages: |
- c.Append('std::set<std::string> keys;') |
+ c.Append('std::set<std::string> keys;') |
for prop in type_.properties.itervalues(): |
c.Concat(self._InitializePropertyToDefault(prop, 'out')) |
for prop in type_.properties.itervalues(): |
@@ -508,20 +509,12 @@ class _Generator(object): |
# Enums cannot be wrapped with scoped_ptr, but the XXX_NONE enum value |
# is equal to 0. |
(c.Sblock('if (%s) {' % choice_var) |
- .Append('DCHECK(!result) << "Cannot set multiple choices for %s";' % |
- type_.unix_name) |
- .Cblock(self._CreateValueFromType('result.reset(%s);', |
- choice.name, |
- choice, |
- choice_var, |
- True)) |
- .Eblock('}') |
- ) |
+ .Append('DCHECK(!result) << "Cannot set multiple choices for %s";' % |
+ type_.unix_name).Cblock(self._CreateValueFromType( |
+ 'result = %s;', choice.name, choice, choice_var, True)) |
+ .Eblock('}')) |
(c.Append('DCHECK(result) << "Must set at least one choice for %s";' % |
- type_.unix_name) |
- .Append('return result;') |
- .Eblock('}') |
- ) |
+ type_.unix_name).Append('return result;').Eblock('}')) |
return c |
def _GenerateFunction(self, function): |
@@ -570,7 +563,7 @@ class _Generator(object): |
def _CreateValueFromType(self, code, prop_name, type_, var, is_ptr=False): |
"""Creates a base::Value given a type. Generated code passes ownership |
- to caller. |
+ to caller via std::unique_ptr. |
var: variable or variable* |
@@ -624,21 +617,22 @@ class _Generator(object): |
if (underlying_type.property_type == PropertyType.CHOICES or |
underlying_type.property_type == PropertyType.OBJECT): |
if is_ptr: |
- return '(%s)->ToValue().release()' % var |
+ return '(%s)->ToValue()' % var |
else: |
- return '(%s).ToValue().release()' % var |
+ return '(%s).ToValue()' % var |
elif (underlying_type.property_type == PropertyType.ANY or |
underlying_type.property_type == PropertyType.FUNCTION): |
if is_ptr: |
vardot = '(%s)->' % var |
else: |
vardot = '(%s).' % var |
- return '%sDeepCopy()' % vardot |
+ return '%sCreateDeepCopy()' % vardot |
elif underlying_type.property_type == PropertyType.ENUM: |
maybe_namespace = '' |
if type_.property_type == PropertyType.REF: |
maybe_namespace = '%s::' % underlying_type.namespace.unix_name |
- return 'new base::StringValue(%sToString(%s))' % (maybe_namespace, var) |
+ return 'base::WrapUnique(new base::StringValue(%sToString(%s)))' % ( |
+ maybe_namespace, var) |
elif underlying_type.property_type == PropertyType.BINARY: |
if is_ptr: |
vardot = var + '->' |
@@ -647,16 +641,16 @@ class _Generator(object): |
return ('base::BinaryValue::CreateWithCopiedBuffer(%sdata(),' |
' %ssize())' % (vardot, vardot)) |
elif underlying_type.property_type == PropertyType.ARRAY: |
- return '%s.release()' % self._util_cc_helper.CreateValueFromArray( |
+ return '%s' % self._util_cc_helper.CreateValueFromArray( |
var, |
is_ptr) |
elif underlying_type.property_type.is_fundamental: |
if is_ptr: |
var = '*%s' % var |
if underlying_type.property_type == PropertyType.STRING: |
- return 'new base::StringValue(%s)' % var |
+ return 'base::WrapUnique(new base::StringValue(%s))' % var |
else: |
- return 'new base::FundamentalValue(%s)' % var |
+ return 'base::WrapUnique(new base::FundamentalValue(%s))' % var |
else: |
raise NotImplementedError('Conversion of %s to base::Value not ' |
'implemented' % repr(type_.type_)) |
@@ -840,7 +834,7 @@ class _Generator(object): |
if is_ptr: |
c.Append('%(dst_var)s.reset(new base::DictionaryValue());') |
elif underlying_type.property_type == PropertyType.ANY: |
- c.Append('%(dst_var)s.reset(%(src_var)s->DeepCopy());') |
+ c.Append('%(dst_var)s = %(src_var)s->CreateDeepCopy();') |
elif underlying_type.property_type == PropertyType.ARRAY: |
# util_cc_helper deals with optional and required arrays |
(c.Append('const base::ListValue* list = NULL;') |