Bug 1026080 part 2. Add binding codegen support for [] as a default value for sequence arguments and dictionary entries. r=khuey

This commit is contained in:
Boris Zbarsky 2014-06-23 16:03:57 -04:00
parent 6c70fe8c81
commit f8dc563a90
5 changed files with 28 additions and 11 deletions

View File

@ -10,7 +10,7 @@ import string
import math
import textwrap
from WebIDL import BuiltinTypes, IDLBuiltinType, IDLNullValue, IDLSequenceType, IDLType, IDLAttribute, IDLUndefinedValue
from WebIDL import BuiltinTypes, IDLBuiltinType, IDLNullValue, IDLSequenceType, IDLType, IDLAttribute, IDLUndefinedValue, IDLEmptySequenceValue
from Configuration import NoSuchDescriptorError, getTypesFromDescriptor, getTypesFromDictionary, getTypesFromCallback, Descriptor
AUTOGENERATED_WARNING_COMMENT = \
@ -3579,14 +3579,6 @@ def getJSToNativeConversionInfo(type, descriptorProvider, failureCode=None,
indent(setDefault) +
"}\n")
# A helper function for handling null default values. Much like
# handleDefault, but checks that the default value, if it exists, is null.
def handleDefaultNull(template, codeToSetNull):
if (defaultValue is not None and
not isinstance(defaultValue, IDLNullValue)):
raise TypeError("Can't handle non-null default value here")
return handleDefault(template, codeToSetNull)
# A helper function for wrapping up the template body for
# possibly-nullable objecty stuff
def wrapObjectTemplate(templateBody, type, codeToSetNull, failureCode=None):
@ -3623,8 +3615,12 @@ def getJSToNativeConversionInfo(type, descriptorProvider, failureCode=None,
elifBody=elifBody,
failureBody=onFailureNotAnObject(failureCode).define())
if type.nullable():
templateBody = handleDefaultNull(templateBody, codeToSetNull)
if isinstance(defaultValue, IDLNullValue):
assert type.nullable() # Parser should enforce this
templateBody = handleDefault(templateBody, codeToSetNull)
elif isinstance(defaultValue, IDLEmptySequenceValue):
# Our caller will handle it
pass
else:
assert defaultValue is None
@ -3763,6 +3759,13 @@ def getJSToNativeConversionInfo(type, descriptorProvider, failureCode=None,
templateBody = wrapObjectTemplate(templateBody, type,
"${declName}.SetNull();\n", notSequence)
if isinstance(defaultValue, IDLEmptySequenceValue):
if type.nullable():
codeToSetEmpty = "${declName}.SetValue();\n"
else:
codeToSetEmpty = "/* Array is already empty; nothing to do */\n"
templateBody = handleDefault(templateBody, codeToSetEmpty)
# Sequence arguments that might contain traceable things need
# to get traced
if not isMember and typeNeedsRooting(elementType):

View File

@ -379,8 +379,10 @@ public:
void PassCastableObjectNullableSequence(const Nullable< Sequence< OwningNonNull<TestInterface> > >&);
void PassNullableCastableObjectNullableSequence(const Nullable< Sequence< nsRefPtr<TestInterface> > >&);
void PassOptionalSequence(const Optional<Sequence<int32_t> >&);
void PassOptionalSequenceWithDefaultValue(const Sequence<int32_t> &);
void PassOptionalNullableSequence(const Optional<Nullable<Sequence<int32_t> > >&);
void PassOptionalNullableSequenceWithDefaultValue(const Nullable< Sequence<int32_t> >&);
void PassOptionalNullableSequenceWithDefaultValue2(const Nullable< Sequence<int32_t> >&);
void PassOptionalObjectSequence(const Optional<Sequence<OwningNonNull<TestInterface> > >&);
void PassExternalInterfaceSequence(const Sequence<nsRefPtr<TestExternalInterface> >&);
void PassNullableExternalInterfaceSequence(const Sequence<nsRefPtr<TestExternalInterface> >&);

View File

@ -340,8 +340,10 @@ interface TestInterface {
void passCastableObjectNullableSequence(sequence<TestInterface>? arg);
void passNullableCastableObjectNullableSequence(sequence<TestInterface?>? arg);
void passOptionalSequence(optional sequence<long> arg);
void passOptionalSequenceWithDefaultValue(optional sequence<long> arg = []);
void passOptionalNullableSequence(optional sequence<long>? arg);
void passOptionalNullableSequenceWithDefaultValue(optional sequence<long>? arg = null);
void passOptionalNullableSequenceWithDefaultValue2(optional sequence<long>? arg = []);
void passOptionalObjectSequence(optional sequence<TestInterface> arg);
void passExternalInterfaceSequence(sequence<TestExternalInterface> arg);
void passNullableExternalInterfaceSequence(sequence<TestExternalInterface?> arg);
@ -882,6 +884,12 @@ dictionary Dict : ParentDict {
ArrayBuffer? nullableArrayBuffer;
Uint8Array uint8Array;
Float64Array? float64Array = null;
sequence<long> seq1;
sequence<long> seq2 = [];
sequence<long>? seq3;
sequence<long>? seq4 = null;
sequence<long>? seq5 = [];
};
dictionary ParentDict : GrandparentDict {

View File

@ -231,8 +231,10 @@ interface TestExampleInterface {
void passCastableObjectNullableSequence(sequence<TestInterface>? arg);
void passNullableCastableObjectNullableSequence(sequence<TestInterface?>? arg);
void passOptionalSequence(optional sequence<long> arg);
void passOptionalSequenceWithDefaultValue(optional sequence<long> arg = []);
void passOptionalNullableSequence(optional sequence<long>? arg);
void passOptionalNullableSequenceWithDefaultValue(optional sequence<long>? arg = null);
void passOptionalNullableSequenceWithDefaultValue2(optional sequence<long>? arg = []);
void passOptionalObjectSequence(optional sequence<TestInterface> arg);
void passExternalInterfaceSequence(sequence<TestExternalInterface> arg);
void passNullableExternalInterfaceSequence(sequence<TestExternalInterface?> arg);

View File

@ -252,8 +252,10 @@ interface TestJSImplInterface {
void passCastableObjectNullableSequence(sequence<TestJSImplInterface>? arg);
void passNullableCastableObjectNullableSequence(sequence<TestJSImplInterface?>? arg);
void passOptionalSequence(optional sequence<long> arg);
void passOptionalSequenceWithDefaultValue(optional sequence<long> arg = []);
void passOptionalNullableSequence(optional sequence<long>? arg);
void passOptionalNullableSequenceWithDefaultValue(optional sequence<long>? arg = null);
void passOptionalNullableSequenceWithDefaultValue2(optional sequence<long>? arg = []);
void passOptionalObjectSequence(optional sequence<TestJSImplInterface> arg);
void passExternalInterfaceSequence(sequence<TestExternalInterface> arg);
void passNullableExternalInterfaceSequence(sequence<TestExternalInterface?> arg);