Changeset 254419 in webkit


Ignore:
Timestamp:
Jan 12, 2020 7:10:13 PM (4 years ago)
Author:
ysuzuki@apple.com
Message:

[JSC] Remove IsDone from JSArrayIterator
https://bugs.webkit.org/show_bug.cgi?id=206140

Reviewed by Keith Miller.

We can store -1 in Index field to represent whether the iterator is closed.
While this patch does not change the allocation size of JSArrayIterator, this style can
shrink the size of JSStringIterator when we implement it in the same style.

We also rename iterationKindKeyValue to iterationKindEntries.

  • builtins/ArrayIteratorPrototype.js:

(globalPrivate.arrayIteratorNextHelper):

  • builtins/MapIteratorPrototype.js:

(globalPrivate.mapIteratorNext):

  • builtins/MapPrototype.js:

(entries):

  • builtins/SetIteratorPrototype.js:

(globalPrivate.setIteratorNext):

  • builtins/SetPrototype.js:

(entries):

  • bytecode/BytecodeIntrinsicRegistry.cpp:

(JSC::BytecodeIntrinsicRegistry::BytecodeIntrinsicRegistry):

  • bytecode/BytecodeIntrinsicRegistry.h:
  • bytecompiler/NodesCodegen.cpp:

(JSC::arrayIteratorInternalFieldIndex):

  • inspector/JSInjectedScriptHost.cpp:

(Inspector::cloneArrayIteratorObject):

  • runtime/JSArrayIterator.cpp:

(JSC::JSArrayIterator::finishCreation):

  • runtime/JSArrayIterator.h:
Location:
trunk/Source/JavaScriptCore
Files:
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r254418 r254419  
     12020-01-12  Yusuke Suzuki  <ysuzuki@apple.com>
     2
     3        [JSC] Remove IsDone from JSArrayIterator
     4        https://bugs.webkit.org/show_bug.cgi?id=206140
     5
     6        Reviewed by Keith Miller.
     7
     8        We can store `-1` in Index field to represent whether the iterator is closed.
     9        While this patch does not change the allocation size of JSArrayIterator, this style can
     10        shrink the size of JSStringIterator when we implement it in the same style.
     11
     12        We also rename iterationKindKeyValue to iterationKindEntries.
     13
     14        * builtins/ArrayIteratorPrototype.js:
     15        (globalPrivate.arrayIteratorNextHelper):
     16        * builtins/MapIteratorPrototype.js:
     17        (globalPrivate.mapIteratorNext):
     18        * builtins/MapPrototype.js:
     19        (entries):
     20        * builtins/SetIteratorPrototype.js:
     21        (globalPrivate.setIteratorNext):
     22        * builtins/SetPrototype.js:
     23        (entries):
     24        * bytecode/BytecodeIntrinsicRegistry.cpp:
     25        (JSC::BytecodeIntrinsicRegistry::BytecodeIntrinsicRegistry):
     26        * bytecode/BytecodeIntrinsicRegistry.h:
     27        * bytecompiler/NodesCodegen.cpp:
     28        (JSC::arrayIteratorInternalFieldIndex):
     29        * inspector/JSInjectedScriptHost.cpp:
     30        (Inspector::cloneArrayIteratorObject):
     31        * runtime/JSArrayIterator.cpp:
     32        (JSC::JSArrayIterator::finishCreation):
     33        * runtime/JSArrayIterator.h:
     34
    1352020-01-12  Yusuke Suzuki  <ysuzuki@apple.com>
    236
  • trunk/Source/JavaScriptCore/builtins/ArrayIteratorPrototype.js

    r254252 r254419  
    4646    var value;
    4747
    48     if (!@getArrayIteratorInternalField(this, @arrayIteratorFieldIsDone)) {
    49         var index = @getArrayIteratorInternalField(this, @arrayIteratorFieldIndex);
     48    var index = @getArrayIteratorInternalField(this, @arrayIteratorFieldIndex);
     49    if (index !== -1) {
    5050        var length = array.length >>> 0;
    5151        if (index < length) {
     
    5454            if (kind === @iterationKindKey)
    5555                value = index;
    56             else { 
     56            else {
    5757                value = array[index];
    58                 value = kind === @iterationKindValue ? value : [index, value];
     58                if (kind === @iterationKindEntries)
     59                    value = [index, value];
    5960            }
    60         }
     61        } else
     62            @putArrayIteratorInternalField(this, @arrayIteratorFieldIndex, -1);
    6163    }
    62     @putArrayIteratorInternalField(this, @arrayIteratorFieldIsDone, done);
    6364
    6465    return { value, done };
  • trunk/Source/JavaScriptCore/builtins/MapIteratorPrototype.js

    r239761 r254419  
    3737        var key = @mapBucketKey(bucket);
    3838        value = @mapBucketValue(bucket);
    39         if (kind === @iterationKindKeyValue)
     39        if (kind === @iterationKindEntries)
    4040            value = [ key, value ]
    4141        else if (kind === @iterationKindKey)
  • trunk/Source/JavaScriptCore/builtins/MapPrototype.js

    r246567 r254419  
    6363        @throwTypeError("Map.prototype.entries requires that |this| be Map");
    6464
    65     return new @MapIterator(this, @iterationKindKeyValue);
     65    return new @MapIterator(this, @iterationKindEntries);
    6666}
    6767
  • trunk/Source/JavaScriptCore/builtins/SetIteratorPrototype.js

    r239761 r254419  
    3636    if (!done) {
    3737        value = @setBucketKey(bucket);
    38         if (kind === @iterationKindKeyValue)
     38        if (kind === @iterationKindEntries)
    3939            value = [ value, value ]
    4040    }
  • trunk/Source/JavaScriptCore/builtins/SetPrototype.js

    r246567 r254419  
    5353        @throwTypeError("Set.prototype.entries requires that |this| be Set");
    5454
    55     return new @SetIterator(this, @iterationKindKeyValue);
     55    return new @SetIterator(this, @iterationKindEntries);
    5656}
    5757
  • trunk/Source/JavaScriptCore/bytecode/BytecodeIntrinsicRegistry.cpp

    r254252 r254419  
    5959    m_iterationKindKey.set(m_vm, jsNumber(static_cast<unsigned>(IterationKind::Keys)));
    6060    m_iterationKindValue.set(m_vm, jsNumber(static_cast<unsigned>(IterationKind::Values)));
    61     m_iterationKindKeyValue.set(m_vm, jsNumber(static_cast<unsigned>(IterationKind::Entries)));
     61    m_iterationKindEntries.set(m_vm, jsNumber(static_cast<unsigned>(IterationKind::Entries)));
    6262    m_MAX_ARRAY_INDEX.set(m_vm, jsNumber(MAX_ARRAY_INDEX));
    6363    m_MAX_STRING_LENGTH.set(m_vm, jsNumber(JSString::MaxLength));
     
    9191    m_arrayIteratorFieldIteratedObject.set(m_vm, jsNumber(static_cast<int32_t>(JSArrayIterator::Field::IteratedObject)));
    9292    m_arrayIteratorFieldIndex.set(m_vm, jsNumber(static_cast<int32_t>(JSArrayIterator::Field::Index)));
    93     m_arrayIteratorFieldIsDone.set(m_vm, jsNumber(static_cast<int32_t>(JSArrayIterator::Field::IsDone)));
    9493    m_arrayIteratorFieldKind.set(m_vm, jsNumber(static_cast<int32_t>(JSArrayIterator::Field::Kind)));
    9594    m_asyncGeneratorFieldSuspendReason.set(m_vm, jsNumber(static_cast<unsigned>(JSAsyncGenerator::Field::SuspendReason)));
  • trunk/Source/JavaScriptCore/bytecode/BytecodeIntrinsicRegistry.h

    r254252 r254419  
    9090    macro(iterationKindKey) \
    9191    macro(iterationKindValue) \
    92     macro(iterationKindKeyValue) \
     92    macro(iterationKindEntries) \
    9393    macro(MAX_ARRAY_INDEX) \
    9494    macro(MAX_STRING_LENGTH) \
  • trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp

    r254252 r254419  
    10701070    if (node->entry().emitter() == &BytecodeIntrinsicNode::emit_intrinsic_arrayIteratorFieldIndex)
    10711071        return JSArrayIterator::Field::Index;
    1072     if (node->entry().emitter() == &BytecodeIntrinsicNode::emit_intrinsic_arrayIteratorFieldIsDone)
    1073         return JSArrayIterator::Field::IsDone;
    10741072    if (node->entry().emitter() == &BytecodeIntrinsicNode::emit_intrinsic_arrayIteratorFieldIteratedObject)
    10751073        return JSArrayIterator::Field::IteratedObject;
  • trunk/Source/JavaScriptCore/inspector/JSInjectedScriptHost.cpp

    r254252 r254419  
    547547    JSArrayIterator* clone = JSArrayIterator::create(vm, globalObject->arrayIteratorStructure(), iteratorObject->iteratedObject(), iteratorObject->internalField(JSArrayIterator::Field::Kind).get());
    548548    clone->internalField(JSArrayIterator::Field::Index).set(vm, clone, iteratorObject->internalField(JSArrayIterator::Field::Index).get());
    549     clone->internalField(JSArrayIterator::Field::IsDone).set(vm, clone, iteratorObject->internalField(JSArrayIterator::Field::IsDone).get());
    550549    return clone;
    551550}
  • trunk/Source/JavaScriptCore/runtime/JSArrayIterator.cpp

    r254252 r254419  
    6363void JSArrayIterator::finishCreation(VM& vm)
    6464{
     65    Base::finishCreation(vm);
    6566    auto values = initialValues();
    6667    for (unsigned index = 0; index < values.size(); ++index)
    6768        Base::internalField(index).set(vm, this, values[index]);
    68     Base::finishCreation(vm);
    6969}
    7070
  • trunk/Source/JavaScriptCore/runtime/JSArrayIterator.h

    r254252 r254419  
    3636    enum class Field : uint8_t {
    3737        Index = 0,
    38         IsDone,
    3938        IteratedObject,
    4039        Kind,
    4140    };
    4241
    43     // JSArrayIterator has one inline storage slot, which is pointing internalField(0).
    4442    static size_t allocationSize(Checked<size_t> inlineCapacity)
    4543    {
     
    5856        return { {
    5957            jsNumber(0),
    60             jsBoolean(false),
    6158            jsNull(),
    6259            jsNumber(0),
Note: See TracChangeset for help on using the changeset viewer.