aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jsruntime
diff options
context:
space:
mode:
Diffstat (limited to 'src/qml/jsruntime')
-rw-r--r--src/qml/jsruntime/qv4dateobject.cpp2
-rw-r--r--src/qml/jsruntime/qv4engine.cpp7
-rw-r--r--src/qml/jsruntime/qv4function.cpp9
-rw-r--r--src/qml/jsruntime/qv4global_p.h2
-rw-r--r--src/qml/jsruntime/qv4internalclass.cpp2
-rw-r--r--src/qml/jsruntime/qv4qobjectwrapper.cpp10
-rw-r--r--src/qml/jsruntime/qv4runtime.cpp2
-rw-r--r--src/qml/jsruntime/qv4stringobject.cpp4
-rw-r--r--src/qml/jsruntime/qv4vme_moth.cpp74
9 files changed, 59 insertions, 53 deletions
diff --git a/src/qml/jsruntime/qv4dateobject.cpp b/src/qml/jsruntime/qv4dateobject.cpp
index bc9b3013d1..5bbe312146 100644
--- a/src/qml/jsruntime/qv4dateobject.cpp
+++ b/src/qml/jsruntime/qv4dateobject.cpp
@@ -55,7 +55,7 @@
#include <wtf/MathExtras.h>
-#ifdef Q_OS_LINUX
+#if defined(Q_OS_LINUX) && QT_CONFIG(timezone)
/*
See QTBUG-56899. Although we don't (yet) have a proper way to reset the
system zone, the code below, that uses QTimeZone::systemTimeZone(), works
diff --git a/src/qml/jsruntime/qv4engine.cpp b/src/qml/jsruntime/qv4engine.cpp
index 5521633db7..835933c043 100644
--- a/src/qml/jsruntime/qv4engine.cpp
+++ b/src/qml/jsruntime/qv4engine.cpp
@@ -769,16 +769,19 @@ QQmlContextData *ExecutionEngine::callingQmlContext() const
QString CppStackFrame::source() const
{
- return v4Function->sourceFile();
+ return v4Function ? v4Function->sourceFile() : QString();
}
QString CppStackFrame::function() const
{
- return v4Function->name()->toQString();
+ return v4Function ? v4Function->name()->toQString() : QString();
}
int CppStackFrame::lineNumber() const
{
+ if (!v4Function)
+ return -1;
+
auto findLine = [](const CompiledData::CodeOffsetToLine &entry, uint offset) {
return entry.codeOffset < offset;
};
diff --git a/src/qml/jsruntime/qv4function.cpp b/src/qml/jsruntime/qv4function.cpp
index 83e861138b..6fca9ecd45 100644
--- a/src/qml/jsruntime/qv4function.cpp
+++ b/src/qml/jsruntime/qv4function.cpp
@@ -112,6 +112,11 @@ void Function::updateInternalClass(ExecutionEngine *engine, const QList<QByteArr
internalClass = engine->internalClasses[EngineBase::Class_CallContext];
+ // first locals
+ const quint32_le *localsIndices = compiledFunction->localsTable();
+ for (quint32 i = 0; i < compiledFunction->nLocals; ++i)
+ internalClass = internalClass->addMember(engine->identifierTable->identifier(compilationUnit->runtimeStrings[localsIndices[i]]), Attr_NotConfigurable);
+
Scope scope(engine);
ScopedString arg(scope);
for (const QString &parameterName : parameterNames) {
@@ -119,10 +124,6 @@ void Function::updateInternalClass(ExecutionEngine *engine, const QList<QByteArr
internalClass = internalClass->addMember(arg, Attr_NotConfigurable);
}
nFormals = parameters.size();
-
- const quint32_le *localsIndices = compiledFunction->localsTable();
- for (quint32 i = 0; i < compiledFunction->nLocals; ++i)
- internalClass = internalClass->addMember(engine->identifierTable->identifier(compilationUnit->runtimeStrings[localsIndices[i]]), Attr_NotConfigurable);
}
QT_END_NAMESPACE
diff --git a/src/qml/jsruntime/qv4global_p.h b/src/qml/jsruntime/qv4global_p.h
index 9b13d4e341..1fa4bae049 100644
--- a/src/qml/jsruntime/qv4global_p.h
+++ b/src/qml/jsruntime/qv4global_p.h
@@ -101,7 +101,7 @@ inline double trunc(double d) { return d > 0 ? floor(d) : ceil(d); }
# define V4_ENABLE_JIT
# endif
#elif defined(Q_PROCESSOR_ARM_64) && (QT_POINTER_SIZE == 8)
-# if defined(Q_OS_LINUX) || defined(Q_OS_QNX)
+# if defined(Q_OS_LINUX) || defined(Q_OS_QNX) || defined(Q_OS_INTEGRITY)
# define V4_ENABLE_JIT
# endif
//#elif defined(Q_PROCESSOR_MIPS_32) && defined(Q_OS_LINUX)
diff --git a/src/qml/jsruntime/qv4internalclass.cpp b/src/qml/jsruntime/qv4internalclass.cpp
index 9da854e7d7..3bfcf358bf 100644
--- a/src/qml/jsruntime/qv4internalclass.cpp
+++ b/src/qml/jsruntime/qv4internalclass.cpp
@@ -533,6 +533,8 @@ void InternalClass::updateInternalClassIdRecursive()
id = engine->newInternalClassId();
for (auto &t : transitions) {
Q_ASSERT(t.lookup);
+ if (t.flags == InternalClassTransition::VTableChange || t.flags == InternalClassTransition::PrototypeChange)
+ continue;
t.lookup->updateInternalClassIdRecursive();
}
}
diff --git a/src/qml/jsruntime/qv4qobjectwrapper.cpp b/src/qml/jsruntime/qv4qobjectwrapper.cpp
index 816c259b9b..d63d42478a 100644
--- a/src/qml/jsruntime/qv4qobjectwrapper.cpp
+++ b/src/qml/jsruntime/qv4qobjectwrapper.cpp
@@ -102,10 +102,10 @@ QPair<QObject *, int> QObjectMethod::extractQtMethod(const QV4::FunctionObject *
return qMakePair((QObject *)nullptr, -1);
}
-static QPair<QObject *, int> extractQtSignal(const Value &value)
+static QPair<QObject *, int> extractQtSignal(const QV4::Value &value)
{
if (value.isObject()) {
- QV4::ExecutionEngine *v4 = value.as<Object>()->engine();
+ QV4::ExecutionEngine *v4 = value.as<QV4::Object>()->engine();
QV4::Scope scope(v4);
QV4::ScopedFunctionObject function(scope, value);
if (function)
@@ -1106,7 +1106,7 @@ struct CallArgument {
inline void *dataPtr();
inline void initAsType(int type);
- inline void fromValue(int type, ExecutionEngine *, const Value &);
+ inline void fromValue(int type, ExecutionEngine *, const QV4::Value &);
inline ReturnedValue toValue(ExecutionEngine *);
private:
@@ -1304,7 +1304,7 @@ static int MatchScore(const QV4::Value &actual, int conversionType)
return 10;
}
}
- } else if (const Object *obj = actual.as<Object>()) {
+ } else if (const QV4::Object *obj = actual.as<QV4::Object>()) {
if (obj->as<QV4::VariantObject>()) {
if (conversionType == qMetaTypeId<QVariant>())
return 0;
@@ -1720,7 +1720,7 @@ void CallArgument::fromValue(int callType, QV4::ExecutionEngine *engine, const Q
|| callType == qMetaTypeId<std::vector<QUrl>>()
|| callType == qMetaTypeId<std::vector<QModelIndex>>()) {
queryEngine = true;
- const QV4::Object* object = value.as<Object>();
+ const QV4::Object* object = value.as<QV4::Object>();
if (callType == qMetaTypeId<std::vector<int>>()) {
stdVectorIntPtr = nullptr;
fromContainerValue<std::vector<int>>(object, callType, &CallArgument::stdVectorIntPtr, queryEngine);
diff --git a/src/qml/jsruntime/qv4runtime.cpp b/src/qml/jsruntime/qv4runtime.cpp
index 0211ad1011..9729228511 100644
--- a/src/qml/jsruntime/qv4runtime.cpp
+++ b/src/qml/jsruntime/qv4runtime.cpp
@@ -1408,7 +1408,7 @@ ReturnedValue Runtime::method_mod(const Value &left, const Value &right)
{
TRACE2(left, right);
- if (Value::integerCompatible(left, right) && right.integerValue() != 0) {
+ if (Value::integerCompatible(left, right) && left.integerValue() > 0 && right.integerValue() > 0) {
int intRes = left.integerValue() % right.integerValue();
if (intRes != 0 || left.integerValue() >= 0)
return Encode(intRes);
diff --git a/src/qml/jsruntime/qv4stringobject.cpp b/src/qml/jsruntime/qv4stringobject.cpp
index e5a02fdc22..61176b3706 100644
--- a/src/qml/jsruntime/qv4stringobject.cpp
+++ b/src/qml/jsruntime/qv4stringobject.cpp
@@ -200,7 +200,7 @@ void StringPrototype::init(ExecutionEngine *engine, Object *ctor)
defineDefaultProperty(QStringLiteral("trim"), method_trim);
}
-static Heap::String *thisAsString(ExecutionEngine *v4, const Value *thisObject)
+static Heap::String *thisAsString(ExecutionEngine *v4, const QV4::Value *thisObject)
{
if (String *s = thisObject->stringValue())
return s->d();
@@ -209,7 +209,7 @@ static Heap::String *thisAsString(ExecutionEngine *v4, const Value *thisObject)
return thisObject->toString(v4);
}
-static QString getThisString(ExecutionEngine *v4, const Value *thisObject)
+static QString getThisString(ExecutionEngine *v4, const QV4::Value *thisObject)
{
if (String *s = thisObject->stringValue())
return s->toQString();
diff --git a/src/qml/jsruntime/qv4vme_moth.cpp b/src/qml/jsruntime/qv4vme_moth.cpp
index 6adb25f964..fe7c2bd654 100644
--- a/src/qml/jsruntime/qv4vme_moth.cpp
+++ b/src/qml/jsruntime/qv4vme_moth.cpp
@@ -345,7 +345,7 @@ static struct InstrCount {
if (engine->hasException) \
goto catchException
-static inline Heap::CallContext *getScope(Value *stack, int level)
+static inline Heap::CallContext *getScope(QV4::Value *stack, int level)
{
Heap::ExecutionContext *scope = static_cast<ExecutionContext &>(stack[CallData::Context]).d();
while (level > 0) {
@@ -362,7 +362,7 @@ static inline const QV4::Value &constant(Function *function, int index)
}
-static bool compareEqual(Value lhs, Value rhs)
+static bool compareEqual(QV4::Value lhs, QV4::Value rhs)
{
redo:
if (lhs.asReturnedValue() == rhs.asReturnedValue())
@@ -376,22 +376,22 @@ static bool compareEqual(Value lhs, Value rhs)
}
switch (lt) {
- case Value::QT_ManagedOrUndefined:
+ case QV4::Value::QT_ManagedOrUndefined:
if (lhs.isUndefined())
return rhs.isNullOrUndefined();
Q_FALLTHROUGH();
- case Value::QT_ManagedOrUndefined1:
- case Value::QT_ManagedOrUndefined2:
- case Value::QT_ManagedOrUndefined3:
+ case QV4::Value::QT_ManagedOrUndefined1:
+ case QV4::Value::QT_ManagedOrUndefined2:
+ case QV4::Value::QT_ManagedOrUndefined3:
// LHS: Managed
switch (rt) {
- case Value::QT_ManagedOrUndefined:
+ case QV4::Value::QT_ManagedOrUndefined:
if (rhs.isUndefined())
return false;
Q_FALLTHROUGH();
- case Value::QT_ManagedOrUndefined1:
- case Value::QT_ManagedOrUndefined2:
- case Value::QT_ManagedOrUndefined3: {
+ case QV4::Value::QT_ManagedOrUndefined1:
+ case QV4::Value::QT_ManagedOrUndefined2:
+ case QV4::Value::QT_ManagedOrUndefined3: {
// RHS: Managed
Heap::Base *l = lhs.m();
Heap::Base *r = rhs.m();
@@ -409,12 +409,12 @@ static bool compareEqual(Value lhs, Value rhs)
}
return false;
}
- case Value::QT_Empty:
+ case QV4::Value::QT_Empty:
Q_UNREACHABLE();
- case Value::QT_Null:
+ case QV4::Value::QT_Null:
return false;
- case Value::QT_Bool:
- case Value::QT_Int:
+ case QV4::Value::QT_Bool:
+ case QV4::Value::QT_Int:
rhs = Primitive::fromDouble(rhs.int_32());
// fall through
default: // double
@@ -424,22 +424,22 @@ static bool compareEqual(Value lhs, Value rhs)
lhs = Primitive::fromReturnedValue(RuntimeHelpers::objectDefaultValue(&static_cast<QV4::Object &>(lhs), PREFERREDTYPE_HINT));
}
goto redo;
- case Value::QT_Empty:
+ case QV4::Value::QT_Empty:
Q_UNREACHABLE();
- case Value::QT_Null:
+ case QV4::Value::QT_Null:
return rhs.isNull();
- case Value::QT_Bool:
- case Value::QT_Int:
+ case QV4::Value::QT_Bool:
+ case QV4::Value::QT_Int:
switch (rt) {
- case Value::QT_ManagedOrUndefined:
- case Value::QT_ManagedOrUndefined1:
- case Value::QT_ManagedOrUndefined2:
- case Value::QT_ManagedOrUndefined3:
- case Value::QT_Empty:
- case Value::QT_Null:
+ case QV4::Value::QT_ManagedOrUndefined:
+ case QV4::Value::QT_ManagedOrUndefined1:
+ case QV4::Value::QT_ManagedOrUndefined2:
+ case QV4::Value::QT_ManagedOrUndefined3:
+ case QV4::Value::QT_Empty:
+ case QV4::Value::QT_Null:
Q_UNREACHABLE();
- case Value::QT_Bool:
- case Value::QT_Int:
+ case QV4::Value::QT_Bool:
+ case QV4::Value::QT_Int:
return lhs.int_32() == rhs.int_32();
default: // double
return lhs.int_32() == rhs.doubleValue();
@@ -450,29 +450,29 @@ static bool compareEqual(Value lhs, Value rhs)
}
}
-static bool compareEqualInt(Value &accumulator, Value lhs, int rhs)
+static bool compareEqualInt(QV4::Value &accumulator, QV4::Value lhs, int rhs)
{
redo:
switch (lhs.quickType()) {
- case Value::QT_ManagedOrUndefined:
+ case QV4::Value::QT_ManagedOrUndefined:
if (lhs.isUndefined())
return false;
Q_FALLTHROUGH();
- case Value::QT_ManagedOrUndefined1:
- case Value::QT_ManagedOrUndefined2:
- case Value::QT_ManagedOrUndefined3:
+ case QV4::Value::QT_ManagedOrUndefined1:
+ case QV4::Value::QT_ManagedOrUndefined2:
+ case QV4::Value::QT_ManagedOrUndefined3:
// LHS: Managed
if (lhs.m()->vtable()->isString)
return RuntimeHelpers::stringToNumber(static_cast<String &>(lhs).toQString()) == rhs;
accumulator = lhs;
lhs = Primitive::fromReturnedValue(RuntimeHelpers::objectDefaultValue(&static_cast<QV4::Object &>(accumulator), PREFERREDTYPE_HINT));
goto redo;
- case Value::QT_Empty:
+ case QV4::Value::QT_Empty:
Q_UNREACHABLE();
- case Value::QT_Null:
+ case QV4::Value::QT_Null:
return false;
- case Value::QT_Bool:
- case Value::QT_Int:
+ case QV4::Value::QT_Bool:
+ case QV4::Value::QT_Int:
return lhs.int_32() == rhs;
default: // double
return lhs.doubleValue() == rhs;
@@ -500,11 +500,11 @@ static bool compareEqualInt(Value &accumulator, Value lhs, int rhs)
} \
} while (false)
-QV4::ReturnedValue VME::exec(const FunctionObject *fo, const Value *thisObject, const Value *argv, int argc)
+QV4::ReturnedValue VME::exec(const FunctionObject *fo, const QV4::Value *thisObject, const QV4::Value *argv, int argc)
{
qt_v4ResolvePendingBreakpointsHook();
ExecutionEngine *engine;
- Value *stack;
+ QV4::Value *stack;
CppStackFrame frame;
frame.originalArguments = argv;
frame.originalArgumentsCount = argc;