Ignore:
Timestamp:
May 5, 2011, 5:36:53 AM (14 years ago)
Author:
Dmitry A. Kuminov
Message:

trunk: Merged in qt 4.7.2 sources from branches/vendor/nokia/qt.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk

  • trunk/src/script/api/qscriptcontext.cpp

    r651 r846  
    11/****************************************************************************
    22**
    3 ** Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies).
     3** Copyright (C) 2011 Nokia Corporation and/or its subsidiary(-ies).
    44** All rights reserved.
    55** Contact: Nokia Corporation (qt-info@nokia.com)
     
    162162{
    163163    JSC::CallFrame *frame = QScriptEnginePrivate::frameForContext(this);
     164    QScript::APIShim shim(QScript::scriptEngineFromExec(frame));
    164165    JSC::JSValue jscValue = QScript::scriptEngineFromExec(frame)->scriptValueToJSCValue(value);
    165166    frame->setException(jscValue);
     
    184185{
    185186    JSC::CallFrame *frame = QScriptEnginePrivate::frameForContext(this);
     187    QScript::APIShim shim(QScript::scriptEngineFromExec(frame));
    186188    JSC::ErrorType jscError = JSC::GeneralError;
    187189    switch (error) {
     
    219221{
    220222    JSC::CallFrame *frame = QScriptEnginePrivate::frameForContext(this);
     223    QScript::APIShim shim(QScript::scriptEngineFromExec(frame));
    221224    JSC::JSObject *result = JSC::throwError(frame, JSC::GeneralError, text);
    222225    return QScript::scriptEngineFromExec(frame)->scriptValueFromJSCValue(result);
     
    266269{
    267270    const JSC::CallFrame *frame = QScriptEnginePrivate::frameForContext(this);
     271    QScript::APIShim shim(QScript::scriptEngineFromExec(frame));
    268272    return QScript::scriptEngineFromExec(frame)->scriptValueFromJSCValue(frame->callee());
    269273}
     
    287291{
    288292    JSC::CallFrame *frame = const_cast<JSC::ExecState*>(QScriptEnginePrivate::frameForContext(this));
     293    QScript::APIShim shim(QScript::scriptEngineFromExec(frame));
    289294
    290295    if (frame == frame->lexicalGlobalObject()->globalExec()) {
     
    295300    //for a js function
    296301    if (frame->codeBlock() && frame->callee()) {
     302        if (!QScriptEnginePrivate::hasValidCodeBlockRegister(frame)) {
     303            // We have a built-in JS host call.
     304            // codeBlock is needed by retrieveArguments(), but since it
     305            // contains junk, we would crash. Return an invalid value for now.
     306            return QScriptValue();
     307        }
    297308        JSC::JSValue result = frame->interpreter()->retrieveArguments(frame, JSC::asFunction(frame->callee()));
    298309        return QScript::scriptEngineFromExec(frame)->scriptValueFromJSCValue(result);
     
    305316
    306317    //for a native function
    307     if (!frame->optionalCalleeArguments()) {
     318    if (!frame->optionalCalleeArguments()
     319        && QScriptEnginePrivate::hasValidCodeBlockRegister(frame)) { // Make sure we don't go here for host JSFunctions
    308320        Q_ASSERT(frame->argumentCount() > 0); //we need at least 'this' otherwise we'll crash later
    309321        JSC::Arguments* arguments = new (&frame->globalData())JSC::Arguments(frame, JSC::Arguments::NoParameters);
     
    319331  When a function is called as constructor, the thisObject()
    320332  contains the newly constructed object to be initialized.
     333
     334  \note This function is only guaranteed to work for a context
     335  corresponding to native functions.
    321336*/
    322337bool QScriptContext::isCalledAsConstructor() const
    323338{
    324339    JSC::CallFrame *frame = const_cast<JSC::ExecState*>(QScriptEnginePrivate::frameForContext(this));
     340    QScript::APIShim shim(QScript::scriptEngineFromExec(frame));
    325341
    326342    //For native functions, look up flags.
     
    356372{
    357373    const JSC::CallFrame *frame = QScriptEnginePrivate::frameForContext(this);
     374    QScript::APIShim shim(QScript::scriptEngineFromExec(frame));
    358375    JSC::CallFrame *callerFrame = frame->callerFrame()->removeHostCallFrameFlag();
    359376    return QScriptEnginePrivate::contextForFrame(callerFrame);
     
    407424  context.
    408425
     426  \note The activation object might not be available if there is no
     427  active QScriptEngineAgent, as it might be optimized.
     428
    409429  \sa argument(), argumentsObject()
    410430*/
     
    413433{
    414434    JSC::CallFrame *frame = const_cast<JSC::ExecState*>(QScriptEnginePrivate::frameForContext(this));
     435    QScript::APIShim shim(QScript::scriptEngineFromExec(frame));
    415436    JSC::JSObject *result = 0;
    416437
     
    465486
    466487  If \a activation is not an object, this function does nothing.
     488
     489  \note For a context corresponding to a JavaScript function, this is only
     490  guaranteed to work if there was an QScriptEngineAgent active on the
     491  engine while the function was evaluated.
    467492*/
    468493void QScriptContext::setActivationObject(const QScriptValue &activation)
     
    478503    JSC::CallFrame *frame = QScriptEnginePrivate::frameForContext(this);
    479504    QScriptEnginePrivate *engine = QScript::scriptEngineFromExec(frame);
     505    QScript::APIShim shim(engine);
    480506    JSC::JSObject *object = JSC::asObject(engine->scriptValueToJSCValue(activation));
    481507    if (object == engine->originalGlobalObjectProxy)
     
    522548    JSC::CallFrame *frame = const_cast<JSC::ExecState*>(QScriptEnginePrivate::frameForContext(this));
    523549    QScriptEnginePrivate *engine = QScript::scriptEngineFromExec(frame);
     550    QScript::APIShim shim(engine);
    524551    JSC::JSValue result = engine->thisForContext(frame);
    525552    if (!result || result.isNull())
     
    537564{
    538565    JSC::CallFrame *frame = QScriptEnginePrivate::frameForContext(this);
     566    QScript::APIShim shim(QScript::scriptEngineFromExec(frame));
    539567    if (!thisObject.isObject())
    540568        return;
     
    663691    const JSC::CallFrame *frame = QScriptEnginePrivate::frameForContext(this);
    664692    QScriptEnginePrivate *engine = QScript::scriptEngineFromExec(frame);
     693    QScript::APIShim shim(engine);
    665694    QScriptValueList result;
    666695    JSC::ScopeChainNode *node = frame->scopeChain();
     
    701730    JSC::CallFrame *frame = QScriptEnginePrivate::frameForContext(this);
    702731    QScriptEnginePrivate *engine = QScript::scriptEngineFromExec(frame);
     732    QScript::APIShim shim(engine);
    703733    JSC::JSObject *jscObject = JSC::asObject(engine->scriptValueToJSCValue(object));
    704734    if (jscObject == engine->originalGlobalObjectProxy)
     
    730760QScriptValue QScriptContext::popScope()
    731761{
     762    activationObject(); //ensure the creation of the normal scope for native context
    732763    JSC::CallFrame *frame = QScriptEnginePrivate::frameForContext(this);
    733764    JSC::ScopeChainNode *scope = frame->scopeChain();
    734765    Q_ASSERT(scope != 0);
    735766    QScriptEnginePrivate *engine = QScript::scriptEngineFromExec(frame);
     767    QScript::APIShim shim(engine);
    736768    QScriptValue result = engine->scriptValueFromJSCValue(scope->object);
    737769    if (!scope->next) {
Note: See TracChangeset for help on using the changeset viewer.