diff options
| author | Lorry Tar Creator <lorry-tar-importer@lorry> | 2015-05-20 09:56:07 +0000 |
|---|---|---|
| committer | Lorry Tar Creator <lorry-tar-importer@lorry> | 2015-05-20 09:56:07 +0000 |
| commit | 41386e9cb918eed93b3f13648cbef387e371e451 (patch) | |
| tree | a97f9d7bd1d9d091833286085f72da9d83fd0606 /Source/JavaScriptCore/runtime/JSSymbolTableObject.h | |
| parent | e15dd966d523731101f70ccf768bba12435a0208 (diff) | |
| download | WebKitGtk-tarball-41386e9cb918eed93b3f13648cbef387e371e451.tar.gz | |
webkitgtk-2.4.9webkitgtk-2.4.9
Diffstat (limited to 'Source/JavaScriptCore/runtime/JSSymbolTableObject.h')
| -rw-r--r-- | Source/JavaScriptCore/runtime/JSSymbolTableObject.h | 70 |
1 files changed, 27 insertions, 43 deletions
diff --git a/Source/JavaScriptCore/runtime/JSSymbolTableObject.h b/Source/JavaScriptCore/runtime/JSSymbolTableObject.h index 9fe8384c6..b5b20a845 100644 --- a/Source/JavaScriptCore/runtime/JSSymbolTableObject.h +++ b/Source/JavaScriptCore/runtime/JSSymbolTableObject.h @@ -1,5 +1,5 @@ /* - * Copyright (C) 2012, 2014, 2015 Apple Inc. All rights reserved. + * Copyright (C) 2012 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions @@ -10,7 +10,7 @@ * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. - * 3. Neither the name of Apple Inc. ("Apple") nor the names of + * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of * its contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * @@ -32,47 +32,37 @@ #include "JSScope.h" #include "PropertyDescriptor.h" #include "SymbolTable.h" -#include "VariableWriteFireDetail.h" namespace JSC { -class JSSymbolTableObject; - class JSSymbolTableObject : public JSScope { public: typedef JSScope Base; - static const unsigned StructureFlags = Base::StructureFlags | IsEnvironmentRecord | OverridesGetPropertyNames; SymbolTable* symbolTable() const { return m_symbolTable.get(); } JS_EXPORT_PRIVATE static bool deleteProperty(JSCell*, ExecState*, PropertyName); JS_EXPORT_PRIVATE static void getOwnNonIndexPropertyNames(JSObject*, ExecState*, PropertyNameArray&, EnumerationMode); - static ptrdiff_t offsetOfSymbolTable() { return OBJECT_OFFSETOF(JSSymbolTableObject, m_symbolTable); } - protected: - JSSymbolTableObject(VM& vm, Structure* structure, JSScope* scope) - : Base(vm, structure, scope) - { - } + static const unsigned StructureFlags = IsEnvironmentRecord | OverridesVisitChildren | OverridesGetPropertyNames | Base::StructureFlags; - JSSymbolTableObject(VM& vm, Structure* structure, JSScope* scope, SymbolTable* symbolTable) + JSSymbolTableObject(VM& vm, Structure* structure, JSScope* scope, SymbolTable* symbolTable = 0) : Base(vm, structure, scope) { - ASSERT(symbolTable); - setSymbolTable(vm, symbolTable); + if (symbolTable) + m_symbolTable.set(vm, this, symbolTable); } - - void setSymbolTable(VM& vm, SymbolTable* symbolTable) + + void finishCreation(VM& vm) { - ASSERT(!m_symbolTable); - symbolTable->singletonScope()->notifyWrite(vm, this, "Allocated a scope"); - m_symbolTable.set(vm, this, symbolTable); + Base::finishCreation(vm); + if (!m_symbolTable) + m_symbolTable.set(vm, this, SymbolTable::create(vm)); } - + static void visitChildren(JSCell*, SlotVisitor&); - -private: + WriteBarrier<SymbolTable> m_symbolTable; }; @@ -82,12 +72,12 @@ inline bool symbolTableGet( { SymbolTable& symbolTable = *object->symbolTable(); ConcurrentJITLocker locker(symbolTable.m_lock); - SymbolTable::Map::iterator iter = symbolTable.find(locker, propertyName.uid()); + SymbolTable::Map::iterator iter = symbolTable.find(locker, propertyName.publicName()); if (iter == symbolTable.end(locker)) return false; SymbolTableEntry::Fast entry = iter->value; ASSERT(!entry.isNull()); - slot.setValue(object, entry.getAttributes() | DontDelete, object->variableAt(entry.scopeOffset()).get()); + slot.setValue(object, entry.getAttributes() | DontDelete, object->registerAt(entry.getIndex()).get()); return true; } @@ -97,13 +87,13 @@ inline bool symbolTableGet( { SymbolTable& symbolTable = *object->symbolTable(); ConcurrentJITLocker locker(symbolTable.m_lock); - SymbolTable::Map::iterator iter = symbolTable.find(locker, propertyName.uid()); + SymbolTable::Map::iterator iter = symbolTable.find(locker, propertyName.publicName()); if (iter == symbolTable.end(locker)) return false; SymbolTableEntry::Fast entry = iter->value; ASSERT(!entry.isNull()); descriptor.setDescriptor( - object->variableAt(entry.scopeOffset()).get(), entry.getAttributes() | DontDelete); + object->registerAt(entry.getIndex()).get(), entry.getAttributes() | DontDelete); return true; } @@ -114,12 +104,12 @@ inline bool symbolTableGet( { SymbolTable& symbolTable = *object->symbolTable(); ConcurrentJITLocker locker(symbolTable.m_lock); - SymbolTable::Map::iterator iter = symbolTable.find(locker, propertyName.uid()); + SymbolTable::Map::iterator iter = symbolTable.find(locker, propertyName.publicName()); if (iter == symbolTable.end(locker)) return false; SymbolTableEntry::Fast entry = iter->value; ASSERT(!entry.isNull()); - slot.setValue(object, entry.getAttributes() | DontDelete, object->variableAt(entry.scopeOffset()).get()); + slot.setValue(object, entry.getAttributes() | DontDelete, object->registerAt(entry.getIndex()).get()); slotIsWriteable = !entry.isReadOnly(); return true; } @@ -133,13 +123,10 @@ inline bool symbolTablePut( ASSERT(!Heap::heap(value) || Heap::heap(value) == Heap::heap(object)); WriteBarrierBase<Unknown>* reg; - WatchpointSet* set; { SymbolTable& symbolTable = *object->symbolTable(); - // FIXME: This is very suspicious. We shouldn't need a GC-safe lock here. - // https://bugs.webkit.org/show_bug.cgi?id=134601 GCSafeConcurrentJITLocker locker(symbolTable.m_lock, exec->vm().heap); - SymbolTable::Map::iterator iter = symbolTable.find(locker, propertyName.uid()); + SymbolTable::Map::iterator iter = symbolTable.find(locker, propertyName.publicName()); if (iter == symbolTable.end(locker)) return false; bool wasFat; @@ -150,15 +137,14 @@ inline bool symbolTablePut( throwTypeError(exec, StrictModeReadonlyPropertyWriteError); return true; } - set = iter->value.watchpointSet(); - reg = &object->variableAt(fastEntry.scopeOffset()); + if (VariableWatchpointSet* set = iter->value.watchpointSet()) + set->notifyWrite(value); + reg = &object->registerAt(fastEntry.getIndex()); } // I'd prefer we not hold lock while executing barriers, since I prefer to reserve // the right for barriers to be able to trigger GC. And I don't want to hold VM // locks while GC'ing. reg->set(vm, object, value); - if (set) - VariableWriteFireDetail::touch(set, object, propertyName); return true; } @@ -170,22 +156,20 @@ inline bool symbolTablePutWithAttributes( ASSERT(!Heap::heap(value) || Heap::heap(value) == Heap::heap(object)); WriteBarrierBase<Unknown>* reg; - WatchpointSet* set; { SymbolTable& symbolTable = *object->symbolTable(); ConcurrentJITLocker locker(symbolTable.m_lock); - SymbolTable::Map::iterator iter = symbolTable.find(locker, propertyName.uid()); + SymbolTable::Map::iterator iter = symbolTable.find(locker, propertyName.publicName()); if (iter == symbolTable.end(locker)) return false; SymbolTableEntry& entry = iter->value; ASSERT(!entry.isNull()); - set = entry.watchpointSet(); + if (VariableWatchpointSet* set = entry.watchpointSet()) + set->notifyWrite(value); entry.setAttributes(attributes); - reg = &object->variableAt(entry.scopeOffset()); + reg = &object->registerAt(entry.getIndex()); } reg->set(vm, object, value); - if (set) - VariableWriteFireDetail::touch(set, object, propertyName); return true; } |
