Changeset 151978 in webkit


Ignore:
Timestamp:
Jun 25, 2013 8:48:12 PM (11 years ago)
Author:
rniwa@webkit.org
Message:

JSString should remember AtomicString
https://bugs.webkit.org/show_bug.cgi?id=117386

Reviewed by Geoffrey Garen.

Source/JavaScriptCore:

Added JSValue::toAtomicString and JSString::atomicString. These two functions allow WebCore to update
JSString's m_value to set isAtomic flag and avoid the AtomicStringTable lookups in subsequent attempts
to obtain the AtomicString of the same value.

  • runtime/JSCJSValue.h:
  • runtime/JSString.h:

(JSC::JSString::atomicString):
(JSC::JSValue::toAtomicString):

Source/WebCore:

Added "Atomic" attribute as a WebKit extension to WebIDL, and deployed it in Element.idl and Node.idl so that
the binding code can use newly added JSValue::toAtomic to update JSString's m_value.

  • bindings/js/JSDOMBinding.cpp:

(WebCore::valueToAtomicStringWithNullCheck): Added.
(WebCore::valueToAtomicStringWithUndefinedOrNullCheck): Added.

  • bindings/js/JSDOMBinding.h:
  • bindings/scripts/CodeGeneratorJS.pm:

(GetNativeTypeFromSignature): Return const AtomicString& when either Atomic attribute is specified or the type is
Reflect. Note that setAttribute and getAttribute both use AtomicString for all arguments.
(JSValueToNative): Use AtomicString equivalents when possible when converting DOMString to a WebCore object.

  • bindings/scripts/IDLAttributes.txt: Added "Atomic" attribute.
  • bindings/scripts/test/JS/JSTestObj.cpp: Baselined test cases.

(WebCore::setJSTestObjReflectedStringAttr):
(WebCore::setJSTestObjReflectedURLAttr):
(WebCore::setJSTestObjReflectedCustomURLAttr):

  • dom/Document.idl:
  • dom/Element.idl:
  • dom/Node.idl:
Location:
trunk/Source
Files:
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r151923 r151978  
     12013-06-25  Ryosuke Niwa  <rniwa@webkit.org>
     2
     3        JSString should remember AtomicString
     4        https://bugs.webkit.org/show_bug.cgi?id=117386
     5
     6        Reviewed by Geoffrey Garen.
     7
     8        Added JSValue::toAtomicString and JSString::atomicString. These two functions allow WebCore to update
     9        JSString's m_value to set isAtomic flag and avoid the AtomicStringTable lookups in subsequent attempts
     10        to obtain the AtomicString of the same value.
     11
     12        * runtime/JSCJSValue.h:
     13        * runtime/JSString.h:
     14        (JSC::JSString::atomicString):
     15        (JSC::JSValue::toAtomicString):
     16
    1172013-06-24  Roger Fong  <roger_fong@apple.com>
    218
  • trunk/Source/JavaScriptCore/runtime/JSCJSValue.h

    r149673 r151978  
    221221    double toNumber(ExecState*) const;
    222222    JSString* toString(ExecState*) const;
     223    AtomicString toAtomicString(ExecState*) const;
    223224    WTF::String toWTFString(ExecState*) const;
    224225    WTF::String toWTFStringInline(ExecState*) const;
  • trunk/Source/JavaScriptCore/runtime/JSString.h

    r148696 r151978  
    140140    const String& tryGetValue() const;
    141141    unsigned length() { return m_length; }
     142    AtomicString atomicString(ExecState*) const;
    142143
    143144    JSValue toPrimitive(ExecState*, PreferredPrimitiveType) const;
     
    370371        static_cast<const JSRopeString*>(this)->resolveRope(exec);
    371372    return m_value;
     373}
     374
     375inline AtomicString JSString::atomicString(ExecState* exec) const
     376{
     377    if (isRope()) {
     378        static_cast<const JSRopeString*>(this)->resolveRope(exec);
     379        if (exec->hadException())
     380            return nullAtom;
     381    }
     382    const AtomicString atomicValue(m_value);
     383    if (atomicValue.impl() != m_value.impl())
     384        m_value = atomicValue;
     385    return atomicValue;
    372386}
    373387
     
    515529        return jsCast<JSString*>(asCell());
    516530    return toStringSlowCase(exec);
     531}
     532
     533inline AtomicString JSValue::toAtomicString(ExecState* exec) const
     534{
     535    if (isString())
     536        return jsCast<JSString*>(asCell())->atomicString(exec);
     537    return toStringSlowCase(exec)->value(exec);
    517538}
    518539
  • trunk/Source/WebCore/ChangeLog

    r151975 r151978  
     12013-06-25  Ryosuke Niwa  <rniwa@webkit.org>
     2
     3        JSString should remember AtomicString
     4        https://bugs.webkit.org/show_bug.cgi?id=117386
     5
     6        Reviewed by Geoffrey Garen.
     7
     8        Added "Atomic" attribute as a WebKit extension to WebIDL, and deployed it in Element.idl and Node.idl so that
     9        the binding code can use newly added JSValue::toAtomic to update JSString's m_value.
     10
     11        * bindings/js/JSDOMBinding.cpp:
     12        (WebCore::valueToAtomicStringWithNullCheck): Added.
     13        (WebCore::valueToAtomicStringWithUndefinedOrNullCheck): Added.
     14
     15        * bindings/js/JSDOMBinding.h:
     16
     17        * bindings/scripts/CodeGeneratorJS.pm:
     18        (GetNativeTypeFromSignature): Return const AtomicString& when either Atomic attribute is specified or the type is
     19        Reflect. Note that setAttribute and getAttribute both use AtomicString for all arguments.
     20        (JSValueToNative): Use AtomicString equivalents when possible when converting DOMString to a WebCore object.
     21
     22        * bindings/scripts/IDLAttributes.txt: Added "Atomic" attribute.
     23
     24        * bindings/scripts/test/JS/JSTestObj.cpp: Baselined test cases.
     25        (WebCore::setJSTestObjReflectedStringAttr):
     26        (WebCore::setJSTestObjReflectedURLAttr):
     27        (WebCore::setJSTestObjReflectedCustomURLAttr):
     28
     29        * dom/Document.idl:
     30        * dom/Element.idl:
     31        * dom/Node.idl:
     32
    1332013-06-25  Kangil Han  <kangil.han@samsung.com>
    234
  • trunk/Source/WebCore/bindings/js/JSDOMBinding.cpp

    r151907 r151978  
    110110}
    111111
     112AtomicString valueToAtomicStringWithNullCheck(ExecState* exec, JSValue value)
     113{
     114    if (value.isNull())
     115        return nullAtom;
     116    return value.toAtomicString(exec);
     117}
     118
    112119String valueToStringWithUndefinedOrNullCheck(ExecState* exec, JSValue value)
    113120{
     
    115122        return String();
    116123    return value.toString(exec)->value(exec);
     124}
     125
     126AtomicString valueToAtomicStringWithUndefinedOrNullCheck(ExecState* exec, JSValue value)
     127{
     128    if (value.isUndefinedOrNull())
     129        return nullAtom;
     130    return value.toAtomicString(exec);
    117131}
    118132
  • trunk/Source/WebCore/bindings/js/JSDOMBinding.h

    r151563 r151978  
    250250
    251251    String valueToStringWithNullCheck(JSC::ExecState*, JSC::JSValue); // null if the value is null
     252    AtomicString valueToAtomicStringWithNullCheck(JSC::ExecState*, JSC::JSValue);
     253
    252254    String valueToStringWithUndefinedOrNullCheck(JSC::ExecState*, JSC::JSValue); // null if the value is null or undefined
     255    AtomicString valueToAtomicStringWithUndefinedOrNullCheck(JSC::ExecState*, JSC::JSValue);
    253256
    254257    inline int32_t finiteInt32Value(JSC::JSValue value, JSC::ExecState* exec, bool& okay)
  • trunk/Source/WebCore/bindings/scripts/CodeGeneratorJS.pm

    r151832 r151978  
    33633363    }
    33643364
     3365    # FIXME: GetNativeType should support Atomic extension.
     3366    if ($type eq "DOMString" and ($signature->extendedAttributes->{"Atomic"} or $signature->extendedAttributes->{"Reflect"})) {
     3367        return "const AtomicString&";
     3368    }
     3369
    33653370    return GetNativeType($type);
    33663371}
     
    35023507        # FIXME: This implements [TreatNullAs=NullString] and [TreatUndefinedAs=NullString],
    35033508        # but the Web IDL spec requires [TreatNullAs=EmptyString] and [TreatUndefinedAs=EmptyString].
    3504         if (($signature->extendedAttributes->{"TreatNullAs"} and $signature->extendedAttributes->{"TreatNullAs"} eq "NullString") and ($signature->extendedAttributes->{"TreatUndefinedAs"} and $signature->extendedAttributes->{"TreatUndefinedAs"} eq "NullString")) {
    3505             return "valueToStringWithUndefinedOrNullCheck(exec, $value)"
    3506         }
    3507         if (($signature->extendedAttributes->{"TreatNullAs"} and $signature->extendedAttributes->{"TreatNullAs"} eq "NullString") or $signature->extendedAttributes->{"Reflect"}) {
    3508             return "valueToStringWithNullCheck(exec, $value)"
     3509        if (($signature->extendedAttributes->{"TreatNullAs"} and $signature->extendedAttributes->{"TreatNullAs"} eq "NullString")
     3510            and ($signature->extendedAttributes->{"TreatUndefinedAs"} and $signature->extendedAttributes->{"TreatUndefinedAs"} eq "NullString")) {
     3511            if ($signature->extendedAttributes->{"Atomic"}) {
     3512                return "valueToStringWithUndefinedOrNullCheck(exec, $value)";
     3513            } else {
     3514                return "valueToAtomicStringWithUndefinedOrNullCheck(exec, $value)";
     3515            }
     3516        }
     3517        if ($signature->extendedAttributes->{"Reflect"}) {
     3518            return "valueToAtomicStringWithNullCheck(exec, $value)";
     3519        }
     3520        if ($signature->extendedAttributes->{"TreatNullAs"} and $signature->extendedAttributes->{"TreatNullAs"} eq "NullString") {
     3521            return "valueToStringWithNullCheck(exec, $value)";
     3522        }
     3523        if ($signature->extendedAttributes->{"Atomic"}) {
     3524            return "$value.isEmpty() ? nullAtom : $value.toAtomicString(exec)";
    35093525        }
    35103526        # FIXME: Add the case for 'if ($signature->extendedAttributes->{"TreatUndefinedAs"} and $signature->extendedAttributes->{"TreatUndefinedAs"} eq "NullString"))'.
  • trunk/Source/WebCore/bindings/scripts/IDLAttributes.txt

    r151832 r151978  
    2020
    2121ActiveDOMObject
     22Atomic
    2223CPPPureInterface
    2324CachedAttribute
  • trunk/Source/WebCore/bindings/scripts/test/JS/JSTestObj.cpp

    r151832 r151978  
    12791279    JSTestObj* castedThis = jsCast<JSTestObj*>(thisObject);
    12801280    TestObj* impl = static_cast<TestObj*>(castedThis->impl());
    1281     const String& nativeValue(valueToStringWithNullCheck(exec, value));
     1281    const AtomicString& nativeValue(valueToAtomicStringWithNullCheck(exec, value));
    12821282    if (exec->hadException())
    12831283        return;
     
    13271327    JSTestObj* castedThis = jsCast<JSTestObj*>(thisObject);
    13281328    TestObj* impl = static_cast<TestObj*>(castedThis->impl());
    1329     const String& nativeValue(valueToStringWithNullCheck(exec, value));
     1329    const AtomicString& nativeValue(valueToAtomicStringWithNullCheck(exec, value));
    13301330    if (exec->hadException())
    13311331        return;
     
    13391339    JSTestObj* castedThis = jsCast<JSTestObj*>(thisObject);
    13401340    TestObj* impl = static_cast<TestObj*>(castedThis->impl());
    1341     const String& nativeValue(valueToStringWithNullCheck(exec, value));
     1341    const AtomicString& nativeValue(valueToAtomicStringWithNullCheck(exec, value));
    13421342    if (exec->hadException())
    13431343        return;
     
    13751375    JSTestObj* castedThis = jsCast<JSTestObj*>(thisObject);
    13761376    TestObj* impl = static_cast<TestObj*>(castedThis->impl());
    1377     const String& nativeValue(valueToStringWithNullCheck(exec, value));
     1377    const AtomicString& nativeValue(valueToAtomicStringWithNullCheck(exec, value));
    13781378    if (exec->hadException())
    13791379        return;
  • trunk/Source/WebCore/dom/Document.idl

    r151951 r151978  
    3030    readonly attribute Element documentElement;
    3131
    32     [ReturnNewObject, RaisesException] Element createElement([TreatNullAs=NullString,Default=Undefined] optional DOMString tagName);
     32    [ReturnNewObject, RaisesException] Element createElement([TreatNullAs=NullString,Default=Undefined,Atomic] optional DOMString tagName);
    3333    DocumentFragment   createDocumentFragment();
    3434    [ReturnNewObject] Text createTextNode([Default=Undefined] optional DOMString data);
     
    3939    [ReturnNewObject, RaisesException] Attr createAttribute([Default=Undefined] optional DOMString name);
    4040    [ReturnNewObject, RaisesException] EntityReference createEntityReference([Default=Undefined] optional DOMString name);
    41     NodeList getElementsByTagName([Default=Undefined] optional DOMString tagname);
     41    NodeList getElementsByTagName([Default=Undefined, Atomic] optional DOMString tagname);
    4242
    4343    // Introduced in DOM Level 2:
     
    4949    [ObjCLegacyUnnamedParameters, ReturnNewObject, RaisesException] Attr createAttributeNS([TreatNullAs=NullString,Default=Undefined] optional DOMString namespaceURI,
    5050                                                                          [TreatNullAs=NullString,Default=Undefined] optional DOMString qualifiedName);
    51     [ObjCLegacyUnnamedParameters] NodeList getElementsByTagNameNS([TreatNullAs=NullString,Default=Undefined] optional DOMString namespaceURI,
    52                                                    [Default=Undefined] optional DOMString localName);
    53     Element getElementById([Default=Undefined] optional DOMString elementId);
     51    [ObjCLegacyUnnamedParameters] NodeList getElementsByTagNameNS([TreatNullAs=NullString,Default=Undefined,Atomic] optional DOMString namespaceURI,
     52                                                   [Default=Undefined,Atomic] optional DOMString localName);
     53    Element getElementById([Default=Undefined,Atomic] optional DOMString elementId);
    5454
    5555    // DOM Level 3 Core
     
    217217
    218218    // NodeSelector - Selector API
    219     [RaisesException] Element querySelector(DOMString selectors);
    220     [RaisesException] NodeList querySelectorAll(DOMString selectors);
     219    [RaisesException] Element querySelector([Atomic] DOMString selectors);
     220    [RaisesException] NodeList querySelectorAll([Atomic] DOMString selectors);
    221221
    222222#if defined(ENABLE_FULLSCREEN_API) && ENABLE_FULLSCREEN_API
     
    339339#if defined(ENABLE_CUSTOM_ELEMENTS) && ENABLE_CUSTOM_ELEMENTS
    340340    [Conditional=CUSTOM_ELEMENTS, ImplementedAs=registerElement, CallWith=ScriptState, RaisesException] CustomElementConstructor webkitRegister(DOMString name, optional Dictionary options);
    341     [ReturnNewObject, RaisesException] Element createElement(DOMString localName, [TreatNullAs=NullString] DOMString typeExtension);
    342     [ReturnNewObject, RaisesException] Element createElementNS([TreatNullAs=NullString] DOMString namespaceURI, DOMString qualifiedName,
    343                             [TreatNullAs=NullString] DOMString typeExtension);
     341    [ReturnNewObject, RaisesException] Element createElement([Atomic] DOMString localName, [TreatNullAs=NullString, Atomic] DOMString typeExtension);
     342    [ReturnNewObject, RaisesException] Element createElementNS([TreatNullAs=NullString, Atomic] DOMString namespaceURI, DOMString qualifiedName,
     343                            [TreatNullAs=NullString, Atomic] DOMString typeExtension);
    344344#endif
    345345
  • trunk/Source/WebCore/dom/Element.idl

    r151896 r151978  
    2828    [TreatReturnedNullStringAs=Null] readonly attribute DOMString tagName;
    2929
    30     [TreatReturnedNullStringAs=Null] DOMString getAttribute([Default=Undefined] optional DOMString name);
    31     [ObjCLegacyUnnamedParameters, RaisesException] void setAttribute([Default=Undefined] optional DOMString name,
    32                                      [Default=Undefined] optional DOMString value);
    33     void removeAttribute([Default=Undefined] optional DOMString name);
    34     Attr getAttributeNode([Default=Undefined] optional DOMString name);
     30    [TreatReturnedNullStringAs=Null] DOMString getAttribute([Default=Undefined, Atomic] optional DOMString name);
     31    [ObjCLegacyUnnamedParameters, RaisesException] void setAttribute([Default=Undefined, Atomic] optional DOMString name,
     32                                     [Default=Undefined, Atomic] optional DOMString value);
     33    void removeAttribute([Default=Undefined, Atomic] optional DOMString name);
     34    Attr getAttributeNode([Default=Undefined, Atomic] optional DOMString name);
    3535    [RaisesException] Attr setAttributeNode([Default=Undefined] optional Attr newAttr);
    3636    [RaisesException] Attr removeAttributeNode([Default=Undefined] optional Attr oldAttr);
    37     NodeList getElementsByTagName([Default=Undefined] optional DOMString name);
     37    NodeList getElementsByTagName([Default=Undefined, Atomic] optional DOMString name);
    3838
    3939#if !defined(LANGUAGE_OBJECTIVE_C)
     
    4545    // DOM Level 2 Core
    4646
    47     [ObjCLegacyUnnamedParameters] DOMString getAttributeNS([TreatNullAs=NullString,Default=Undefined] optional DOMString namespaceURI,
    48                                             [Default=Undefined] optional DOMString localName);
    49     [ObjCLegacyUnnamedParameters, RaisesException] void setAttributeNS([TreatNullAs=NullString,Default=Undefined] optional DOMString namespaceURI,
    50                                        [Default=Undefined] optional DOMString qualifiedName,
    51                                        [Default=Undefined] optional DOMString value);
    52     [ObjCLegacyUnnamedParameters] void removeAttributeNS([TreatNullAs=NullString] DOMString namespaceURI,
    53                                           DOMString localName);
    54     [ObjCLegacyUnnamedParameters] NodeList getElementsByTagNameNS([TreatNullAs=NullString,Default=Undefined] optional DOMString namespaceURI,
    55                                                    [Default=Undefined] optional DOMString localName);
    56     [ObjCLegacyUnnamedParameters] Attr getAttributeNodeNS([TreatNullAs=NullString,Default=Undefined] optional DOMString namespaceURI,
    57                                            [Default=Undefined] optional DOMString localName);
     47    [ObjCLegacyUnnamedParameters] DOMString getAttributeNS([TreatNullAs=NullString, Default=Undefined, Atomic] optional DOMString namespaceURI,
     48                                            [Default=Undefined, Atomic] optional DOMString localName);
     49    [ObjCLegacyUnnamedParameters, RaisesException] void setAttributeNS([TreatNullAs=NullString, Default=Undefined, Atomic] optional DOMString namespaceURI,
     50                                       [Default=Undefined, Atomic] optional DOMString qualifiedName,
     51                                       [Default=Undefined, Atomic] optional DOMString value);
     52    [ObjCLegacyUnnamedParameters] void removeAttributeNS([TreatNullAs=NullString, Atomic] DOMString namespaceURI,
     53                                          [Atomic] DOMString localName);
     54    [ObjCLegacyUnnamedParameters] NodeList getElementsByTagNameNS([TreatNullAs=NullString, Default=Undefined, Atomic] optional DOMString namespaceURI,
     55                                                   [Default=Undefined, Atomic] optional DOMString localName);
     56    [ObjCLegacyUnnamedParameters] Attr getAttributeNodeNS([TreatNullAs=NullString, Default=Undefined, Atomic] optional DOMString namespaceURI,
     57                                           [Default=Undefined, Atomic] optional DOMString localName);
    5858    [RaisesException] Attr setAttributeNodeNS([Default=Undefined] optional Attr newAttr);
    5959    boolean hasAttribute(DOMString name);
    60     [ObjCLegacyUnnamedParameters] boolean hasAttributeNS([TreatNullAs=NullString,Default=Undefined] optional DOMString namespaceURI,
    61                                           [Default=Undefined] optional DOMString localName);
     60    [ObjCLegacyUnnamedParameters] boolean hasAttributeNS([TreatNullAs=NullString, Default=Undefined, Atomic] optional DOMString namespaceURI,
     61                                          [Default=Undefined, Atomic] optional DOMString localName);
    6262
    6363    readonly attribute CSSStyleDeclaration style;
     
    100100
    101101    // NodeSelector - Selector API
    102     [RaisesException] Element querySelector(DOMString selectors);
    103     [RaisesException] NodeList querySelectorAll(DOMString selectors);
     102    [RaisesException] Element querySelector([Atomic] DOMString selectors);
     103    [RaisesException] NodeList querySelectorAll([Atomic] DOMString selectors);
    104104
    105105    // WebKit extension, pending specification.
  • trunk/Source/WebCore/dom/Node.idl

    r151714 r151978  
    127127#if !defined(LANGUAGE_CPP) || !LANGUAGE_CPP
    128128#if !defined(LANGUAGE_OBJECTIVE_C) || !LANGUAGE_OBJECTIVE_C
    129     void addEventListener(DOMString type,
     129    void addEventListener([Atomic] DOMString type,
    130130                          EventListener listener,
    131131                          optional boolean useCapture);
    132     void removeEventListener(DOMString type,
     132    void removeEventListener([Atomic] DOMString type,
    133133                             EventListener listener,
    134134                             optional boolean useCapture);
Note: See TracChangeset for help on using the changeset viewer.