summaryrefslogtreecommitdiffstats
path: root/src/script
diff options
context:
space:
mode:
Diffstat (limited to 'src/script')
-rw-r--r--src/script/api/qscriptengine.cpp17
-rw-r--r--src/script/api/qscriptengine_p.h3
-rw-r--r--src/script/bridge/qscriptactivationobject.cpp2
-rw-r--r--src/script/bridge/qscriptfunction.cpp4
-rw-r--r--src/script/bridge/qscriptobject.cpp4
5 files changed, 17 insertions, 13 deletions
diff --git a/src/script/api/qscriptengine.cpp b/src/script/api/qscriptengine.cpp
index 78bbf5f..b27d1be 100644
--- a/src/script/api/qscriptengine.cpp
+++ b/src/script/api/qscriptengine.cpp
@@ -2353,23 +2353,25 @@ JSC::CallFrame *QScriptEnginePrivate::pushContext(JSC::CallFrame *exec, JSC::JSV
//build a frame
JSC::CallFrame *newCallFrame = exec;
if (callee == 0 //called from public QScriptEngine::pushContext
- || exec->returnPC() == 0 || (contextFlags(exec) & NativeContext) //called from native-native call
+ || exec->returnPC() == 0 || (contextFlags(exec) & NativeContext) //called from native-native call
|| (exec->codeBlock() && exec->callee() != callee)) { //the interpreter did not build a frame for us.
//We need to check if the Interpreter might have already created a frame for function called from JS.
JSC::Interpreter *interp = exec->interpreter();
JSC::Register *oldEnd = interp->registerFile().end();
int argc = args.size() + 1; //add "this"
JSC::Register *newEnd = oldEnd + argc + JSC::RegisterFile::CallFrameHeaderSize;
- if (!interp->registerFile().grow(newEnd))
+ //Without + argc + JSC::RegisterFile::CallFrameHeaderSize, it crashes.
+ //It seems that JSC is not consistant with the way the callframe is crated
+ if (!interp->registerFile().grow(newEnd + argc + JSC::RegisterFile::CallFrameHeaderSize))
return 0; //### Stack overflow
- newCallFrame = JSC::CallFrame::create(oldEnd);
+ newCallFrame = JSC::CallFrame::create(newEnd);
newCallFrame[0] = thisObject;
int dst = 0;
JSC::ArgList::const_iterator it;
for (it = args.begin(); it != args.end(); ++it)
newCallFrame[++dst] = *it;
newCallFrame += argc + JSC::RegisterFile::CallFrameHeaderSize;
- newCallFrame->init(0, /*vPC=*/0, exec->scopeChain(), exec, flags, argc, callee);
+ newCallFrame->init(0, /*vPC=*/0, exec->scopeChain(), exec, flags | ShouldRestoreCallFrame, argc, callee);
} else {
setContextFlags(newCallFrame, flags);
#if ENABLE(JIT)
@@ -2411,18 +2413,19 @@ void QScriptEngine::popContext()
*/
void QScriptEnginePrivate::popContext()
{
- bool hasScope = contextFlags(currentFrame) & HasScopeContext;
- if (currentFrame->returnPC() == 0) { //normal case
+ uint flags = contextFlags(currentFrame);
+ bool hasScope = flags & HasScopeContext;
+ if (flags & ShouldRestoreCallFrame) { //normal case
JSC::RegisterFile &registerFile = currentFrame->interpreter()->registerFile();
JSC::Register *const newEnd = currentFrame->registers() - JSC::RegisterFile::CallFrameHeaderSize - currentFrame->argumentCount();
if (hasScope)
currentFrame->scopeChain()->pop()->deref();
- currentFrame = currentFrame->callerFrame();
registerFile.shrink(newEnd);
} else if(hasScope) { //the stack frame was created by the Interpreter, we don't need to rewind it.
currentFrame->setScopeChain(currentFrame->scopeChain()->pop());
currentFrame->scopeChain()->deref();
}
+ currentFrame = currentFrame->callerFrame();
}
/*!
diff --git a/src/script/api/qscriptengine_p.h b/src/script/api/qscriptengine_p.h
index c43ca61..b8b805e 100644
--- a/src/script/api/qscriptengine_p.h
+++ b/src/script/api/qscriptengine_p.h
@@ -170,7 +170,8 @@ public:
enum ContextFlags {
NativeContext = 1,
CalledAsConstructorContext = 2,
- HasScopeContext = 4
+ HasScopeContext = 4, // Specifies that the is a QScriptActivationObject
+ ShouldRestoreCallFrame = 8
};
static uint contextFlags(JSC::ExecState *);
static void setContextFlags(JSC::ExecState *, uint);
diff --git a/src/script/bridge/qscriptactivationobject.cpp b/src/script/bridge/qscriptactivationobject.cpp
index 7982982..edccb3e 100644
--- a/src/script/bridge/qscriptactivationobject.cpp
+++ b/src/script/bridge/qscriptactivationobject.cpp
@@ -46,7 +46,7 @@
namespace JSC
{
- ASSERT_CLASS_FITS_IN_CELL(QScript::QScriptActivationObject);
+ ASSERT_CLASS_FITS_IN_CELL(QT_PREPEND_NAMESPACE(QScript::QScriptActivationObject));
}
QT_BEGIN_NAMESPACE
diff --git a/src/script/bridge/qscriptfunction.cpp b/src/script/bridge/qscriptfunction.cpp
index 5f419ff..d3767bf 100644
--- a/src/script/bridge/qscriptfunction.cpp
+++ b/src/script/bridge/qscriptfunction.cpp
@@ -55,8 +55,8 @@
namespace JSC
{
-ASSERT_CLASS_FITS_IN_CELL(QScript::FunctionWrapper);
-ASSERT_CLASS_FITS_IN_CELL(QScript::FunctionWithArgWrapper);
+ASSERT_CLASS_FITS_IN_CELL(QT_PREPEND_NAMESPACE(QScript::FunctionWrapper));
+ASSERT_CLASS_FITS_IN_CELL(QT_PREPEND_NAMESPACE(QScript::FunctionWithArgWrapper));
}
QT_BEGIN_NAMESPACE
diff --git a/src/script/bridge/qscriptobject.cpp b/src/script/bridge/qscriptobject.cpp
index 0d899f8..55644fe 100644
--- a/src/script/bridge/qscriptobject.cpp
+++ b/src/script/bridge/qscriptobject.cpp
@@ -46,8 +46,8 @@
namespace JSC
{
//QT_USE_NAMESPACE
-ASSERT_CLASS_FITS_IN_CELL(QScriptObject);
-ASSERT_CLASS_FITS_IN_CELL(QScriptObjectPrototype);
+ASSERT_CLASS_FITS_IN_CELL(QT_PREPEND_NAMESPACE(QScriptObject));
+ASSERT_CLASS_FITS_IN_CELL(QT_PREPEND_NAMESPACE(QScriptObjectPrototype));
}
QT_BEGIN_NAMESPACE