Pass Option<T> for optional primitive arguments without a default value (fixes #1813).

This commit is contained in:
Ms2ger 2014-03-12 10:03:44 +01:00
parent a6100563a6
commit 59bcabb75e
4 changed files with 51 additions and 56 deletions

View file

@ -877,8 +877,6 @@ def getJSToNativeConversionTemplate(type, descriptorProvider, failureCode=None,
if not type.isPrimitive(): if not type.isPrimitive():
raise TypeError("Need conversion for argument type '%s'" % str(type)) raise TypeError("Need conversion for argument type '%s'" % str(type))
typeName = builtinNames[type.tag()]
conversionBehavior = "eDefault" conversionBehavior = "eDefault"
if isEnforceRange: if isEnforceRange:
conversionBehavior = "eEnforceRange" conversionBehavior = "eEnforceRange"
@ -898,10 +896,12 @@ def getJSToNativeConversionTemplate(type, descriptorProvider, failureCode=None,
" Err(_) => { %s }\n" " Err(_) => { %s }\n"
"}" % (successVal, exceptionCode)) "}" % (successVal, exceptionCode))
declType = CGGeneric(builtinNames[type.tag()])
if type.nullable(): if type.nullable():
declType = CGGeneric("Option<" + typeName + ">") declType = CGWrapper(declType, pre="Option<", post=">")
else:
declType = CGGeneric(typeName) if isOptional:
declType = CGWrapper(declType, pre="Option<", post=">")
if defaultValue is not None: if defaultValue is not None:
if isinstance(defaultValue, IDLNullValue): if isinstance(defaultValue, IDLNullValue):
@ -925,10 +925,7 @@ def getJSToNativeConversionTemplate(type, descriptorProvider, failureCode=None,
" ${declName} = %s;\n" " ${declName} = %s;\n"
"}" % defaultStr)).define() "}" % defaultStr)).define()
initialVal = "false" if typeName == "bool" else ("0 as %s" % typeName) return (template, declType, None, isOptional, "None" if isOptional else None)
if type.nullable():
initialVal = "Some(%s)" % initialVal
return (template, declType, None, isOptional, initialVal)
def instantiateJSToNativeConversionTemplate(templateTuple, replacements, def instantiateJSToNativeConversionTemplate(templateTuple, replacements,
argcAndIndex=None): argcAndIndex=None):

View file

@ -43,7 +43,7 @@ impl Blob {
~"" ~""
} }
pub fn Slice(&self, _start: i64, _end: i64, _contentType: Option<DOMString>) -> JS<Blob> { pub fn Slice(&self, _start: Option<i64>, _end: Option<i64>, _contentType: Option<DOMString>) -> JS<Blob> {
Blob::new(&self.window) Blob::new(&self.window)
} }

View file

@ -74,33 +74,32 @@ impl TestBinding {
pub fn GetInterfaceAttributeNullable(&self) -> Option<JS<Blob>> { Some(Blob::new(&self.window)) } pub fn GetInterfaceAttributeNullable(&self) -> Option<JS<Blob>> { Some(Blob::new(&self.window)) }
pub fn SetInterfaceAttributeNullable(&self, _: Option<JS<Blob>>) {} pub fn SetInterfaceAttributeNullable(&self, _: Option<JS<Blob>>) {}
// FIXME (issue #1813) Doesn't currently compile. pub fn PassOptionalBoolean(&self, _: Option<bool>) {}
// pub fn PassOptionalBoolean(&self, _: Option<bool>) {} pub fn PassOptionalByte(&self, _: Option<i8>) {}
// pub fn PassOptionalByte(&self, _: Option<i8>) {} pub fn PassOptionalOctet(&self, _: Option<u8>) {}
// pub fn PassOptionalOctet(&self, _: Option<u8>) {} pub fn PassOptionalShort(&self, _: Option<i16>) {}
// pub fn PassOptionalShort(&self, _: Option<i16>) {} pub fn PassOptionalUnsignedShort(&self, _: Option<u16>) {}
// pub fn PassOptionalUnsignedShort(&self, _: Option<u16>) {} pub fn PassOptionalLong(&self, _: Option<i32>) {}
// pub fn PassOptionalLong(&self, _: Option<i32>) {} pub fn PassOptionalUnsignedLong(&self, _: Option<u32>) {}
// pub fn PassOptionalUnsignedLong(&self, _: Option<u32>) {} pub fn PassOptionalLongLong(&self, _: Option<i64>) {}
// pub fn PassOptionalLongLong(&self, _: Option<i64>) {} pub fn PassOptionalUnsignedLongLong(&self, _: Option<u64>) {}
// pub fn PassOptionalUnsignedLongLong(&self, _: Option<u64>) {} pub fn PassOptionalFloat(&self, _: Option<f32>) {}
// pub fn PassOptionalFloat(&self, _: Option<f32>) {} pub fn PassOptionalDouble(&self, _: Option<f64>) {}
// pub fn PassOptionalDouble(&self, _: Option<f64>) {}
pub fn PassOptionalString(&self, _: Option<DOMString>) {} pub fn PassOptionalString(&self, _: Option<DOMString>) {}
pub fn PassOptionalInterface(&self, _: Option<JS<Blob>>) {} pub fn PassOptionalInterface(&self, _: Option<JS<Blob>>) {}
pub fn PassOptionalAny(&self, _: *JSContext, _: Option<JSVal>) {} pub fn PassOptionalAny(&self, _: *JSContext, _: Option<JSVal>) {}
// pub fn PassOptionalNullableBoolean(&self, _: Option<Option<bool>>) {} pub fn PassOptionalNullableBoolean(&self, _: Option<Option<bool>>) {}
// pub fn PassOptionalNullableByte(&self, _: Option<Option<i8>>) {} pub fn PassOptionalNullableByte(&self, _: Option<Option<i8>>) {}
// pub fn PassOptionalNullableOctet(&self, _: Option<Option<u8>>) {} pub fn PassOptionalNullableOctet(&self, _: Option<Option<u8>>) {}
// pub fn PassOptionalNullableShort(&self, _: Option<Option<i16>>) {} pub fn PassOptionalNullableShort(&self, _: Option<Option<i16>>) {}
// pub fn PassOptionalNullableUnsignedShort(&self, _: Option<Option<u16>>) {} pub fn PassOptionalNullableUnsignedShort(&self, _: Option<Option<u16>>) {}
// pub fn PassOptionalNullableLong(&self, _: Option<Option<i32>>) {} pub fn PassOptionalNullableLong(&self, _: Option<Option<i32>>) {}
// pub fn PassOptionalNullableUnsignedLong(&self, _: Option<Option<u32>>) {} pub fn PassOptionalNullableUnsignedLong(&self, _: Option<Option<u32>>) {}
// pub fn PassOptionalNullableLongLong(&self, _: Option<Option<i64>>) {} pub fn PassOptionalNullableLongLong(&self, _: Option<Option<i64>>) {}
// pub fn PassOptionalNullableUnsignedLongLong(&self, _: Option<Option<u64>>) {} pub fn PassOptionalNullableUnsignedLongLong(&self, _: Option<Option<u64>>) {}
// pub fn PassOptionalNullableFloat(&self, _: Option<Option<f32>>) {} pub fn PassOptionalNullableFloat(&self, _: Option<Option<f32>>) {}
// pub fn PassOptionalNullableDouble(&self, _: Option<Option<f64>>) {} pub fn PassOptionalNullableDouble(&self, _: Option<Option<f64>>) {}
pub fn PassOptionalNullableString(&self, _: Option<Option<DOMString>>) {} pub fn PassOptionalNullableString(&self, _: Option<Option<DOMString>>) {}
// pub fn PassOptionalNullableInterface(&self, _: Option<Option<JS<Blob>>>) {} // pub fn PassOptionalNullableInterface(&self, _: Option<Option<JS<Blob>>>) {}

View file

@ -32,33 +32,32 @@ interface TestBinding {
attribute DOMString? stringAttributeNullable; attribute DOMString? stringAttributeNullable;
attribute Blob? interfaceAttributeNullable; attribute Blob? interfaceAttributeNullable;
// FIXME (issue #1813) Doesn't currently compile. void passOptionalBoolean(optional boolean arg);
// void passOptionalBoolean(optional boolean arg); void passOptionalByte(optional byte arg);
// void passOptionalByte(optional byte arg); void passOptionalOctet(optional octet arg);
// void passOptionalOctet(optional octet arg); void passOptionalShort(optional short arg);
// void passOptionalShort(optional short arg); void passOptionalUnsignedShort(optional unsigned short arg);
// void passOptionalUnsignedShort(optional unsigned short arg); void passOptionalLong(optional long arg);
// void passOptionalLong(optional long arg); void passOptionalUnsignedLong(optional unsigned long arg);
// void passOptionalUnsignedLong(optional unsigned long arg); void passOptionalLongLong(optional long long arg);
// void passOptionalLongLong(optional long long arg); void passOptionalUnsignedLongLong(optional unsigned long long arg);
// void passOptionalUnsignedLongLong(optional unsigned long long arg); void passOptionalFloat(optional float arg);
// void passOptionalFloat(optional float arg); void passOptionalDouble(optional double arg);
// void passOptionalDouble(optional double arg);
void passOptionalString(optional DOMString arg); void passOptionalString(optional DOMString arg);
void passOptionalInterface(optional Blob arg); void passOptionalInterface(optional Blob arg);
void passOptionalAny(optional any arg); void passOptionalAny(optional any arg);
// void passOptionalNullableBoolean(optional boolean? arg); void passOptionalNullableBoolean(optional boolean? arg);
// void passOptionalNullableByte(optional byte? arg); void passOptionalNullableByte(optional byte? arg);
// void passOptionalNullableOctet(optional octet? arg); void passOptionalNullableOctet(optional octet? arg);
// void passOptionalNullableShort(optional short? arg); void passOptionalNullableShort(optional short? arg);
// void passOptionalNullableUnsignedShort(optional unsigned short? arg); void passOptionalNullableUnsignedShort(optional unsigned short? arg);
// void passOptionalNullableLong(optional long? arg); void passOptionalNullableLong(optional long? arg);
// void passOptionalNullableUnsignedLong(optional unsigned long? arg); void passOptionalNullableUnsignedLong(optional unsigned long? arg);
// void passOptionalNullableLongLong(optional long long? arg); void passOptionalNullableLongLong(optional long long? arg);
// void passOptionalNullableUnsignedLongLong(optional unsigned long long? arg); void passOptionalNullableUnsignedLongLong(optional unsigned long long? arg);
// void passOptionalNullableFloat(optional float? arg); void passOptionalNullableFloat(optional float? arg);
// void passOptionalNullableDouble(optional double? arg); void passOptionalNullableDouble(optional double? arg);
void passOptionalNullableString(optional DOMString? arg); void passOptionalNullableString(optional DOMString? arg);
// void passOptionalNullableInterface(optional Blob? arg); // void passOptionalNullableInterface(optional Blob? arg);