Changeset 248185 in webkit


Ignore:
Timestamp:
Aug 2, 2019 3:20:54 PM (5 years ago)
Author:
ysuzuki@apple.com
Message:

[JSC] LazyJSValue should be robust for empty JSValue
https://bugs.webkit.org/show_bug.cgi?id=200388

Reviewed by Saam Barati.

JSTests:

  • stress/switch-constant-child-becomes-empty.js: Added.

(foo):

Source/JavaScriptCore:

If the Switch DFG node is preceded by ForceOSRExit or something that invalidates the basic block,
it can take a FrozenValue as a child which includes empty value instead of string, number etc.
If this Switch node is kept and we reached to DFGCFGSimplificationPhase, it will use this FrozenValue.
However, LazyJSValue using this FrozenValue strongly assumes that FrozenValue is never holding empty value.
But this assumption is wrong. This patch makes LazyJSValue robust for empty value.

  • dfg/DFGLazyJSValue.cpp:

(JSC::DFG::LazyJSValue::tryGetStringImpl const):
(JSC::DFG::LazyJSValue::tryGetString const):
(JSC::DFG::LazyJSValue::strictEqual const):
(JSC::DFG::LazyJSValue::switchLookupValue const):

Location:
trunk
Files:
1 added
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/JSTests/ChangeLog

    r248149 r248185  
     12019-08-02  Yusuke Suzuki  <ysuzuki@apple.com>
     2
     3        [JSC] LazyJSValue should be robust for empty JSValue
     4        https://bugs.webkit.org/show_bug.cgi?id=200388
     5
     6        Reviewed by Saam Barati.
     7
     8        * stress/switch-constant-child-becomes-empty.js: Added.
     9        (foo):
     10
    1112019-08-01  Yusuke Suzuki  <ysuzuki@apple.com>
    212
  • trunk/Source/JavaScriptCore/ChangeLog

    r248179 r248185  
     12019-08-02  Yusuke Suzuki  <ysuzuki@apple.com>
     2
     3        [JSC] LazyJSValue should be robust for empty JSValue
     4        https://bugs.webkit.org/show_bug.cgi?id=200388
     5
     6        Reviewed by Saam Barati.
     7
     8        If the Switch DFG node is preceded by ForceOSRExit or something that invalidates the basic block,
     9        it can take a FrozenValue as a child which includes empty value instead of string, number etc.
     10        If this Switch node is kept and we reached to DFGCFGSimplificationPhase, it will use this FrozenValue.
     11        However, LazyJSValue using this FrozenValue strongly assumes that FrozenValue is never holding empty value.
     12        But this assumption is wrong. This patch makes LazyJSValue robust for empty value.
     13
     14        * dfg/DFGLazyJSValue.cpp:
     15        (JSC::DFG::LazyJSValue::tryGetStringImpl const):
     16        (JSC::DFG::LazyJSValue::tryGetString const):
     17        (JSC::DFG::LazyJSValue::strictEqual const):
     18        (JSC::DFG::LazyJSValue::switchLookupValue const):
     19
    1202019-08-02  Devin Rousso  <drousso@apple.com>
    221
  • trunk/Source/JavaScriptCore/dfg/DFGLazyJSValue.cpp

    r246490 r248185  
    101101        return nullptr;
    102102
    103     default:
     103    case SingleCharacterString:
    104104        return nullptr;
    105105    }
     106    RELEASE_ASSERT_NOT_REACHED();
     107    return nullptr;
    106108}
    107109
     
    115117        return String(&u.character, 1);
    116118
    117     default:
     119    case KnownValue:
     120    case KnownStringImpl:
    118121        if (const StringImpl* string = tryGetStringImpl(graph.m_vm)) {
    119122            unsigned ginormousStringLength = 10000;
     
    129132        return String();
    130133    }
     134    RELEASE_ASSERT_NOT_REACHED();
     135    return String();
    131136}
    132137
     
    136141    case KnownValue:
    137142        switch (other.m_kind) {
    138         case KnownValue:
     143        case KnownValue: {
     144            if (!value()->value() || !other.value()->value())
     145                return value()->value() == other.value()->value() ? TrueTriState : FalseTriState;
    139146            return JSValue::pureStrictEqual(value()->value(), other.value()->value());
    140         case SingleCharacterString:
     147        }
     148        case SingleCharacterString: {
     149            if (!value()->value())
     150                return FalseTriState;
    141151            return equalToSingleCharacter(value()->value(), other.character());
     152        }
    142153        case KnownStringImpl:
    143         case NewStringImpl:
     154        case NewStringImpl: {
     155            if (!value()->value())
     156                return FalseTriState;
    144157            return equalToStringImpl(value()->value(), other.stringImpl());
     158        }
    145159        }
    146160        break;
     
    154168                return FalseTriState;
    155169            return triState(other.stringImpl()->at(0) == character());
    156         default:
     170        case KnownValue:
    157171            return other.strictEqual(*this);
    158172        }
     
    164178        case NewStringImpl:
    165179            return triState(WTF::equal(stringImpl(), other.stringImpl()));
    166         default:
     180        case SingleCharacterString:
     181        case KnownValue:
    167182            return other.strictEqual(*this);
    168183        }
     
    182197        switch (kind) {
    183198        case SwitchImm:
    184             return value()->value().asInt32();
     199            if (value()->value())
     200                return value()->value().asInt32();
     201            return 0;
    185202        case SwitchCell:
    186             return bitwise_cast<uintptr_t>(value()->value().asCell());
     203            if (value()->value())
     204                return bitwise_cast<uintptr_t>(value()->value().asCell());
     205            return 0;
    187206        default:
    188207            RELEASE_ASSERT_NOT_REACHED();
     
    197216            return 0;
    198217        }
    199     default:
     218    case KnownStringImpl:
     219    case NewStringImpl:
    200220        RELEASE_ASSERT_NOT_REACHED();
    201221        return 0;
    202222    }
     223    RELEASE_ASSERT_NOT_REACHED();
     224    return 0;
    203225}
    204226
Note: See TracChangeset for help on using the changeset viewer.