summaryrefslogtreecommitdiff
path: root/src/script/api/qscriptcontext_p.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/script/api/qscriptcontext_p.h')
-rw-r--r--src/script/api/qscriptcontext_p.h78
1 files changed, 66 insertions, 12 deletions
diff --git a/src/script/api/qscriptcontext_p.h b/src/script/api/qscriptcontext_p.h
index 2919637..41df26f 100644
--- a/src/script/api/qscriptcontext_p.h
+++ b/src/script/api/qscriptcontext_p.h
@@ -35,24 +35,78 @@
// We mean it.
//
-#include <QtCore/qobjectdefs.h>
-
-namespace JSC
-{
- class JSObject;
- class ArgList;
- class ExecState;
-}
+#include <QtCore/QVarLengthArray>
+#include <QtCore/QPair>
+#include "qscriptcontext.h"
+#include "qscriptshareddata_p.h"
+#include "qscriptvalue_p.h"
+#include "v8.h"
QT_BEGIN_NAMESPACE
class QScriptEnginePrivate;
-
class QScriptContext;
-QT_END_NAMESPACE
+class QScriptContextPrivate : public QScriptContext
+{
+ Q_DECLARE_PUBLIC(QScriptContext);
+public:
+ static QScriptContextPrivate *get(const QScriptContext *q) { Q_ASSERT(q->d_ptr); return q->d_ptr; }
+ static QScriptContext *get(QScriptContextPrivate *d) { return d->q_func(); }
+
+ inline QScriptContextPrivate(QScriptEnginePrivate *engine); // the global context (member of QScriptEnginePrivate)
+ inline QScriptContextPrivate(QScriptEnginePrivate *engine, const v8::Arguments *args, v8::Handle<v8::Value> callee = v8::Handle<v8::Value>(), v8::Handle<v8::Object> customThisObject = v8::Handle<v8::Object>()); // native function context (on the stack)
+ inline QScriptContextPrivate(QScriptEnginePrivate *engine, const v8::AccessorInfo *accessor); // native acessors (on the stack)
+ inline QScriptContextPrivate(QScriptEnginePrivate *engine, v8::Handle<v8::Context> context); // from QScriptEngine::pushContext
+ 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;
+ v8::Handle<v8::Object> thisObject() const;
+ inline void setThisObject(QScriptValuePrivate *);
+ inline QScriptPassPointer<QScriptValuePrivate> callee() const;
-#include "wtf/Platform.h"
-#include "JSValue.h"
+ inline QScriptPassPointer<QScriptValuePrivate> activationObject() const;
+ inline void setActivationObject(QScriptValuePrivate *);
+ inline QScriptValueList scopeChain() const;
+ inline void pushScope(QScriptValuePrivate *object);
+ inline QScriptPassPointer<QScriptValuePrivate> popScope();
+ inline QScriptPassPointer<QScriptValuePrivate> createArgumentsObject();
+ inline void initializeArgumentsProperty();
+
+ inline v8::Handle<v8::Value> throwError(Error error, const QString &text);
+
+ QScriptContext* q_ptr;
+ QScriptEnginePrivate *engine;
+ const v8::Arguments *arguments;
+ const v8::AccessorInfo *accessorInfo;
+ v8::Persistent<v8::Context> context;
+ QList<v8::Persistent<v8::Context> > scopes;
+ v8::Persistent<v8::Context> inheritedScope;
+ QScriptContextPrivate *parent; //the parent native frame as seen by the engine
+ mutable QScriptContextPrivate *previous; //the previous js frame (lazily build)
+ v8::Persistent<v8::StackFrame> frame; //only for js frames
+ QScriptSharedDataPointer<QScriptValuePrivate> argsObject;
+ v8::Persistent<v8::Object> m_thisObject;
+ v8::Persistent<v8::Value> m_callee;
+ bool hasArgumentGetter;
+
+ static const int stackTraceLimit = 100;
+
+private:
+ static v8::Handle<v8::Value> argumentsPropertyGetter(v8::Local<v8::String> , const v8::AccessorInfo &);
+ Q_DISABLE_COPY(QScriptContextPrivate)
+};
+
+
+QT_END_NAMESPACE
#endif