From e7c9fa3e1505aeb90385e0a4e90fe5e0b137d4ab Mon Sep 17 00:00:00 2001 From: JustOff Date: Wed, 13 Mar 2019 20:17:36 +0200 Subject: Actually change the key type of a record, and its corresponding conversion behavior, depending on what the IDL says --- dom/bindings/Codegen.py | 48 +++++++++++++++++++++++++++++++++++-------- dom/bindings/Record.h | 2 +- dom/fetch/InternalHeaders.cpp | 2 +- 3 files changed, 41 insertions(+), 11 deletions(-) diff --git a/dom/bindings/Codegen.py b/dom/bindings/Codegen.py index 915d7d431..4e6248e49 100644 --- a/dom/bindings/Codegen.py +++ b/dom/bindings/Codegen.py @@ -4372,11 +4372,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 @@ -4786,6 +4790,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(); @@ -4805,6 +4818,7 @@ def getJSToNativeConversionInfo(type, descriptorProvider, failureCode=None, JS::Rooted propNameValue(cx); JS::Rooted temp(cx); JS::Rooted curId(cx); + JS::Rooted idVal(cx); for (size_t i = 0; i < ids.length(); ++i) { curId = ids[i]; @@ -4821,12 +4835,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} @@ -4842,6 +4855,8 @@ def getJSToNativeConversionInfo(type, descriptorProvider, failureCode=None, """, exceptionCode=exceptionCode, recordRef=recordRef, + keyType=keyType, + keyConversionFunction=keyConversionFunction, typeName=typeName, valueType=valueInfo.declType.define(), valueConversion=valueConversion) @@ -6491,6 +6506,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( """ @@ -6508,9 +6535,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} } @@ -6522,6 +6550,8 @@ def getWrapTemplateForType(type, descriptorProvider, result, successCode, exceptionCode=exceptionCode, valueName=valueName, innerTemplate=innerTemplate, + expandedKeyDecl=expandedKeyDecl, + keyName=keyName, set=setObject("*returnObj")) return (code, False) diff --git a/dom/bindings/Record.h b/dom/bindings/Record.h index 2fe18be2b..b7f7b01b0 100644 --- a/dom/bindings/Record.h +++ b/dom/bindings/Record.h @@ -47,7 +47,7 @@ template class Record { public: - typedef typename binding_detail::RecordEntry EntryType; + typedef typename binding_detail::RecordEntry EntryType; typedef Record SelfType; Record() diff --git a/dom/fetch/InternalHeaders.cpp b/dom/fetch/InternalHeaders.cpp index 7bf5703dc..f66221d42 100644 --- a/dom/fetch/InternalHeaders.cpp +++ b/dom/fetch/InternalHeaders.cpp @@ -317,7 +317,7 @@ void InternalHeaders::Fill(const Record& 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; } -- cgit v1.2.3