, hasInstance(definition->hasInstance)
, convertToType(definition->convertToType)
, m_className(tryCreateStringFromUTF8(definition->className))
- , m_staticValues(0)
- , m_staticFunctions(0)
{
initializeThreading();
if (const JSStaticValue* staticValue = definition->staticValues) {
- m_staticValues = new OpaqueJSClassStaticValuesTable();
+ m_staticValues = adoptPtr(new OpaqueJSClassStaticValuesTable);
while (staticValue->name) {
UString valueName = tryCreateStringFromUTF8(staticValue->name);
- if (!valueName.isNull()) {
- // Use a local variable here to sidestep an RVCT compiler bug.
- StaticValueEntry* entry = new StaticValueEntry(staticValue->getProperty, staticValue->setProperty, staticValue->attributes);
- StringImpl* impl = valueName.impl();
- StaticValueEntry* existingEntry = m_staticValues->get(impl);
- m_staticValues->set(impl, entry);
- delete existingEntry;
- }
+ if (!valueName.isNull())
+ m_staticValues->set(valueName.impl(), adoptPtr(new StaticValueEntry(staticValue->getProperty, staticValue->setProperty, staticValue->attributes)));
++staticValue;
}
}
if (const JSStaticFunction* staticFunction = definition->staticFunctions) {
- m_staticFunctions = new OpaqueJSClassStaticFunctionsTable();
+ m_staticFunctions = adoptPtr(new OpaqueJSClassStaticFunctionsTable);
while (staticFunction->name) {
UString functionName = tryCreateStringFromUTF8(staticFunction->name);
- if (!functionName.isNull()) {
- // Use a local variable here to sidestep an RVCT compiler bug.
- StaticFunctionEntry* entry = new StaticFunctionEntry(staticFunction->callAsFunction, staticFunction->attributes);
- StringImpl* impl = functionName.impl();
- StaticFunctionEntry* existingEntry = m_staticFunctions->get(impl);
- m_staticFunctions->set(impl, entry);
- delete existingEntry;
- }
+ if (!functionName.isNull())
+ m_staticFunctions->set(functionName.impl(), adoptPtr(new StaticFunctionEntry(staticFunction->callAsFunction, staticFunction->attributes)));
++staticFunction;
}
}
// The empty string is shared across threads & is an identifier, in all other cases we should have done a deep copy in className(), below.
ASSERT(!m_className.length() || !m_className.impl()->isIdentifier());
+#ifndef NDEBUG
if (m_staticValues) {
OpaqueJSClassStaticValuesTable::const_iterator end = m_staticValues->end();
- for (OpaqueJSClassStaticValuesTable::const_iterator it = m_staticValues->begin(); it != end; ++it) {
+ for (OpaqueJSClassStaticValuesTable::const_iterator it = m_staticValues->begin(); it != end; ++it)
ASSERT(!it->first->isIdentifier());
- delete it->second;
- }
- delete m_staticValues;
}
if (m_staticFunctions) {
OpaqueJSClassStaticFunctionsTable::const_iterator end = m_staticFunctions->end();
- for (OpaqueJSClassStaticFunctionsTable::const_iterator it = m_staticFunctions->begin(); it != end; ++it) {
+ for (OpaqueJSClassStaticFunctionsTable::const_iterator it = m_staticFunctions->begin(); it != end; ++it)
ASSERT(!it->first->isIdentifier());
- delete it->second;
- }
- delete m_staticFunctions;
}
+#endif
if (prototypeClass)
JSClassRelease(prototypeClass);
: m_class(jsClass)
{
if (jsClass->m_staticValues) {
- staticValues = new OpaqueJSClassStaticValuesTable;
+ staticValues = adoptPtr(new OpaqueJSClassStaticValuesTable);
OpaqueJSClassStaticValuesTable::const_iterator end = jsClass->m_staticValues->end();
for (OpaqueJSClassStaticValuesTable::const_iterator it = jsClass->m_staticValues->begin(); it != end; ++it) {
ASSERT(!it->first->isIdentifier());
- // Use a local variable here to sidestep an RVCT compiler bug.
- StaticValueEntry* entry = new StaticValueEntry(it->second->getProperty, it->second->setProperty, it->second->attributes);
- staticValues->add(StringImpl::create(it->first->characters(), it->first->length()), entry);
+ staticValues->add(StringImpl::create(it->first->characters(), it->first->length()), adoptPtr(new StaticValueEntry(it->second->getProperty, it->second->setProperty, it->second->attributes)));
}
- } else
- staticValues = 0;
+ }
if (jsClass->m_staticFunctions) {
- staticFunctions = new OpaqueJSClassStaticFunctionsTable;
+ staticFunctions = adoptPtr(new OpaqueJSClassStaticFunctionsTable);
OpaqueJSClassStaticFunctionsTable::const_iterator end = jsClass->m_staticFunctions->end();
for (OpaqueJSClassStaticFunctionsTable::const_iterator it = jsClass->m_staticFunctions->begin(); it != end; ++it) {
ASSERT(!it->first->isIdentifier());
- // Use a local variable here to sidestep an RVCT compiler bug.
- StaticFunctionEntry* entry = new StaticFunctionEntry(it->second->callAsFunction, it->second->attributes);
- staticFunctions->add(StringImpl::create(it->first->characters(), it->first->length()), entry);
+ staticFunctions->add(StringImpl::create(it->first->characters(), it->first->length()), adoptPtr(new StaticFunctionEntry(it->second->callAsFunction, it->second->attributes)));
}
-
- } else
- staticFunctions = 0;
-}
-
-OpaqueJSClassContextData::~OpaqueJSClassContextData()
-{
- if (staticValues) {
- deleteAllValues(*staticValues);
- delete staticValues;
- }
-
- if (staticFunctions) {
- deleteAllValues(*staticFunctions);
- delete staticFunctions;
}
}
OpaqueJSClassContextData& OpaqueJSClass::contextData(ExecState* exec)
{
- OpaqueJSClassContextData*& contextData = exec->globalData().opaqueJSClassData.add(this, 0).first->second;
+ OwnPtr<OpaqueJSClassContextData>& contextData = exec->globalData().opaqueJSClassData.add(this, nullptr).iterator->second;
if (!contextData)
- contextData = new OpaqueJSClassContextData(exec->globalData(), this);
+ contextData = adoptPtr(new OpaqueJSClassContextData(exec->globalData(), this));
return *contextData;
}
OpaqueJSClassStaticValuesTable* OpaqueJSClass::staticValues(JSC::ExecState* exec)
{
- OpaqueJSClassContextData& jsClassData = contextData(exec);
- return jsClassData.staticValues;
+ return contextData(exec).staticValues.get();
}
OpaqueJSClassStaticFunctionsTable* OpaqueJSClass::staticFunctions(JSC::ExecState* exec)
{
- OpaqueJSClassContextData& jsClassData = contextData(exec);
- return jsClassData.staticFunctions;
+ return contextData(exec).staticFunctions.get();
}
/*!
* | | |
* DerivedClass | DerivedClassPrototype
*/
-
+
if (!prototypeClass)
return 0;
if (!jsClassData.cachedPrototype) {
// Recursive, but should be good enough for our purposes
- jsClassData.cachedPrototype.set(exec->globalData(), new (exec) JSCallbackObject<JSObjectWithGlobalObject>(exec, exec->lexicalGlobalObject(), exec->lexicalGlobalObject()->callbackObjectStructure(), prototypeClass, &jsClassData), 0); // set jsClassData as the object's private data, so it can clear our reference on destruction
+ jsClassData.cachedPrototype = PassWeak<JSObject>(JSCallbackObject<JSNonFinalObject>::create(exec, exec->lexicalGlobalObject(), exec->lexicalGlobalObject()->callbackObjectStructure(), prototypeClass, &jsClassData), 0); // set jsClassData as the object's private data, so it can clear our reference on destruction
if (parentClass) {
if (JSObject* prototype = parentClass->prototype(exec))
jsClassData.cachedPrototype->setPrototype(exec->globalData(), prototype);