⚠ Archived content — this site is no longer maintained.   Current WebKit documentation is at docs.webkit.org.

Changeset 221223 in webkit


Ignore:
Timestamp:
Aug 26, 2017, 1:01:24 AM (9 years ago)
Author:
Yusuke Suzuki
Message:

Merge WeakMapData into JSWeakMap and JSWeakSet
​https://bugs.webkit.org/show_bug.cgi?id=143919

Reviewed by Darin Adler.

This patch changes WeakMapData from JSCell to JSDestructibleObject,
renaming it to WeakMapBase, and JSWeakMap and JSWeakSet simply inherit
it instead of separately allocating WeakMapData. This reduces memory
consumption and allocation times.

Also this patch a bit optimizes sizeof(DeadKeyCleaner) by dropping m_target
field. Since this class is always embedded in WeakMapBase, we can calculate
WeakMapBase address from the address of DeadKeyCleaner.

This patch does not include the optimization changing WeakMapData to Set
for JSWeakSet.

  • CMakeLists.txt:
  • JavaScriptCore.xcodeproj/project.pbxproj:
  • inspector/JSInjectedScriptHost.cpp:

(Inspector::JSInjectedScriptHost::weakMapSize):
(Inspector::JSInjectedScriptHost::weakMapEntries):
(Inspector::JSInjectedScriptHost::weakSetSize):
(Inspector::JSInjectedScriptHost::weakSetEntries):

  • runtime/JSWeakMap.cpp:

(JSC::JSWeakMap::finishCreation): Deleted.
(JSC::JSWeakMap::visitChildren): Deleted.

  • runtime/JSWeakMap.h:

(JSC::JSWeakMap::createStructure): Deleted.
(JSC::JSWeakMap::create): Deleted.
(JSC::JSWeakMap::weakMapData): Deleted.
(JSC::JSWeakMap::JSWeakMap): Deleted.

  • runtime/JSWeakSet.cpp:

(JSC::JSWeakSet::finishCreation): Deleted.
(JSC::JSWeakSet::visitChildren): Deleted.

  • runtime/JSWeakSet.h:

(JSC::JSWeakSet::createStructure): Deleted.
(JSC::JSWeakSet::create): Deleted.
(JSC::JSWeakSet::weakMapData): Deleted.
(JSC::JSWeakSet::JSWeakSet): Deleted.

  • runtime/VM.cpp:

(JSC::VM::VM):

  • runtime/VM.h:
  • runtime/WeakMapBase.cpp: Renamed from Source/JavaScriptCore/runtime/WeakMapData.cpp.

(JSC::WeakMapBase::WeakMapBase):
(JSC::WeakMapBase::destroy):
(JSC::WeakMapBase::estimatedSize):
(JSC::WeakMapBase::visitChildren):
(JSC::WeakMapBase::set):
(JSC::WeakMapBase::get):
(JSC::WeakMapBase::remove):
(JSC::WeakMapBase::contains):
(JSC::WeakMapBase::clear):
(JSC::WeakMapBase::DeadKeyCleaner::target):
(JSC::WeakMapBase::DeadKeyCleaner::visitWeakReferences):
(JSC::WeakMapBase::DeadKeyCleaner::finalizeUnconditionally):

  • runtime/WeakMapBase.h: Renamed from Source/JavaScriptCore/runtime/WeakMapData.h.

(JSC::WeakMapBase::size const):

  • runtime/WeakMapPrototype.cpp:

(JSC::getWeakMap):
(JSC::protoFuncWeakMapDelete):
(JSC::protoFuncWeakMapGet):
(JSC::protoFuncWeakMapHas):
(JSC::protoFuncWeakMapSet):
(JSC::getWeakMapData): Deleted.

  • runtime/WeakSetPrototype.cpp:

(JSC::getWeakSet):
(JSC::protoFuncWeakSetDelete):
(JSC::protoFuncWeakSetHas):
(JSC::protoFuncWeakSetAdd):
(JSC::getWeakMapData): Deleted.

Location:
trunk/Source/JavaScriptCore
Files:
12 edited
2 moved

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/CMakeLists.txt

    r221196 r221223  
    936936    runtime/VarOffset.cpp
    937937    runtime/Watchdog.cpp
     938    runtime/WeakMapBase.cpp
    938939    runtime/WeakMapConstructor.cpp
    939     runtime/WeakMapData.cpp
    940940    runtime/WeakMapPrototype.cpp
    941941    runtime/WeakSetConstructor.cpp
  • trunk/Source/JavaScriptCore/ChangeLog

    r221213 r221223  
     12017-08-26  Yusuke Suzuki  <utatane.tea@gmail.com>
     2
     3        Merge WeakMapData into JSWeakMap and JSWeakSet
     4        https://bugs.webkit.org/show_bug.cgi?id=143919
     5
     6        Reviewed by Darin Adler.
     7
     8        This patch changes WeakMapData from JSCell to JSDestructibleObject,
     9        renaming it to WeakMapBase, and JSWeakMap and JSWeakSet simply inherit
     10        it instead of separately allocating WeakMapData. This reduces memory
     11        consumption and allocation times.
     12
     13        Also this patch a bit optimizes sizeof(DeadKeyCleaner) by dropping m_target
     14        field. Since this class is always embedded in WeakMapBase, we can calculate
     15        WeakMapBase address from the address of DeadKeyCleaner.
     16
     17        This patch does not include the optimization changing WeakMapData to Set
     18        for JSWeakSet.
     19
     20        * CMakeLists.txt:
     21        * JavaScriptCore.xcodeproj/project.pbxproj:
     22        * inspector/JSInjectedScriptHost.cpp:
     23        (Inspector::JSInjectedScriptHost::weakMapSize):
     24        (Inspector::JSInjectedScriptHost::weakMapEntries):
     25        (Inspector::JSInjectedScriptHost::weakSetSize):
     26        (Inspector::JSInjectedScriptHost::weakSetEntries):
     27        * runtime/JSWeakMap.cpp:
     28        (JSC::JSWeakMap::finishCreation): Deleted.
     29        (JSC::JSWeakMap::visitChildren): Deleted.
     30        * runtime/JSWeakMap.h:
     31        (JSC::JSWeakMap::createStructure): Deleted.
     32        (JSC::JSWeakMap::create): Deleted.
     33        (JSC::JSWeakMap::weakMapData): Deleted.
     34        (JSC::JSWeakMap::JSWeakMap): Deleted.
     35        * runtime/JSWeakSet.cpp:
     36        (JSC::JSWeakSet::finishCreation): Deleted.
     37        (JSC::JSWeakSet::visitChildren): Deleted.
     38        * runtime/JSWeakSet.h:
     39        (JSC::JSWeakSet::createStructure): Deleted.
     40        (JSC::JSWeakSet::create): Deleted.
     41        (JSC::JSWeakSet::weakMapData): Deleted.
     42        (JSC::JSWeakSet::JSWeakSet): Deleted.
     43        * runtime/VM.cpp:
     44        (JSC::VM::VM):
     45        * runtime/VM.h:
     46        * runtime/WeakMapBase.cpp: Renamed from Source/JavaScriptCore/runtime/WeakMapData.cpp.
     47        (JSC::WeakMapBase::WeakMapBase):
     48        (JSC::WeakMapBase::destroy):
     49        (JSC::WeakMapBase::estimatedSize):
     50        (JSC::WeakMapBase::visitChildren):
     51        (JSC::WeakMapBase::set):
     52        (JSC::WeakMapBase::get):
     53        (JSC::WeakMapBase::remove):
     54        (JSC::WeakMapBase::contains):
     55        (JSC::WeakMapBase::clear):
     56        (JSC::WeakMapBase::DeadKeyCleaner::target):
     57        (JSC::WeakMapBase::DeadKeyCleaner::visitWeakReferences):
     58        (JSC::WeakMapBase::DeadKeyCleaner::finalizeUnconditionally):
     59        * runtime/WeakMapBase.h: Renamed from Source/JavaScriptCore/runtime/WeakMapData.h.
     60        (JSC::WeakMapBase::size const):
     61        * runtime/WeakMapPrototype.cpp:
     62        (JSC::getWeakMap):
     63        (JSC::protoFuncWeakMapDelete):
     64        (JSC::protoFuncWeakMapGet):
     65        (JSC::protoFuncWeakMapHas):
     66        (JSC::protoFuncWeakMapSet):
     67        (JSC::getWeakMapData): Deleted.
     68        * runtime/WeakSetPrototype.cpp:
     69        (JSC::getWeakSet):
     70        (JSC::protoFuncWeakSetDelete):
     71        (JSC::protoFuncWeakSetHas):
     72        (JSC::protoFuncWeakSetAdd):
     73        (JSC::getWeakMapData): Deleted.
     74
    1752017-08-25  Daniel Bates  <dabates@apple.com>
    276
  • trunk/Source/JavaScriptCore/JavaScriptCore.xcodeproj/project.pbxproj

    r221196 r221223  
    20572057                A7CA3AE717DA41AE006538AF /* JSWeakMap.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A7CA3AE117DA41AE006538AF /* JSWeakMap.cpp */; };
    20582058                A7CA3AE817DA41AE006538AF /* JSWeakMap.h in Headers */ = {isa = PBXBuildFile; fileRef = A7CA3AE217DA41AE006538AF /* JSWeakMap.h */; };
    2059                 A7CA3AEB17DA5168006538AF /* WeakMapData.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A7CA3AE917DA5168006538AF /* WeakMapData.cpp */; };
    2060                 A7CA3AEC17DA5168006538AF /* WeakMapData.h in Headers */ = {isa = PBXBuildFile; fileRef = A7CA3AEA17DA5168006538AF /* WeakMapData.h */; };
     2059                A7CA3AEB17DA5168006538AF /* WeakMapBase.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A7CA3AE917DA5168006538AF /* WeakMapBase.cpp */; };
     2060                A7CA3AEC17DA5168006538AF /* WeakMapBase.h in Headers */ = {isa = PBXBuildFile; fileRef = A7CA3AEA17DA5168006538AF /* WeakMapBase.h */; };
    20612061                A7D801A41880D66E0026C39B /* BuiltinExecutables.cpp in Sources */ = {isa = PBXBuildFile; fileRef = A7D801A11880D66E0026C39B /* BuiltinExecutables.cpp */; };
    20622062                A7D801A51880D66E0026C39B /* BuiltinExecutables.h in Headers */ = {isa = PBXBuildFile; fileRef = A7D801A21880D66E0026C39B /* BuiltinExecutables.h */; settings = {ATTRIBUTES = (Private, ); }; };
    … …  
    47174717                A7CA3AE117DA41AE006538AF /* JSWeakMap.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSWeakMap.cpp; sourceTree = "<group>"; };
    47184718                A7CA3AE217DA41AE006538AF /* JSWeakMap.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSWeakMap.h; sourceTree = "<group>"; };
    4719                 A7CA3AE917DA5168006538AF /* WeakMapData.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WeakMapData.cpp; sourceTree = "<group>"; };
    4720                 A7CA3AEA17DA5168006538AF /* WeakMapData.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WeakMapData.h; sourceTree = "<group>"; };
     4719                A7CA3AE917DA5168006538AF /* WeakMapBase.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = WeakMapBase.cpp; sourceTree = "<group>"; };
     4720                A7CA3AEA17DA5168006538AF /* WeakMapBase.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WeakMapBase.h; sourceTree = "<group>"; };
    47214721                A7D801A01880D66E0026C39B /* ArrayPrototype.js */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.javascript; path = ArrayPrototype.js; sourceTree = "<group>"; };
    47224722                A7D801A11880D66E0026C39B /* BuiltinExecutables.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = BuiltinExecutables.cpp; sourceTree = "<group>"; };
    … …  
    72367236                                14BFCE6810CDB1FC00364CCE /* WeakGCMap.h */,
    72377237                                AD86A93D1AA4D87C002FE77F /* WeakGCMapInlines.h */,
     7238                                A7CA3AE917DA5168006538AF /* WeakMapBase.cpp */,
     7239                                A7CA3AEA17DA5168006538AF /* WeakMapBase.h */,
    72387240                                A7CA3ADD17DA41AE006538AF /* WeakMapConstructor.cpp */,
    72397241                                A7CA3ADE17DA41AE006538AF /* WeakMapConstructor.h */,
    7240                                 A7CA3AE917DA5168006538AF /* WeakMapData.cpp */,
    7241                                 A7CA3AEA17DA5168006538AF /* WeakMapData.h */,
    72427242                                A7CA3ADF17DA41AE006538AF /* WeakMapPrototype.cpp */,
    72437243                                A7CA3AE017DA41AE006538AF /* WeakMapPrototype.h */,
    … …  
    96609660                                14E84FA214EE1ACC00D6D5D4 /* WeakImpl.h in Headers */,
    96619661                                14BE7D3317135CF400D1807A /* WeakInlines.h in Headers */,
     9662                                A7CA3AEC17DA5168006538AF /* WeakMapBase.h in Headers */,
    96629663                                A7CA3AE417DA41AE006538AF /* WeakMapConstructor.h in Headers */,
    9663                                 A7CA3AEC17DA5168006538AF /* WeakMapData.h in Headers */,
    96649664                                A7CA3AE617DA41AE006538AF /* WeakMapPrototype.h in Headers */,
    96659665                                0F242DA713F3B1E8007ADD4C /* WeakReferenceHarvester.h in Headers */,
    … …  
    1115011150                                14E84F9E14EE1ACC00D6D5D4 /* WeakBlock.cpp in Sources */,
    1115111151                                14F7256514EE265E00B1652B /* WeakHandleOwner.cpp in Sources */,
     11152                                A7CA3AEB17DA5168006538AF /* WeakMapBase.cpp in Sources */,
    1115211153                                A7CA3AE317DA41AE006538AF /* WeakMapConstructor.cpp in Sources */,
    11153                                 A7CA3AEB17DA5168006538AF /* WeakMapData.cpp in Sources */,
    1115411154                                A7CA3AE517DA41AE006538AF /* WeakMapPrototype.cpp in Sources */,
    1115511155                                14E84FA014EE1ACC00D6D5D4 /* WeakSet.cpp in Sources */,
  • trunk/Source/JavaScriptCore/inspector/JSInjectedScriptHost.cpp

    r221110 r221223  
    5959#include "SourceCode.h"
    6060#include "TypedArrayInlines.h"
    61 #include "WeakMapData.h"
     61#include "WeakMapBase.h"
    6262
    6363using namespace JSC;
    … …  
    430430        return jsUndefined();
    431431
    432     return jsNumber(weakMap->weakMapData()->size());
     432    return jsNumber(weakMap->size());
    433433}
    434434
    … …  
    455455    JSArray* array = constructEmptyArray(exec, nullptr);
    456456    RETURN_IF_EXCEPTION(scope, JSValue());
    457     for (auto it = weakMap->weakMapData()->begin(); it != weakMap->weakMapData()->end(); ++it) {
     457    for (auto it = weakMap->begin(); it != weakMap->end(); ++it) {
    458458        JSObject* entry = constructEmptyObject(exec);
    459459        entry->putDirect(exec->vm(), Identifier::fromString(exec, "key"), it->key);
    … …  
    479479        return jsUndefined();
    480480
    481     return jsNumber(weakSet->weakMapData()->size());
     481    return jsNumber(weakSet->size());
    482482}
    483483
    … …  
    504504    JSArray* array = constructEmptyArray(exec, nullptr);
    505505    RETURN_IF_EXCEPTION(scope, JSValue());
    506     for (auto it = weakSet->weakMapData()->begin(); it != weakSet->weakMapData()->end(); ++it) {
     506    for (auto it = weakSet->begin(); it != weakSet->end(); ++it) {
    507507        JSObject* entry = constructEmptyObject(exec);
    508508        entry->putDirect(exec->vm(), Identifier::fromString(exec, "value"), it->key);
  • trunk/Source/JavaScriptCore/runtime/JSWeakMap.cpp

    r217108 r221223  
    2828
    2929#include "JSCInlines.h"
    30 #include "WeakMapData.h"
     30#include "WeakMapBase.h"
    3131
    3232namespace JSC {
    3333
    3434const ClassInfo JSWeakMap::s_info = { "WeakMap", &Base::s_info, nullptr, nullptr, CREATE_METHOD_TABLE(JSWeakMap) };
    35 
    36 void JSWeakMap::finishCreation(VM& vm)
    37 {
    38     Base::finishCreation(vm);
    39     m_weakMapData.set(vm, this, WeakMapData::create(vm));
    40 }
    41 
    42 void JSWeakMap::visitChildren(JSCell* cell, SlotVisitor& visitor)
    43 {
    44     Base::visitChildren(cell, visitor);
    45     JSWeakMap* thisObj = jsCast<JSWeakMap*>(cell);
    46     visitor.append(thisObj->m_weakMapData);
    47 }
    4835
    4936String JSWeakMap::toStringName(const JSObject*, ExecState*)
  • trunk/Source/JavaScriptCore/runtime/JSWeakMap.h

    r206525 r221223  
    2727
    2828#include "JSObject.h"
     29#include "WeakMapBase.h"
    2930
    3031namespace JSC {
    3132
    32 class WeakMapData;
    33 
    34 class JSWeakMap : public JSNonFinalObject {
     33class JSWeakMap final : public WeakMapBase {
    3534public:
    36     typedef JSNonFinalObject Base;
     35    using Base = WeakMapBase;
    3736
    3837    DECLARE_EXPORT_INFO;
    … …  
    5554    }
    5655
    57     WeakMapData* weakMapData() { return m_weakMapData.get(); }
    58 
    59     JSValue get(CallFrame*, JSObject*);
    60     bool has(CallFrame*, JSObject*);
    61     bool remove(CallFrame*, JSObject*);
    62 
    63     void set(CallFrame*, JSObject*, JSValue);
    64     void clear(CallFrame*);
    65 
    6656private:
    6757    JSWeakMap(VM& vm, Structure* structure)
    … …  
    7060    }
    7161
    72     void finishCreation(VM&);
    73     static void visitChildren(JSCell*, SlotVisitor&);
    7462    static String toStringName(const JSObject*, ExecState*);
    75 
    76     WriteBarrier<WeakMapData> m_weakMapData;
    7763};
    7864
  • trunk/Source/JavaScriptCore/runtime/JSWeakSet.cpp

    r217108 r221223  
    2828
    2929#include "JSCInlines.h"
    30 #include "WeakMapData.h"
     30#include "WeakMapBase.h"
    3131
    3232namespace JSC {
    3333
    3434const ClassInfo JSWeakSet::s_info = { "WeakSet", &Base::s_info, nullptr, nullptr, CREATE_METHOD_TABLE(JSWeakSet) };
    35 
    36 void JSWeakSet::finishCreation(VM& vm)
    37 {
    38     Base::finishCreation(vm);
    39     m_weakMapData.set(vm, this, WeakMapData::create(vm));
    40 }
    41 
    42 void JSWeakSet::visitChildren(JSCell* cell, SlotVisitor& visitor)
    43 {
    44     Base::visitChildren(cell, visitor);
    45     JSWeakSet* thisObj = jsCast<JSWeakSet*>(cell);
    46     visitor.append(thisObj->m_weakMapData);
    47 }
    4835
    4936String JSWeakSet::toStringName(const JSC::JSObject*, ExecState*)
  • trunk/Source/JavaScriptCore/runtime/JSWeakSet.h

    r206525 r221223  
    2727
    2828#include "JSObject.h"
     29#include "WeakMapBase.h"
    2930
    3031namespace JSC {
    3132
    32 class WeakMapData;
    33 
    34 class JSWeakSet : public JSNonFinalObject {
     33class JSWeakSet final : public WeakMapBase {
    3534public:
    36     typedef JSNonFinalObject Base;
     35    using Base = WeakMapBase;
    3736
    3837    DECLARE_EXPORT_INFO;
    … …  
    5554    }
    5655
    57     WeakMapData* weakMapData() { return m_weakMapData.get(); }
    58 
    59     JSValue get(CallFrame*, JSObject*);
    60     bool has(CallFrame*, JSObject*);
    61     bool remove(CallFrame*, JSObject*);
    62 
    63     void set(CallFrame*, JSObject*, JSValue);
    64     void clear(CallFrame*);
    65 
    6656private:
    6757    JSWeakSet(VM& vm, Structure* structure)
    … …  
    7060    }
    7161
    72     void finishCreation(VM&);
    73     static void visitChildren(JSCell*, SlotVisitor&);
    7462    static String toStringName(const JSObject*, ExecState*);
    75 
    76     WriteBarrier<WeakMapData> m_weakMapData;
    7763};
    7864
  • trunk/Source/JavaScriptCore/runtime/VM.cpp

    r221110 r221223  
    115115#include "Watchdog.h"
    116116#include "WeakGCMapInlines.h"
    117 #include "WeakMapData.h"
    118117#include <wtf/CurrentTime.h>
    119118#include <wtf/ProcessID.h>
    … …  
    265264    unlinkedModuleProgramCodeBlockStructure.set(*this, UnlinkedModuleProgramCodeBlock::createStructure(*this, 0, jsNull()));
    266265    propertyTableStructure.set(*this, PropertyTable::createStructure(*this, 0, jsNull()));
    267     weakMapDataStructure.set(*this, WeakMapData::createStructure(*this, 0, jsNull()));
    268266    inferredValueStructure.set(*this, InferredValue::createStructure(*this, 0, jsNull()));
    269267    inferredTypeStructure.set(*this, InferredType::createStructure(*this, 0, jsNull()));
  • trunk/Source/JavaScriptCore/runtime/VM.h

    r221110 r221223  
    370370    Strong<Structure> unlinkedModuleProgramCodeBlockStructure;
    371371    Strong<Structure> propertyTableStructure;
    372     Strong<Structure> weakMapDataStructure;
    373372    Strong<Structure> inferredValueStructure;
    374373    Strong<Structure> inferredTypeStructure;
  • trunk/Source/JavaScriptCore/runtime/WeakMapBase.cpp

    r221222 r221223  
    2525
    2626#include "config.h"
    27 #include "WeakMapData.h"
     27#include "WeakMapBase.h"
    2828
    2929#include "ExceptionHelpers.h"
    … …  
    3434namespace JSC {
    3535
    36 const ClassInfo WeakMapData::s_info = { "WeakMapData", nullptr, nullptr, nullptr, CREATE_METHOD_TABLE(WeakMapData) };
     36const ClassInfo WeakMapBase::s_info = { "WeakMapBase", &Base::s_info, nullptr, nullptr, CREATE_METHOD_TABLE(WeakMapBase) };
    3737
    38 WeakMapData::WeakMapData(VM& vm)
    39     : Base(vm, vm.weakMapDataStructure.get())
    40     , m_deadKeyCleaner(this)
     38WeakMapBase::WeakMapBase(VM& vm, Structure* structure)
     39    : Base(vm, structure)
    4140{
     41    ASSERT(m_deadKeyCleaner.target() == this);
    4242}
    4343
    44 void WeakMapData::finishCreation(VM& vm)
     44void WeakMapBase::destroy(JSCell* cell)
    4545{
    46     Base::finishCreation(vm);
     46    static_cast<WeakMapBase*>(cell)->~WeakMapBase();
    4747}
    4848
    49 void WeakMapData::destroy(JSCell* cell)
     49size_t WeakMapBase::estimatedSize(JSCell* cell)
    5050{
    51     static_cast<WeakMapData*>(cell)->~WeakMapData();
    52 }
    53 
    54 size_t WeakMapData::estimatedSize(JSCell* cell)
    55 {
    56     WeakMapData* thisObj = jsCast<WeakMapData*>(cell);
     51    auto* thisObj = jsCast<WeakMapBase*>(cell);
    5752    return Base::estimatedSize(cell) + (thisObj->m_map.capacity() * (sizeof(JSObject*) + sizeof(WriteBarrier<Unknown>)));
    5853}
    5954
    60 void WeakMapData::visitChildren(JSCell* cell, SlotVisitor& visitor)
     55void WeakMapBase::visitChildren(JSCell* cell, SlotVisitor& visitor)
    6156{
    6257    Base::visitChildren(cell, visitor);
    63     WeakMapData* thisObj = jsCast<WeakMapData*>(cell);
     58    auto* thisObj = jsCast<WeakMapBase*>(cell);
    6459    visitor.addUnconditionalFinalizer(&thisObj->m_deadKeyCleaner);
    6560    visitor.addWeakReferenceHarvester(&thisObj->m_deadKeyCleaner);
    … …  
    7166}
    7267
    73 void WeakMapData::set(VM& vm, JSObject* key, JSValue value)
     68void WeakMapBase::set(VM& vm, JSObject* key, JSValue value)
    7469{
    7570    // Here we force the write barrier on the key.
    … …  
    7873}
    7974
    80 JSValue WeakMapData::get(JSObject* key)
     75JSValue WeakMapBase::get(JSObject* key)
    8176{
    8277    auto iter = m_map.find(key);
    … …  
    8681}
    8782
    88 bool WeakMapData::remove(JSObject* key)
     83bool WeakMapBase::remove(JSObject* key)
    8984{
    90     auto iter = m_map.find(key);
    91     if (iter == m_map.end())
    92         return false;
    93 
    94     m_map.remove(iter);
    95     return true;
     85    return m_map.remove(key);
    9686}
    9787
    98 bool WeakMapData::contains(JSObject* key)
     88bool WeakMapBase::contains(JSObject* key)
    9989{
    10090    return m_map.contains(key);
    10191}
    10292
    103 void WeakMapData::clear()
     93void WeakMapBase::clear()
    10494{
    10595    m_map.clear();
    10696}
    10797
    108 void WeakMapData::DeadKeyCleaner::visitWeakReferences(SlotVisitor& visitor)
     98inline WeakMapBase* WeakMapBase::DeadKeyCleaner::target()
    10999{
     100    return bitwise_cast<WeakMapBase*>(bitwise_cast<char*>(this) - OBJECT_OFFSETOF(WeakMapBase, m_deadKeyCleaner));
     101}
     102
     103void WeakMapBase::DeadKeyCleaner::visitWeakReferences(SlotVisitor& visitor)
     104{
     105    WeakMapBase* map = target();
    110106    m_liveKeyCount = 0;
    111     for (auto& pair : m_target->m_map) {
     107    for (auto& pair : map->m_map) {
    112108        if (!Heap::isMarked(pair.key))
    113109            continue;
    … …  
    115111        visitor.append(pair.value);
    116112    }
    117     RELEASE_ASSERT(m_liveKeyCount <= m_target->m_map.size());
     113    ASSERT(m_liveKeyCount <= map->m_map.size());
    118114}
    119115
    120 void WeakMapData::DeadKeyCleaner::finalizeUnconditionally()
     116void WeakMapBase::DeadKeyCleaner::finalizeUnconditionally()
    121117{
    122     if (m_liveKeyCount > m_target->m_map.size() / 2) {
    123         RELEASE_ASSERT(m_liveKeyCount <= m_target->m_map.size());
    124         int deadCount = m_target->m_map.size() - m_liveKeyCount;
     118    WeakMapBase* map = target();
     119    if (m_liveKeyCount > map->m_map.size() / 2) {
     120        RELEASE_ASSERT(m_liveKeyCount <= map->m_map.size());
     121        int deadCount = map->m_map.size() - m_liveKeyCount;
    125122        if (!deadCount)
    126123            return;
    127124        Vector<JSObject*> deadEntries;
    128125        deadEntries.reserveCapacity(deadCount);
    129         for (auto& pair : m_target->m_map) {
     126        for (auto& pair : map->m_map) {
    130127            if (Heap::isMarked(pair.key))
    131128                continue;
    … …  
    133130        }
    134131        for (auto& deadEntry : deadEntries)
    135             m_target->m_map.remove(deadEntry);
     132            map->m_map.remove(deadEntry);
    136133    } else {
    137134        MapType newMap;
    138         for (auto& pair : m_target->m_map) {
     135        for (auto& pair : map->m_map) {
    139136            if (!Heap::isMarked(pair.key))
    140137                continue;
    141138            newMap.add(pair.key, pair.value);
    142139        }
    143         m_target->m_map.swap(newMap);
     140        map->m_map.swap(newMap);
    144141    }
    145142}
  • trunk/Source/JavaScriptCore/runtime/WeakMapBase.h

    r221222 r221223  
    2626#pragma once
    2727
    28 #include "JSCell.h"
     28#include "JSDestructibleObject.h"
    2929#include "Structure.h"
    3030#include <wtf/HashMap.h>
    … …  
    3333namespace JSC {
    3434
    35 class WeakMapData final : public JSCell {
     35class WeakMapBase : public JSDestructibleObject {
    3636public:
    37     typedef JSCell Base;
    38     static const unsigned StructureFlags = Base::StructureFlags | StructureIsImmortal;
    39 
    40     static WeakMapData* create(VM& vm)
    41     {
    42         WeakMapData* weakMapData = new (NotNull, allocateCell<WeakMapData>(vm.heap)) WeakMapData(vm);
    43         weakMapData->finishCreation(vm);
    44         return weakMapData;
    45     }
    46 
    47     static Structure* createStructure(VM& vm, JSGlobalObject* globalObject, JSValue prototype)
    48     {
    49         return Structure::create(vm, globalObject, prototype, TypeInfo(CellType, StructureFlags), info());
    50     }
    51 
    52     static const bool needsDestruction = true;
     37    using Base = JSDestructibleObject;
    5338
    5439    void set(VM&, JSObject*, JSValue);
    … …  
    6045    DECLARE_INFO;
    6146
    62     typedef HashMap<JSObject*, WriteBarrier<Unknown>> MapType;
     47    using MapType = HashMap<JSObject*, WriteBarrier<Unknown>>;
    6348    MapType::const_iterator begin() const { return m_map.begin(); }
    6449    MapType::const_iterator end() const { return m_map.end(); }
    6550
    66     int size() const { return m_map.size(); }
     51    unsigned size() const { return m_map.size(); }
    6752
    68 private:
    69     WeakMapData(VM&);
    70     static void destroy(JSCell*);
    7153    static size_t estimatedSize(JSCell*);
    7254    static void visitChildren(JSCell*, SlotVisitor&);
    73     void finishCreation(VM&);
     55
     56protected:
     57    WeakMapBase(VM&, Structure*);
     58    static void destroy(JSCell*);
    7459
    7560    class DeadKeyCleaner : public UnconditionalFinalizer, public WeakReferenceHarvester {
    7661    public:
    77         DeadKeyCleaner(WeakMapData* target)
    78             : m_target(target)
    79         {
    80         }
     62        WeakMapBase* target();
     63
    8164    private:
    8265        void visitWeakReferences(SlotVisitor&) override;
    8366        void finalizeUnconditionally() override;
    8467        unsigned m_liveKeyCount;
    85         WeakMapData* m_target;
    8668    };
    8769    DeadKeyCleaner m_deadKeyCleaner;
  • trunk/Source/JavaScriptCore/runtime/WeakMapPrototype.cpp

    r217108 r221223  
    2929#include "JSCInlines.h"
    3030#include "JSWeakMap.h"
    31 #include "WeakMapData.h"
     31#include "WeakMapBase.h"
    3232
    3333namespace JSC {
    … …  
    5454}
    5555
    56 static WeakMapData* getWeakMapData(CallFrame* callFrame, JSValue value)
     56static JSWeakMap* getWeakMap(CallFrame* callFrame, JSValue value)
    5757{
    5858    VM& vm = callFrame->vm();
    … …  
    6565
    6666    if (JSWeakMap* weakMap = jsDynamicCast<JSWeakMap*>(vm, value))
    67         return weakMap->weakMapData();
     67        return weakMap;
    6868
    6969    throwTypeError(callFrame, scope, WTF::ASCIILiteral("Called WeakMap function on a non-WeakMap object"));
    … …  
    7373EncodedJSValue JSC_HOST_CALL protoFuncWeakMapDelete(CallFrame* callFrame)
    7474{
    75     WeakMapData* map = getWeakMapData(callFrame, callFrame->thisValue());
     75    auto* map = getWeakMap(callFrame, callFrame->thisValue());
    7676    if (!map)
    7777        return JSValue::encode(jsUndefined());
    … …  
    8282EncodedJSValue JSC_HOST_CALL protoFuncWeakMapGet(CallFrame* callFrame)
    8383{
    84     WeakMapData* map = getWeakMapData(callFrame, callFrame->thisValue());
     84    auto* map = getWeakMap(callFrame, callFrame->thisValue());
    8585    if (!map)
    8686        return JSValue::encode(jsUndefined());
    … …  
    9393EncodedJSValue JSC_HOST_CALL protoFuncWeakMapHas(CallFrame* callFrame)
    9494{
    95     WeakMapData* map = getWeakMapData(callFrame, callFrame->thisValue());
     95    auto* map = getWeakMap(callFrame, callFrame->thisValue());
    9696    if (!map)
    9797        return JSValue::encode(jsUndefined());
    … …  
    105105    auto scope = DECLARE_THROW_SCOPE(vm);
    106106
    107     WeakMapData* map = getWeakMapData(callFrame, callFrame->thisValue());
     107    auto* map = getWeakMap(callFrame, callFrame->thisValue());
    108108    ASSERT(!!scope.exception() == !map);
    109109    if (!map)
  • trunk/Source/JavaScriptCore/runtime/WeakSetPrototype.cpp

    r217108 r221223  
    2929#include "JSCInlines.h"
    3030#include "JSWeakSet.h"
    31 #include "WeakMapData.h"
     31#include "WeakMapBase.h"
    3232
    3333namespace JSC {
    … …  
    5252}
    5353
    54 static WeakMapData* getWeakMapData(CallFrame* callFrame, JSValue value)
     54static JSWeakSet* getWeakSet(CallFrame* callFrame, JSValue value)
    5555{
    5656    VM& vm = callFrame->vm();
    … …  
    6363
    6464    if (JSWeakSet* weakSet = jsDynamicCast<JSWeakSet*>(vm, value))
    65         return weakSet->weakMapData();
     65        return weakSet;
    6666
    6767    throwTypeError(callFrame, scope, WTF::ASCIILiteral("Called WeakSet function on a non-WeakSet object"));
    … …  
    7171EncodedJSValue JSC_HOST_CALL protoFuncWeakSetDelete(CallFrame* callFrame)
    7272{
    73     WeakMapData* map = getWeakMapData(callFrame, callFrame->thisValue());
    74     if (!map)
     73    auto* set = getWeakSet(callFrame, callFrame->thisValue());
     74    if (!set)
    7575        return JSValue::encode(jsUndefined());
    7676    JSValue key = callFrame->argument(0);
    77     return JSValue::encode(jsBoolean(key.isObject() && map->remove(asObject(key))));
     77    return JSValue::encode(jsBoolean(key.isObject() && set->remove(asObject(key))));
    7878}
    7979
    8080EncodedJSValue JSC_HOST_CALL protoFuncWeakSetHas(CallFrame* callFrame)
    8181{
    82     WeakMapData* map = getWeakMapData(callFrame, callFrame->thisValue());
    83     if (!map)
     82    auto* set = getWeakSet(callFrame, callFrame->thisValue());
     83    if (!set)
    8484        return JSValue::encode(jsUndefined());
    8585    JSValue key = callFrame->argument(0);
    86     return JSValue::encode(jsBoolean(key.isObject() && map->contains(asObject(key))));
     86    return JSValue::encode(jsBoolean(key.isObject() && set->contains(asObject(key))));
    8787}
    8888
    … …  
    9292    auto scope = DECLARE_THROW_SCOPE(vm);
    9393
    94     WeakMapData* map = getWeakMapData(callFrame, callFrame->thisValue());
    95     ASSERT(!!scope.exception() == !map);
    96     if (!map)
     94    auto* set = getWeakSet(callFrame, callFrame->thisValue());
     95    ASSERT(!!scope.exception() == !set);
     96    if (!set)
    9797        return JSValue::encode(jsUndefined());
    9898    JSValue key = callFrame->argument(0);
    9999    if (!key.isObject())
    100100        return JSValue::encode(throwTypeError(callFrame, scope, WTF::ASCIILiteral("Attempted to add a non-object key to a WeakSet")));
    101     map->set(vm, asObject(key), jsUndefined());
     101    set->set(vm, asObject(key), jsUndefined());
    102102    return JSValue::encode(callFrame->thisValue());
    103103}
Note: See TracChangeset for help on using the changeset viewer.