Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(303)

Unified Diff: Source/bindings/dart/scripts/dart_types.py

Issue 469373002: Bindings generation emits (more) correct null checking (Closed) Base URL: svn://svn.chromium.org/blink/branches/dart/dartium
Patch Set: Adding in fixes to binding generation Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: Source/bindings/dart/scripts/dart_types.py
diff --git a/Source/bindings/dart/scripts/dart_types.py b/Source/bindings/dart/scripts/dart_types.py
index d7d94bceca3946677d8abca6b567f69d77fc6ab0..1ca39fb5ae9a44b5e34c20896ebf70bda7c50533 100644
--- a/Source/bindings/dart/scripts/dart_types.py
+++ b/Source/bindings/dart/scripts/dart_types.py
@@ -399,7 +399,7 @@ DART_TO_CPP_VALUE = {
}
-def dart_value_to_cpp_value(idl_type, extended_attributes, variable_name,
+def dart_value_to_cpp_value(idl_type, interface_extended_attributes, extended_attributes, variable_name,
null_check, index, auto_scope=True):
# Composite types
array_or_sequence_type = idl_type.array_or_sequence_type
@@ -425,7 +425,8 @@ def dart_value_to_cpp_value(idl_type, extended_attributes, variable_name,
# FIXME(vsm): When do we call the externalized version? E.g., see
# bindings/dart/custom/DartWaveShaperNodeCustom.cpp - it calls
# DartUtilities::dartToExternalizedArrayBufferView instead.
- cpp_expression_format = ('DartUtilities::dartTo{idl_type}{null_check}(args, {index}, exception)')
+ # V8 always converts null here
+ cpp_expression_format = ('DartUtilities::dartTo{idl_type}WithNullCheck(args, {index}, exception)')
elif idl_type.is_callback_interface:
cpp_expression_format = ('Dart{idl_type}::create{null_check}(args, {index}, exception)')
else:
@@ -435,8 +436,7 @@ def dart_value_to_cpp_value(idl_type, extended_attributes, variable_name,
# some cases that require calling context info. V8 handles all
# of this differently, and we may wish to reconsider this approach
null_check = 'WithNullCheck' \
- if null_check or allow_null(idl_type, extended_attributes) else ''
-
+ if null_check or allow_null(idl_type, interface_extended_attributes, extended_attributes) else ''
return cpp_expression_format.format(null_check=null_check,
arguments=arguments,
index=index,
@@ -469,14 +469,14 @@ def dart_value_to_cpp_value_array_or_sequence(array_or_sequence_type, variable_n
return expression
-def dart_value_to_local_cpp_value(idl_type, extended_attributes, variable_name,
- null_check, index=None, auto_scope=True):
+def dart_value_to_local_cpp_value(idl_type, interface_extended_attributes, extended_attributes,
+ variable_name, null_check, index=None, auto_scope=True):
"""Returns an expression that converts a Dart value to a C++ value as a local value."""
idl_type = idl_type.preprocessed_type
cpp_value = dart_value_to_cpp_value(
- idl_type, extended_attributes, variable_name, null_check, index,
- auto_scope)
+ idl_type, interface_extended_attributes, extended_attributes,
+ variable_name, null_check, index, auto_scope)
return cpp_value
@@ -753,22 +753,43 @@ IdlType.name = property(dart_name)
IdlUnionType.name = property(dart_name)
+def typechecked_interface(extended_attributes):
+ return ('TypeChecking' in extended_attributes and\
+ DartUtilities.extended_attribute_value_contains(extended_attributes['TypeChecking'], 'Interface'))
+
+
+def typechecked_argument(idl_type, interface_extended_attributes, extended_attributes):
+ return (idl_type.is_wrapper_type and
+ (typechecked_interface(interface_extended_attributes) or
+ (typechecked_interface(extended_attributes))))
+
+
# If True use the WithNullCheck version when converting.
-def allow_null(idl_type, extended_attributes):
+def allow_null(idl_type, interface_extended_attributes, extended_attributes):
+ if idl_type.base_type in ('DOMString', 'ByteString', 'ScalarValueString'):
+ # This logic is in cpp_types in v8_types.py, since they handle
+ # this using the V8StringResource type. We handle it here
+ if (extended_attributes.get('TreatNullAs') == 'NullString' or
+ extended_attributes.get('TreatUndefinedAs') == 'NullString'):
+ return True
+
+ if extended_attributes.get('Default') == 'NullString':
+ return True
- # This logic is implemented in the methods.cpp template in V8
- if idl_type.is_nullable:
- return True
+ if extended_attributes.get('Default') == 'Undefined':
+ return True
- if extended_attributes.get('Default') == 'NullString':
- return True
+ if idl_type.is_nullable:
+ return True
+
+ return False
+ else:
+ # This logic is implemented in the methods.cpp template in V8
+ if (idl_type.is_nullable or
+ (not typechecked_argument(idl_type, interface_extended_attributes, extended_attributes))):
+ return True
- if extended_attributes.get('Default') == 'Undefined':
- return True
+ if extended_attributes.get('Default') == 'Undefined':
+ return True
- # This logic is in cpp_types in v8_types.py, since they handle
- # this using the V8StringResource type. We handle it here
- if (extended_attributes.get('TreatNullAs') == 'NullString' or
- extended_attributes.get('TreatUndefinedAs') == 'NullString'):
- return True
- return False
+ return False
« no previous file with comments | « Source/bindings/dart/scripts/dart_methods.py ('k') | Source/bindings/dart/scripts/templates/interface_h.template » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698