Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- commit b4b92b67407cdb7c3a82123cd6dff31bad48d047
- Author: Caio Marcelo de Oliveira Filho <caio.oliveira@openbossa.org>
- Date: Tue Mar 1 09:40:48 2011 -0300
- QScriptContext: identify explicity the kinds of contexts
- There are five different kinds of QScriptContext(Private)
- implementations, for different purposes. This commit adds inline
- functions to identify them according the invariants that each one has,
- with the intetion of making things more readable.
- diff --git a/src/script/api/qscriptcontext.cpp b/src/script/api/qscriptcontext.cpp
- index 3f1cd4d..c98f447 100644
- --- a/src/script/api/qscriptcontext.cpp
- +++ b/src/script/api/qscriptcontext.cpp
- @@ -277,9 +277,9 @@ QScriptValue QScriptContext::argumentsObject() const
- */
- bool QScriptContext::isCalledAsConstructor() const
- {
- - if (d_ptr->arguments)
- + if (d_ptr->isNativeFunction())
- return d_ptr->arguments->IsConstructCall();
- - if (!d_ptr->frame.IsEmpty()) {
- + if (d_ptr->isJSFrame()) {
- QScriptIsolate api(d_ptr->engine);
- return d_ptr->frame->IsConstructor();
- }
- @@ -305,7 +305,7 @@ QScriptContext *QScriptContext::parentContext() const
- }
- if (d_ptr->previous)
- return d_ptr->previous;
- - if (!d_ptr->frame.IsEmpty())
- + if (d_ptr->isJSFrame())
- return 0; //skip all the native contexts. They are unfortunately hidden by V8, we reached the end of the stack already.
- return d_ptr->parent;
- }
- @@ -457,18 +457,16 @@ QString QScriptContext::toString() const
- QString functionName = info.functionName();
- if (functionName.isEmpty()) {
- - if (!d_ptr->parent || (!d_ptr->previous && !d_ptr->frame.IsEmpty())) {
- + if (d_ptr->isGlobalContext() || (!d_ptr->previous && d_ptr->isJSFrame())) {
- result.append(QLatin1String("<global>"));
- - } else {
- - if (d_ptr->frame.IsEmpty()) {
- + } else if (!d_ptr->isJSFrame()) {
- result.append(QLatin1String("<native>"));
- + } else {
- + QScriptIsolate api(d_ptr->engine);
- + if (d_ptr->frame->IsEval()) {
- + result.append(QLatin1String("<eval>"));
- } else {
- - QScriptIsolate api(d_ptr->engine);
- - if (d_ptr->frame->IsEval()) {
- - result.append(QLatin1String("<eval>"));
- - } else {
- - result.append(QLatin1String("<anonymous>"));
- - }
- + result.append(QLatin1String("<anonymous>"));
- }
- }
- } else {
- diff --git a/src/script/api/qscriptcontext_impl_p.h b/src/script/api/qscriptcontext_impl_p.h
- index 6e542d3..ff6bccc 100644
- --- a/src/script/api/qscriptcontext_impl_p.h
- +++ b/src/script/api/qscriptcontext_impl_p.h
- @@ -56,6 +56,7 @@ inline QScriptContextPrivate::QScriptContextPrivate(QScriptEnginePrivate *engine
- m_callee(v8::Persistent<v8::Value>::New(callee)), hasArgumentGetter(false)
- {
- Q_ASSERT(engine);
- + Q_ASSERT(parent);
- context->Enter();
- }
- @@ -65,6 +66,7 @@ inline QScriptContextPrivate::QScriptContextPrivate(QScriptEnginePrivate *engine
- parent(engine->setCurrentQSContext(this)), previous(0), hasArgumentGetter(false)
- {
- Q_ASSERT(engine);
- + Q_ASSERT(parent);
- context->Enter();
- }
- @@ -74,6 +76,7 @@ inline QScriptContextPrivate::QScriptContextPrivate(QScriptEnginePrivate *engine
- previous(0), hasArgumentGetter(false)
- {
- Q_ASSERT(engine);
- + Q_ASSERT(parent);
- context->Enter();
- }
- @@ -82,6 +85,7 @@ inline QScriptContextPrivate::QScriptContextPrivate(QScriptContextPrivate *paren
- parent(parent), previous(0), frame(v8::Persistent<v8::StackFrame>::New(frame)), hasArgumentGetter(false)
- {
- Q_ASSERT(engine);
- + Q_ASSERT(parent);
- }
- @@ -94,10 +98,10 @@ inline QScriptContextPrivate::~QScriptContextPrivate()
- m_thisObject.Dispose();
- m_callee.Dispose();
- - if (!parent)
- + if (isGlobalContext())
- return;
- - if (frame.IsEmpty()) {
- + if (!isJSFrame()) {
- QScriptContextPrivate *old = engine->setCurrentQSContext(parent);
- if (old != this) {
- qWarning("QScriptEngine::pushContext() doesn't match with popContext()");
- @@ -123,7 +127,7 @@ inline QScriptPassPointer<QScriptValuePrivate> QScriptContextPrivate::argument(i
- if (index < 0)
- return InvalidValue();
- - if (arguments) {
- + if (isNativeFunction()) {
- if (index >= arguments->Length())
- return new QScriptValuePrivate(engine, QScriptValue::UndefinedValue);
- @@ -135,7 +139,7 @@ inline QScriptPassPointer<QScriptValuePrivate> QScriptContextPrivate::argument(i
- inline int QScriptContextPrivate::argumentCount() const
- {
- - if (arguments) {
- + if (isNativeFunction()) {
- return arguments->Length();
- }
- @@ -144,7 +148,7 @@ inline int QScriptContextPrivate::argumentCount() const
- inline QScriptPassPointer<QScriptValuePrivate> QScriptContextPrivate::argumentsObject() const
- {
- - if (arguments) {
- + if (isNativeFunction()) {
- if (!argsObject) {
- QScriptContextPrivate *that = const_cast<QScriptContextPrivate *>(this);
- that->argsObject = that->createArgumentsObject();
- @@ -157,9 +161,9 @@ inline QScriptPassPointer<QScriptValuePrivate> QScriptContextPrivate::argumentsO
- inline v8::Handle<v8::Object> QScriptContextPrivate::thisObject() const
- {
- - if (arguments) {
- + if (isNativeFunction()) {
- return arguments->This();
- - } else if (accessorInfo) {
- + } else if (isNativeAccessor()) {
- return accessorInfo->This();
- } else if (!m_thisObject.IsEmpty()) {
- return m_thisObject;
- @@ -170,22 +174,25 @@ inline v8::Handle<v8::Object> QScriptContextPrivate::thisObject() const
- inline void QScriptContextPrivate::setThisObject(QScriptValuePrivate *newThis)
- {
- - if (!newThis->isObject()) {
- -// qWarning() << "QScriptContext::setThisObject: cannot set this object for native context";
- + if (isNativeFunction() || isNativeAccessor() || isJSFrame()) {
- + qWarning("QScriptContext::setThisObject: cannot set this object for context");
- return;
- }
- +
- + if (!newThis->isObject())
- + return;
- +
- if (newThis->engine() != engine) {
- qWarning("QScriptContext::setThisObject() failed: cannot set an object created in "
- "a different engine");
- return;
- }
- - if (!parent) {
- - //global object
- +
- + if (isGlobalContext()) {
- engine->setGlobalObject(newThis);
- return;
- }
- - if (!frame.IsEmpty())
- - qWarning() << "QScriptContext::setThisObject: cannot set this object for native context";
- +
- m_thisObject.Dispose();
- m_thisObject = v8::Persistent<v8::Object>::New(*newThis);
- }
- @@ -193,10 +200,11 @@ inline void QScriptContextPrivate::setThisObject(QScriptValuePrivate *newThis)
- inline QScriptPassPointer<QScriptValuePrivate> QScriptContextPrivate::callee() const
- {
- - if (!m_callee.IsEmpty())
- - return new QScriptValuePrivate(engine, m_callee);
- - if (arguments)
- + if (isNativeFunction()) {
- + if (!m_callee.IsEmpty())
- + return new QScriptValuePrivate(engine, m_callee);
- return new QScriptValuePrivate(engine, arguments->Callee());
- + }
- Q_UNIMPLEMENTED();
- return InvalidValue();
- @@ -204,21 +212,23 @@ inline QScriptPassPointer<QScriptValuePrivate> QScriptContextPrivate::callee() c
- inline QScriptPassPointer<QScriptValuePrivate> QScriptContextPrivate::activationObject() const
- {
- - if (!parent)
- + if (isGlobalContext())
- return new QScriptValuePrivate(engine, engine->globalObject());
- - if (context.IsEmpty()) {
- + if (isJSFrame()) {
- Q_UNIMPLEMENTED();
- return InvalidValue();
- }
- Q_ASSERT(!context.IsEmpty());
- v8::Handle<v8::Object> activation = context->GetExtensionObject();
- - if (hasArgumentGetter || (arguments && !activation->Has(v8::String::New("arguments")))) {
- - //we need to build the arguments now just in case the activationobject is used after the
- - // QScriptContext is out of scope
- - QScriptSharedDataPointer<QScriptValuePrivate> argsObject(argumentsObject());
- - activation->ForceSet(v8::String::New("arguments"), *argsObject);
- - const_cast<bool&>(hasArgumentGetter) = false;
- + if (isNativeFunction()) {
- + if (hasArgumentGetter || !activation->Has(v8::String::New("arguments"))) {
- + // We need to build the arguments now just in case the activation object is used after
- + // the QScriptContext is out of scope.
- + QScriptSharedDataPointer<QScriptValuePrivate> argsObject(argumentsObject());
- + activation->ForceSet(v8::String::New("arguments"), *argsObject);
- + const_cast<bool&>(hasArgumentGetter) = false;
- + }
- }
- return new QScriptValuePrivate(engine, activation);
- }
- @@ -234,16 +244,15 @@ inline void QScriptContextPrivate::setActivationObject(QScriptValuePrivate *acti
- return;
- }
- - if (!parent) {
- + if (isGlobalContext()) {
- engine->setGlobalObject(activation);
- return;
- - }
- -
- - if (!context.IsEmpty()) {
- - context->SetExtensionObject(*activation);
- + } else if (isJSFrame()) {
- + Q_UNIMPLEMENTED();
- return;
- }
- - Q_UNIMPLEMENTED();
- +
- + context->SetExtensionObject(*activation);
- }
- inline QScriptValueList QScriptContextPrivate::scopeChain() const
- @@ -266,7 +275,7 @@ inline QScriptValueList QScriptContextPrivate::scopeChain() const
- } while (!current.IsEmpty());
- }
- - if (frame.IsEmpty()) {
- + if (!isJSFrame()) {
- // Implicit global context
- list.append(QScriptValuePrivate::get(new QScriptValuePrivate(engine, thisObject())));
- }
- diff --git a/src/script/api/qscriptcontext_p.h b/src/script/api/qscriptcontext_p.h
- index 0a0948e..d8cbd71 100644
- --- a/src/script/api/qscriptcontext_p.h
- +++ b/src/script/api/qscriptcontext_p.h
- @@ -61,6 +61,12 @@ public:
- inline QScriptContextPrivate(QScriptContextPrivate *parent, v8::Handle<v8::StackFrame> frame); // internal, for js frame (allocated in parentContext())
- inline ~QScriptContextPrivate();
- + inline bool isGlobalContext() const { return !parent; }
- + inline bool isNativeFunction() const { return arguments; }
- + inline bool isNativeAccessor() const { return accessorInfo; }
- + inline bool isJSFrame() const { return !frame.IsEmpty(); }
- + inline bool isPushedContext() const { return !context.IsEmpty() && !arguments && !accessorInfo; }
- +
- inline QScriptPassPointer<QScriptValuePrivate> argument(int index) const;
- inline int argumentCount() const;
- inline QScriptPassPointer<QScriptValuePrivate> argumentsObject() const;
- diff --git a/src/script/api/qscriptcontextinfo.cpp b/src/script/api/qscriptcontextinfo.cpp
- index 85d021a..ca96ecb 100644
- --- a/src/script/api/qscriptcontextinfo.cpp
- +++ b/src/script/api/qscriptcontextinfo.cpp
- @@ -127,7 +127,7 @@ QScriptContextInfoPrivate::QScriptContextInfoPrivate(const QScriptContext *conte
- QScriptContextPrivate *context_p = QScriptContextPrivate::get(context);
- QScriptIsolate api(context_p->engine, QScriptIsolate::NotNullEngine);
- v8::HandleScope handleScope;
- - if (!context_p->frame.IsEmpty()) {
- + if (context_p->isJSFrame()) {
- v8::Handle<v8::StackFrame> frame = context_p->frame;
- scriptId = frame->GetScriptId()->NumberValue();
- columnNumber = frame->GetColumn();
- diff --git a/src/script/api/qscriptengine.cpp b/src/script/api/qscriptengine.cpp
- index 322bbe9..33d1d19 100644
- --- a/src/script/api/qscriptengine.cpp
- +++ b/src/script/api/qscriptengine.cpp
- @@ -838,7 +838,7 @@ QScriptContextPrivate *QScriptEnginePrivate::pushContext()
- void QScriptEnginePrivate::popContext()
- {
- QScriptContextPrivate *ctx = currentContext();
- - if (!ctx->parentContext() || ctx->arguments) {
- + if (!ctx->isPushedContext()) {
- qWarning("QScriptEngine::popContext() doesn't match with pushContext()");
- } else {
- delete ctx;
- @@ -870,7 +870,7 @@ QScriptPassPointer<QScriptValuePrivate> QScriptEnginePrivate::evaluate(v8::Handl
- Q_ASSERT(!thisObj.IsEmpty());
- // Lazily initialize the 'arguments' property in JS context
- - if (m_currentQsContext->arguments)
- + if (m_currentQsContext->isNativeFunction())
- m_currentQsContext->initializeArgumentsProperty();
- result = script->Run(thisObj);
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement