Ignore:
Timestamp:
Nov 18, 2007, 1:09:27 AM (18 years ago)
Author:
[email protected]
Message:

Fix: <rdar://problem/5607032> (REGRESSION: testapi exits with assertion failure in debug build) and <rdar://problem/5440659> (JSGlobalContextCreate throws away globalObjectClass's prototype)

Split Interpreter's initialization into two distinct steps: the creation of the global prototypes
and constructors, and storing them on the global object. This allows JSClassRef's passed to
JSGlobalContextCreate to be instantiated with the correct prototype.

Reviewed by Darin Adler.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/JavaScriptCore/kjs/interpreter.cpp

    r27842 r27885  
    8282}
    8383
    84 Interpreter::Interpreter(JSGlobalObject* globalObject)
    85     : m_currentExec(0)
    86     , m_globalObject(globalObject)
    87     , m_globalExec(this, globalObject, globalObject, 0)
    88 {
    89     init();
    90 }
    91 
    9284Interpreter::Interpreter()
    9385    : m_currentExec(0)
    94     , m_globalObject(new JSGlobalObject())
    95     , m_globalExec(this, m_globalObject, m_globalObject, 0)
     86    , m_globalObject(0)
     87    , m_globalExec(this, 0, 0, 0)
    9688{
    9789    init();
     
    121113    }
    122114
    123     initGlobalObject();
     115    createObjectsForGlobalObjectProperties();
    124116}
    125117
     
    142134JSGlobalObject* Interpreter::globalObject() const
    143135{
     136    // Now that we delay setting of the global object, people retrieving it before it is set may be in for a nasty surprise
     137    ASSERT(m_globalObject);
    144138    return m_globalObject;
    145139}
    146140
    147 void Interpreter::initGlobalObject()
    148 {
    149     m_globalObject->setInterpreter(this);
    150 
     141void Interpreter::setGlobalObject(JSGlobalObject* globalObject)
     142{
     143    ASSERT(!m_globalObject);
     144    ASSERT(globalObject);
     145    m_globalObject = globalObject;
     146    m_globalExec.setGlobalObject(globalObject);
     147
     148    setGlobalObjectProperties();
     149}
     150
     151void Interpreter::resetGlobalObjectProperties()
     152{
     153    ASSERT(m_globalObject);
     154    createObjectsForGlobalObjectProperties();
     155    setGlobalObjectProperties();
     156}
     157
     158void Interpreter::createObjectsForGlobalObjectProperties()
     159{
    151160    // Clear before inititalizing, to avoid marking uninitialized (dangerous) or
    152161    // stale (wasteful) pointers during initialization.
     
    243252    m_TypeErrorPrototype->put(&m_globalExec, m_globalExec.propertyNames().constructor, m_TypeError, DontEnum | DontDelete | ReadOnly);
    244253    m_UriErrorPrototype->put(&m_globalExec, m_globalExec.propertyNames().constructor, m_UriError, DontEnum | DontDelete | ReadOnly);
     254}
     255
     256void Interpreter::setGlobalObjectProperties()
     257{
     258    ASSERT(m_globalObject);
     259    m_globalObject->setInterpreter(this);
    245260
    246261    // Set global object prototype
     
    253268    // FIXME: kjs_window.cpp checks Internal/DontEnum as a performance hack, to
    254269    // see that these values can be put directly without a check for override
    255     // properties. Maybe we should call putDirect instead, for better encapsulation.
    256     m_globalObject->put(&m_globalExec, "Object", m_Object, DontEnum);
    257     m_globalObject->put(&m_globalExec, "Function", m_Function, DontEnum);
    258     m_globalObject->put(&m_globalExec, "Array", m_Array, DontEnum);
    259     m_globalObject->put(&m_globalExec, "Boolean", m_Boolean, DontEnum);
    260     m_globalObject->put(&m_globalExec, "String", m_String, DontEnum);
    261     m_globalObject->put(&m_globalExec, "Number", m_Number, DontEnum);
    262     m_globalObject->put(&m_globalExec, "Date", m_Date, DontEnum);
    263     m_globalObject->put(&m_globalExec, "RegExp", m_RegExp, DontEnum);
    264     m_globalObject->put(&m_globalExec, "Error", m_Error, DontEnum);
    265     m_globalObject->put(&m_globalExec, "EvalError",m_EvalError, Internal);
    266     m_globalObject->put(&m_globalExec, "RangeError",m_RangeError, Internal);
    267     m_globalObject->put(&m_globalExec, "ReferenceError",m_ReferenceError, Internal);
    268     m_globalObject->put(&m_globalExec, "SyntaxError",m_SyntaxError, Internal);
    269     m_globalObject->put(&m_globalExec, "TypeError",m_TypeError, Internal);
    270     m_globalObject->put(&m_globalExec, "URIError",m_UriError, Internal);
     270    // properties.
     271    // FIXME: These properties should be handled by JSGlobalObject
     272    m_globalObject->putDirect("Object", m_Object, DontEnum);
     273    m_globalObject->putDirect("Function", m_Function, DontEnum);
     274    m_globalObject->putDirect("Array", m_Array, DontEnum);
     275    m_globalObject->putDirect("Boolean", m_Boolean, DontEnum);
     276    m_globalObject->putDirect("String", m_String, DontEnum);
     277    m_globalObject->putDirect("Number", m_Number, DontEnum);
     278    m_globalObject->putDirect("Date", m_Date, DontEnum);
     279    m_globalObject->putDirect("RegExp", m_RegExp, DontEnum);
     280    m_globalObject->putDirect("Error", m_Error, DontEnum);
     281    m_globalObject->putDirect("EvalError",m_EvalError, Internal);
     282    m_globalObject->putDirect("RangeError",m_RangeError, Internal);
     283    m_globalObject->putDirect("ReferenceError",m_ReferenceError, Internal);
     284    m_globalObject->putDirect("SyntaxError",m_SyntaxError, Internal);
     285    m_globalObject->putDirect("TypeError",m_TypeError, Internal);
     286    m_globalObject->putDirect("URIError",m_UriError, Internal);
    271287
    272288    // Set global values
    273     m_globalObject->put(&m_globalExec, "Math", new MathObjectImp(&m_globalExec, m_ObjectPrototype), DontEnum);
    274     m_globalObject->put(&m_globalExec, "NaN", jsNaN(), DontEnum|DontDelete);
    275     m_globalObject->put(&m_globalExec, "Infinity", jsNumber(Inf), DontEnum|DontDelete);
    276     m_globalObject->put(&m_globalExec, "undefined", jsUndefined(), DontEnum|DontDelete);
     289    m_globalObject->putDirect("Math", new MathObjectImp(&m_globalExec, m_ObjectPrototype), DontEnum);
     290    m_globalObject->putDirect("NaN", jsNaN(), DontEnum|DontDelete);
     291    m_globalObject->putDirect("Infinity", jsNumber(Inf), DontEnum|DontDelete);
     292    m_globalObject->putDirect("undefined", jsUndefined(), DontEnum|DontDelete);
    277293   
    278294    // Set global functions
Note: See TracChangeset for help on using the changeset viewer.