summaryrefslogtreecommitdiff
path: root/Source/JavaScriptCore/runtime/JSSymbolTableObject.h
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@lorry>2015-05-20 09:56:07 +0000
committerLorry Tar Creator <lorry-tar-importer@lorry>2015-05-20 09:56:07 +0000
commit41386e9cb918eed93b3f13648cbef387e371e451 (patch)
treea97f9d7bd1d9d091833286085f72da9d83fd0606 /Source/JavaScriptCore/runtime/JSSymbolTableObject.h
parente15dd966d523731101f70ccf768bba12435a0208 (diff)
downloadWebKitGtk-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.h70
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;
}