aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/qml/jit/qv4baselineassembler.cpp14
-rw-r--r--src/qml/jit/qv4baselinejit_p.h6
-rw-r--r--src/qml/jsruntime/qv4runtime.cpp17
-rw-r--r--src/qml/jsruntime/qv4runtimeapi_p.h6
4 files changed, 40 insertions, 3 deletions
diff --git a/src/qml/jit/qv4baselineassembler.cpp b/src/qml/jit/qv4baselineassembler.cpp
index 496624c752..ba681cdbf1 100644
--- a/src/qml/jit/qv4baselineassembler.cpp
+++ b/src/qml/jit/qv4baselineassembler.cpp
@@ -883,6 +883,20 @@ void BaselineAssembler::storeLocal(int index, int level)
--level;
}
pasm()->storeAccumulator(Address(PlatformAssembler::ScratchRegister, ctx.locals.offset + offsetof(ValueArray<0>, values) + sizeof(Value)*index));
+ // check if we need a write barrier
+ auto skipBarrier = pasm()->branch8(
+ PlatformAssembler::Equal,
+ PlatformAssembler::Address(PlatformAssembler::EngineRegister,
+ offsetof(EngineBase, isGCOngoing)),
+ TrustedImm32(0));
+ saveAccumulatorInFrame();
+ // if so, do a runtime call
+ pasm()->prepareCallWithArgCount(1);
+ pasm()->passAccumulatorAsArg(0);
+ pasm()->callRuntime((void*)Runtime::MarkCustom::call, CallResultDestination::Ignore);
+ loadAccumulatorFromFrame();
+ skipBarrier.link(pasm());
+
}
void BaselineAssembler::loadString(int stringId)
diff --git a/src/qml/jit/qv4baselinejit_p.h b/src/qml/jit/qv4baselinejit_p.h
index 40138ea700..85569d6218 100644
--- a/src/qml/jit/qv4baselinejit_p.h
+++ b/src/qml/jit/qv4baselinejit_p.h
@@ -33,10 +33,10 @@ class BaselineAssembler;
class BaselineJIT final: public Moth::ByteCodeHandler
{
public:
- BaselineJIT(QV4::Function *);
- ~BaselineJIT() override;
+ Q_AUTOTEST_EXPORT BaselineJIT(QV4::Function *);
+ Q_AUTOTEST_EXPORT ~BaselineJIT() override;
- void generate();
+ Q_AUTOTEST_EXPORT void generate();
void generate_Ret() override;
void generate_Debug() override;
diff --git a/src/qml/jsruntime/qv4runtime.cpp b/src/qml/jsruntime/qv4runtime.cpp
index 8582f44668..b5c497be49 100644
--- a/src/qml/jsruntime/qv4runtime.cpp
+++ b/src/qml/jsruntime/qv4runtime.cpp
@@ -1807,6 +1807,21 @@ void Runtime::ThrowOnNullOrUndefined::call(ExecutionEngine *engine, const Value
engine->throwTypeError();
}
+void Runtime::MarkCustom::call(const Value &toBeMarked)
+{
+ auto *h = toBeMarked.heapObject();
+ if (!h)
+ return;
+ Q_ASSERT(h->internalClass);
+ auto engine = h->internalClass->engine;
+ Q_ASSERT(engine);
+ // runtime function is only meant to be called while gc is ongoing
+ Q_ASSERT(engine->isGCOngoing);
+ QV4::WriteBarrier::markCustom(engine, [&](QV4::MarkStack *ms) {
+ h->mark(ms);
+ });
+}
+
ReturnedValue Runtime::ConvertThisToObject::call(ExecutionEngine *engine, const Value &t)
{
if (!t.isObject()) {
@@ -2493,6 +2508,8 @@ QHash<const void *, const char *> Runtime::symbolTable()
{symbol<Closure>(), "Closure" },
+ {symbol<MarkCustom>(), "MarkCustom"},
+
{symbol<ConvertThisToObject>(), "ConvertThisToObject" },
{symbol<DeclareVar>(), "DeclareVar" },
{symbol<CreateMappedArgumentsObject>(), "CreateMappedArgumentsObject" },
diff --git a/src/qml/jsruntime/qv4runtimeapi_p.h b/src/qml/jsruntime/qv4runtimeapi_p.h
index fdee6ac580..e4a8c09370 100644
--- a/src/qml/jsruntime/qv4runtimeapi_p.h
+++ b/src/qml/jsruntime/qv4runtimeapi_p.h
@@ -230,6 +230,12 @@ struct Q_QML_EXPORT Runtime {
static void call(ExecutionEngine *, const Value &);
};
+ /* garbage collection */
+ struct Q_QML_EXPORT MarkCustom : PureMethod
+ {
+ static void call(const Value &toBeMarked);
+ };
+
/* closures */
struct Q_QML_EXPORT Closure : Method<Throws::No>
{