JSC::JSObject* ClassObjectDelegate::construct(JSC::ExecState *exec, JSC::JSObject *callee, const JSC::ArgList &args) { Q_ASSERT(callee->inherits(&QScriptObject::info)); QScriptObject *obj = static_cast(callee); QScriptObjectDelegate *delegate = obj->delegate(); QScriptClass *scriptClass = static_cast(delegate)->scriptClass(); QScriptEnginePrivate *eng_p = scriptEngineFromExec(exec); // ============================================================= // Change #1 begins here. This line is commented out in 4.6.1 source code // ============================================================= JSC::ExecState *oldFrame = eng_p->currentFrame; // ============================================================= // End change 1 // ============================================================= eng_p->pushContext(exec, JSC::JSValue(), args, callee, true); QScriptContext *ctx = eng_p->contextForFrame(eng_p->currentFrame); QScriptValue defaultObject = ctx->thisObject(); QScriptValue result = qvariant_cast(scriptClass->extension(QScriptClass::Callable, qVariantFromValue(ctx))); // ============================================================= // Begin change 2: pop context and restore the frame pointer. // ============================================================= eng_p->popContext(); eng_p->currentFrame = oldFrame; // ============================================================= // End change 2 // ============================================================= if (!result.isObject()) result = defaultObject; return JSC::asObject(eng_p->scriptValueToJSCValue(result)); }