src/script/api/qscriptcontext.cpp
changeset 30 5dc02b23752f
parent 18 2f34d5167611
child 33 3e2da88830cd
equal deleted inserted replaced
29:b72c6db6890b 30:5dc02b23752f
   159   \sa throwError(), state()
   159   \sa throwError(), state()
   160 */
   160 */
   161 QScriptValue QScriptContext::throwValue(const QScriptValue &value)
   161 QScriptValue QScriptContext::throwValue(const QScriptValue &value)
   162 {
   162 {
   163     JSC::CallFrame *frame = QScriptEnginePrivate::frameForContext(this);
   163     JSC::CallFrame *frame = QScriptEnginePrivate::frameForContext(this);
       
   164     QScript::APIShim shim(QScript::scriptEngineFromExec(frame));
   164     JSC::JSValue jscValue = QScript::scriptEngineFromExec(frame)->scriptValueToJSCValue(value);
   165     JSC::JSValue jscValue = QScript::scriptEngineFromExec(frame)->scriptValueToJSCValue(value);
   165     frame->setException(jscValue);
   166     frame->setException(jscValue);
   166     return value;
   167     return value;
   167 }
   168 }
   168 
   169 
   181   \sa throwValue(), state()
   182   \sa throwValue(), state()
   182 */
   183 */
   183 QScriptValue QScriptContext::throwError(Error error, const QString &text)
   184 QScriptValue QScriptContext::throwError(Error error, const QString &text)
   184 {
   185 {
   185     JSC::CallFrame *frame = QScriptEnginePrivate::frameForContext(this);
   186     JSC::CallFrame *frame = QScriptEnginePrivate::frameForContext(this);
       
   187     QScript::APIShim shim(QScript::scriptEngineFromExec(frame));
   186     JSC::ErrorType jscError = JSC::GeneralError;
   188     JSC::ErrorType jscError = JSC::GeneralError;
   187     switch (error) {
   189     switch (error) {
   188     case UnknownError:
   190     case UnknownError:
   189         break;
   191         break;
   190     case ReferenceError:
   192     case ReferenceError:
   216   \sa throwValue(), state()
   218   \sa throwValue(), state()
   217 */
   219 */
   218 QScriptValue QScriptContext::throwError(const QString &text)
   220 QScriptValue QScriptContext::throwError(const QString &text)
   219 {
   221 {
   220     JSC::CallFrame *frame = QScriptEnginePrivate::frameForContext(this);
   222     JSC::CallFrame *frame = QScriptEnginePrivate::frameForContext(this);
       
   223     QScript::APIShim shim(QScript::scriptEngineFromExec(frame));
   221     JSC::JSObject *result = JSC::throwError(frame, JSC::GeneralError, text);
   224     JSC::JSObject *result = JSC::throwError(frame, JSC::GeneralError, text);
   222     return QScript::scriptEngineFromExec(frame)->scriptValueFromJSCValue(result);
   225     return QScript::scriptEngineFromExec(frame)->scriptValueFromJSCValue(result);
   223 }
   226 }
   224 
   227 
   225 /*!
   228 /*!
   263   QScriptContext represents an invocation of.
   266   QScriptContext represents an invocation of.
   264 */
   267 */
   265 QScriptValue QScriptContext::callee() const
   268 QScriptValue QScriptContext::callee() const
   266 {
   269 {
   267     const JSC::CallFrame *frame = QScriptEnginePrivate::frameForContext(this);
   270     const JSC::CallFrame *frame = QScriptEnginePrivate::frameForContext(this);
       
   271     QScript::APIShim shim(QScript::scriptEngineFromExec(frame));
   268     return QScript::scriptEngineFromExec(frame)->scriptValueFromJSCValue(frame->callee());
   272     return QScript::scriptEngineFromExec(frame)->scriptValueFromJSCValue(frame->callee());
   269 }
   273 }
   270 
   274 
   271 /*!
   275 /*!
   272   Returns the arguments object of this QScriptContext.
   276   Returns the arguments object of this QScriptContext.
   284   \sa argument(), activationObject()
   288   \sa argument(), activationObject()
   285 */
   289 */
   286 QScriptValue QScriptContext::argumentsObject() const
   290 QScriptValue QScriptContext::argumentsObject() const
   287 {
   291 {
   288     JSC::CallFrame *frame = const_cast<JSC::ExecState*>(QScriptEnginePrivate::frameForContext(this));
   292     JSC::CallFrame *frame = const_cast<JSC::ExecState*>(QScriptEnginePrivate::frameForContext(this));
       
   293     QScript::APIShim shim(QScript::scriptEngineFromExec(frame));
   289 
   294 
   290     if (frame == frame->lexicalGlobalObject()->globalExec()) {
   295     if (frame == frame->lexicalGlobalObject()->globalExec()) {
   291         // <global> context doesn't have arguments. return an empty object
   296         // <global> context doesn't have arguments. return an empty object
   292         return QScriptEnginePrivate::get(QScript::scriptEngineFromExec(frame))->newObject();
   297         return QScriptEnginePrivate::get(QScript::scriptEngineFromExec(frame))->newObject();
   293     }
   298     }
   320   contains the newly constructed object to be initialized.
   325   contains the newly constructed object to be initialized.
   321 */
   326 */
   322 bool QScriptContext::isCalledAsConstructor() const
   327 bool QScriptContext::isCalledAsConstructor() const
   323 {
   328 {
   324     JSC::CallFrame *frame = const_cast<JSC::ExecState*>(QScriptEnginePrivate::frameForContext(this));
   329     JSC::CallFrame *frame = const_cast<JSC::ExecState*>(QScriptEnginePrivate::frameForContext(this));
       
   330     QScript::APIShim shim(QScript::scriptEngineFromExec(frame));
   325 
   331 
   326     //For native functions, look up flags.
   332     //For native functions, look up flags.
   327     uint flags = QScriptEnginePrivate::contextFlags(frame);
   333     uint flags = QScriptEnginePrivate::contextFlags(frame);
   328     if (flags & QScriptEnginePrivate::NativeContext)
   334     if (flags & QScriptEnginePrivate::NativeContext)
   329         return flags & QScriptEnginePrivate::CalledAsConstructorContext;
   335         return flags & QScriptEnginePrivate::CalledAsConstructorContext;
   353   Returns the parent context of this QScriptContext.
   359   Returns the parent context of this QScriptContext.
   354 */
   360 */
   355 QScriptContext *QScriptContext::parentContext() const
   361 QScriptContext *QScriptContext::parentContext() const
   356 {
   362 {
   357     const JSC::CallFrame *frame = QScriptEnginePrivate::frameForContext(this);
   363     const JSC::CallFrame *frame = QScriptEnginePrivate::frameForContext(this);
       
   364     QScript::APIShim shim(QScript::scriptEngineFromExec(frame));
   358     JSC::CallFrame *callerFrame = frame->callerFrame()->removeHostCallFrameFlag();
   365     JSC::CallFrame *callerFrame = frame->callerFrame()->removeHostCallFrameFlag();
   359     return QScriptEnginePrivate::contextForFrame(callerFrame);
   366     return QScriptEnginePrivate::contextForFrame(callerFrame);
   360 }
   367 }
   361 
   368 
   362 /*!
   369 /*!
   410 */
   417 */
   411 
   418 
   412 QScriptValue QScriptContext::activationObject() const
   419 QScriptValue QScriptContext::activationObject() const
   413 {
   420 {
   414     JSC::CallFrame *frame = const_cast<JSC::ExecState*>(QScriptEnginePrivate::frameForContext(this));
   421     JSC::CallFrame *frame = const_cast<JSC::ExecState*>(QScriptEnginePrivate::frameForContext(this));
       
   422     QScript::APIShim shim(QScript::scriptEngineFromExec(frame));
   415     JSC::JSObject *result = 0;
   423     JSC::JSObject *result = 0;
   416 
   424 
   417     uint flags = QScriptEnginePrivate::contextFlags(frame);
   425     uint flags = QScriptEnginePrivate::contextFlags(frame);
   418     if ((flags & QScriptEnginePrivate::NativeContext) && !(flags & QScriptEnginePrivate::HasScopeContext)) {
   426     if ((flags & QScriptEnginePrivate::NativeContext) && !(flags & QScriptEnginePrivate::HasScopeContext)) {
   419         //For native functions, lazily create it if needed
   427         //For native functions, lazily create it if needed
   475                  "a different engine");
   483                  "a different engine");
   476         return;
   484         return;
   477     }
   485     }
   478     JSC::CallFrame *frame = QScriptEnginePrivate::frameForContext(this);
   486     JSC::CallFrame *frame = QScriptEnginePrivate::frameForContext(this);
   479     QScriptEnginePrivate *engine = QScript::scriptEngineFromExec(frame);
   487     QScriptEnginePrivate *engine = QScript::scriptEngineFromExec(frame);
       
   488     QScript::APIShim shim(engine);
   480     JSC::JSObject *object = JSC::asObject(engine->scriptValueToJSCValue(activation));
   489     JSC::JSObject *object = JSC::asObject(engine->scriptValueToJSCValue(activation));
   481     if (object == engine->originalGlobalObjectProxy)
   490     if (object == engine->originalGlobalObjectProxy)
   482         object = engine->originalGlobalObject();
   491         object = engine->originalGlobalObject();
   483 
   492 
   484     uint flags = QScriptEnginePrivate::contextFlags(frame);
   493     uint flags = QScriptEnginePrivate::contextFlags(frame);
   519 */
   528 */
   520 QScriptValue QScriptContext::thisObject() const
   529 QScriptValue QScriptContext::thisObject() const
   521 {
   530 {
   522     JSC::CallFrame *frame = const_cast<JSC::ExecState*>(QScriptEnginePrivate::frameForContext(this));
   531     JSC::CallFrame *frame = const_cast<JSC::ExecState*>(QScriptEnginePrivate::frameForContext(this));
   523     QScriptEnginePrivate *engine = QScript::scriptEngineFromExec(frame);
   532     QScriptEnginePrivate *engine = QScript::scriptEngineFromExec(frame);
       
   533     QScript::APIShim shim(engine);
   524     JSC::JSValue result = engine->thisForContext(frame);
   534     JSC::JSValue result = engine->thisForContext(frame);
   525     if (!result || result.isNull())
   535     if (!result || result.isNull())
   526         result = frame->globalThisValue();
   536         result = frame->globalThisValue();
   527     return engine->scriptValueFromJSCValue(result);
   537     return engine->scriptValueFromJSCValue(result);
   528 }
   538 }
   534   If \a thisObject is not an object, this function does nothing.
   544   If \a thisObject is not an object, this function does nothing.
   535 */
   545 */
   536 void QScriptContext::setThisObject(const QScriptValue &thisObject)
   546 void QScriptContext::setThisObject(const QScriptValue &thisObject)
   537 {
   547 {
   538     JSC::CallFrame *frame = QScriptEnginePrivate::frameForContext(this);
   548     JSC::CallFrame *frame = QScriptEnginePrivate::frameForContext(this);
       
   549     QScript::APIShim shim(QScript::scriptEngineFromExec(frame));
   539     if (!thisObject.isObject())
   550     if (!thisObject.isObject())
   540         return;
   551         return;
   541     if (thisObject.engine() != engine()) {
   552     if (thisObject.engine() != engine()) {
   542         qWarning("QScriptContext::setThisObject() failed: "
   553         qWarning("QScriptContext::setThisObject() failed: "
   543                  "cannot set an object created in "
   554                  "cannot set an object created in "
   660 QScriptValueList QScriptContext::scopeChain() const
   671 QScriptValueList QScriptContext::scopeChain() const
   661 {
   672 {
   662     activationObject(); //ensure the creation of the normal scope for native context
   673     activationObject(); //ensure the creation of the normal scope for native context
   663     const JSC::CallFrame *frame = QScriptEnginePrivate::frameForContext(this);
   674     const JSC::CallFrame *frame = QScriptEnginePrivate::frameForContext(this);
   664     QScriptEnginePrivate *engine = QScript::scriptEngineFromExec(frame);
   675     QScriptEnginePrivate *engine = QScript::scriptEngineFromExec(frame);
       
   676     QScript::APIShim shim(engine);
   665     QScriptValueList result;
   677     QScriptValueList result;
   666     JSC::ScopeChainNode *node = frame->scopeChain();
   678     JSC::ScopeChainNode *node = frame->scopeChain();
   667     JSC::ScopeChainIterator it(node);
   679     JSC::ScopeChainIterator it(node);
   668     for (it = node->begin(); it != node->end(); ++it) {
   680     for (it = node->begin(); it != node->end(); ++it) {
   669         JSC::JSObject *object = *it;
   681         JSC::JSObject *object = *it;
   698                  "a different engine");
   710                  "a different engine");
   699         return;
   711         return;
   700     }
   712     }
   701     JSC::CallFrame *frame = QScriptEnginePrivate::frameForContext(this);
   713     JSC::CallFrame *frame = QScriptEnginePrivate::frameForContext(this);
   702     QScriptEnginePrivate *engine = QScript::scriptEngineFromExec(frame);
   714     QScriptEnginePrivate *engine = QScript::scriptEngineFromExec(frame);
       
   715     QScript::APIShim shim(engine);
   703     JSC::JSObject *jscObject = JSC::asObject(engine->scriptValueToJSCValue(object));
   716     JSC::JSObject *jscObject = JSC::asObject(engine->scriptValueToJSCValue(object));
   704     if (jscObject == engine->originalGlobalObjectProxy)
   717     if (jscObject == engine->originalGlobalObjectProxy)
   705         jscObject = engine->originalGlobalObject();
   718         jscObject = engine->originalGlobalObject();
   706     JSC::ScopeChainNode *scope = frame->scopeChain();
   719     JSC::ScopeChainNode *scope = frame->scopeChain();
   707     Q_ASSERT(scope != 0);
   720     Q_ASSERT(scope != 0);
   731 {
   744 {
   732     JSC::CallFrame *frame = QScriptEnginePrivate::frameForContext(this);
   745     JSC::CallFrame *frame = QScriptEnginePrivate::frameForContext(this);
   733     JSC::ScopeChainNode *scope = frame->scopeChain();
   746     JSC::ScopeChainNode *scope = frame->scopeChain();
   734     Q_ASSERT(scope != 0);
   747     Q_ASSERT(scope != 0);
   735     QScriptEnginePrivate *engine = QScript::scriptEngineFromExec(frame);
   748     QScriptEnginePrivate *engine = QScript::scriptEngineFromExec(frame);
       
   749     QScript::APIShim shim(engine);
   736     QScriptValue result = engine->scriptValueFromJSCValue(scope->object);
   750     QScriptValue result = engine->scriptValueFromJSCValue(scope->object);
   737     if (!scope->next) {
   751     if (!scope->next) {
   738         // We cannot have a null scope chain, so just zap the object pointer.
   752         // We cannot have a null scope chain, so just zap the object pointer.
   739         scope->object = 0;
   753         scope->object = 0;
   740     } else {
   754     } else {