Bug 1330699 part 12. Actually change the key type of a record, and its corresponding conversion behavior, depending on what the IDL says. r=qdot

This commit is contained in:
Boris Zbarsky 2017-02-15 00:01:39 -05:00
Родитель 90896220ac
Коммит 063d0caa78
3 изменённых файлов: 41 добавлений и 11 удалений

Просмотреть файл

@ -4473,11 +4473,15 @@ def handleDefaultStringValue(defaultValue, method):
}
def recordKeyDeclType(recordType):
def recordKeyType(recordType):
assert recordType.keyType.isString()
if recordType.keyType.isByteString():
return CGGeneric("nsCString")
return CGGeneric("nsString")
return "nsCString"
return "nsString"
def recordKeyDeclType(recordType):
return CGGeneric(recordKeyType(recordType))
# If this function is modified, modify CGNativeMember.getArg and
@ -4885,6 +4889,15 @@ def getJSToNativeConversionInfo(type, descriptorProvider, failureCode=None,
"passedToJSImpl": "${passedToJSImpl}"
})
keyType = recordKeyType(recordType)
if recordType.keyType.isDOMString():
keyConversionFunction = "ConvertJSValueToString"
elif recordType.keyType.isUSVString():
keyConversionFunction = "ConvertJSValueToUSVString"
else:
assert recordType.keyType.isByteString()
keyConversionFunction = "ConvertJSValueToByteString"
templateBody = fill(
"""
auto& recordEntries = ${recordRef}.Entries();
@ -4904,6 +4917,7 @@ def getJSToNativeConversionInfo(type, descriptorProvider, failureCode=None,
JS::Rooted<JS::Value> propNameValue(cx);
JS::Rooted<JS::Value> temp(cx);
JS::Rooted<jsid> curId(cx);
JS::Rooted<JS::Value> idVal(cx);
for (size_t i = 0; i < ids.length(); ++i) {
curId = ids[i];
@ -4920,12 +4934,11 @@ def getJSToNativeConversionInfo(type, descriptorProvider, failureCode=None,
continue;
}
binding_detail::FakeString propName;
bool isSymbol;
if (!ConvertIdToString(cx, curId, propName, isSymbol)) {
idVal = js::IdToValue(curId);
${keyType} propName;
if (!${keyConversionFunction}(cx, idVal, propName)) {
$*{exceptionCode}
}
MOZ_ASSERT(!isSymbol, "We said, no symbols!");
if (!JS_GetPropertyById(cx, recordObj, curId, &temp)) {
$*{exceptionCode}
@ -4941,6 +4954,8 @@ def getJSToNativeConversionInfo(type, descriptorProvider, failureCode=None,
""",
exceptionCode=exceptionCode,
recordRef=recordRef,
keyType=keyType,
keyConversionFunction=keyConversionFunction,
typeName=typeName,
valueType=valueInfo.declType.define(),
valueConversion=valueConversion)
@ -6558,6 +6573,18 @@ def getWrapTemplateForType(type, descriptorProvider, result, successCode,
'typedArraysAreStructs': typedArraysAreStructs
})
recordWrapLevel -= 1
if type.keyType.isByteString():
# There is no length-taking JS_DefineProperty. So to keep
# things sane with embedded nulls, we want to byte-inflate
# to an nsAString. The only byte-inflation function we
# have around is AppendASCIItoUTF16, which luckily doesn't
# assert anything about the input being ASCII.
expandedKeyDecl = "NS_ConvertASCIItoUTF16 expandedKey(entry.mKey);\n"
keyName = "expandedKey"
else:
expandedKeyDecl = ""
keyName = "entry.mKey"
code = fill(
"""
@ -6575,9 +6602,10 @@ def getWrapTemplateForType(type, descriptorProvider, result, successCode,
do {
$*{innerTemplate}
} while (0);
$*{expandedKeyDecl}
if (!JS_DefineUCProperty(cx, returnObj,
entry.mKey.BeginReading(),
entry.mKey.Length(), tmp,
${keyName}.BeginReading(),
${keyName}.Length(), tmp,
JSPROP_ENUMERATE)) {
$*{exceptionCode}
}
@ -6589,6 +6617,8 @@ def getWrapTemplateForType(type, descriptorProvider, result, successCode,
exceptionCode=exceptionCode,
valueName=valueName,
innerTemplate=innerTemplate,
expandedKeyDecl=expandedKeyDecl,
keyName=keyName,
set=setObject("*returnObj"))
return (code, False)

Просмотреть файл

@ -47,7 +47,7 @@ template<typename KeyType, typename ValueType>
class Record
{
public:
typedef typename binding_detail::RecordEntry<nsString, ValueType> EntryType;
typedef typename binding_detail::RecordEntry<KeyType, ValueType> EntryType;
typedef Record<KeyType, ValueType> SelfType;
Record()

Просмотреть файл

@ -309,7 +309,7 @@ void
InternalHeaders::Fill(const Record<nsCString, nsCString>& aInit, ErrorResult& aRv)
{
for (auto& entry : aInit.Entries()) {
Append(NS_ConvertUTF16toUTF8(entry.mKey), entry.mValue, aRv);
Append(entry.mKey, entry.mValue, aRv);
if (aRv.Failed()) {
return;
}