diff options
Diffstat (limited to 'src/qml/compiler/qv4isel_moth_p.h')
-rw-r--r-- | src/qml/compiler/qv4isel_moth_p.h | 141 |
1 files changed, 75 insertions, 66 deletions
diff --git a/src/qml/compiler/qv4isel_moth_p.h b/src/qml/compiler/qv4isel_moth_p.h index bf3909682d..9699555670 100644 --- a/src/qml/compiler/qv4isel_moth_p.h +++ b/src/qml/compiler/qv4isel_moth_p.h @@ -54,6 +54,7 @@ #include <private/qv4global_p.h> #include <private/qv4isel_p.h> #include <private/qv4isel_util_p.h> +#include <private/qv4util_p.h> #include <private/qv4jsir_p.h> #include <private/qv4value_p.h> #include "qv4instr_moth_p.h" @@ -66,7 +67,10 @@ namespace Moth { struct CompilationUnit : public QV4::CompiledData::CompilationUnit { virtual ~CompilationUnit(); - virtual void linkBackendToEngine(QV4::ExecutionEngine *engine); + void linkBackendToEngine(QV4::ExecutionEngine *engine) Q_DECL_OVERRIDE; + void prepareCodeOffsetsForDiskStorage(CompiledData::Unit *unit) Q_DECL_OVERRIDE; + bool saveCodeToDisk(QIODevice *device, const CompiledData::Unit *unit, QString *errorString) Q_DECL_OVERRIDE; + bool memoryMapCode(QString *errorString) Q_DECL_OVERRIDE; QVector<QByteArray> codeRefs; @@ -77,71 +81,71 @@ class Q_QML_EXPORT InstructionSelection: public EvalInstructionSelection { public: - InstructionSelection(QQmlEnginePrivate *qmlEngine, QV4::ExecutableAllocator *execAllocator, IR::Module *module, QV4::Compiler::JSUnitGenerator *jsGenerator); + InstructionSelection(QQmlEnginePrivate *qmlEngine, QV4::ExecutableAllocator *execAllocator, IR::Module *module, QV4::Compiler::JSUnitGenerator *jsGenerator, EvalISelFactory *iselFactory); ~InstructionSelection(); - virtual void run(int functionIndex); + void run(int functionIndex) override; protected: - virtual QQmlRefPointer<CompiledData::CompilationUnit> backendCompileStep(); - - virtual void visitJump(IR::Jump *); - virtual void visitCJump(IR::CJump *); - virtual void visitRet(IR::Ret *); - - virtual void callBuiltinInvalid(IR::Name *func, IR::ExprList *args, IR::Expr *result); - virtual void callBuiltinTypeofQmlContextProperty(IR::Expr *base, IR::Member::MemberKind kind, int propertyIndex, IR::Expr *result); - virtual void callBuiltinTypeofMember(IR::Expr *base, const QString &name, IR::Expr *result); - virtual void callBuiltinTypeofSubscript(IR::Expr *base, IR::Expr *index, IR::Expr *result); - virtual void callBuiltinTypeofName(const QString &name, IR::Expr *result); - virtual void callBuiltinTypeofValue(IR::Expr *value, IR::Expr *result); - virtual void callBuiltinDeleteMember(IR::Expr *base, const QString &name, IR::Expr *result); - virtual void callBuiltinDeleteSubscript(IR::Expr *base, IR::Expr *index, IR::Expr *result); - virtual void callBuiltinDeleteName(const QString &name, IR::Expr *result); - virtual void callBuiltinDeleteValue(IR::Expr *result); - virtual void callBuiltinThrow(IR::Expr *arg); - virtual void callBuiltinReThrow(); - virtual void callBuiltinUnwindException(IR::Expr *); - virtual void callBuiltinPushCatchScope(const QString &exceptionName); - virtual void callBuiltinForeachIteratorObject(IR::Expr *arg, IR::Expr *result); - virtual void callBuiltinForeachNextPropertyname(IR::Expr *arg, IR::Expr *result); - virtual void callBuiltinPushWithScope(IR::Expr *arg); - virtual void callBuiltinPopScope(); - virtual void callBuiltinDeclareVar(bool deletable, const QString &name); - virtual void callBuiltinDefineArray(IR::Expr *result, IR::ExprList *args); - virtual void callBuiltinDefineObjectLiteral(IR::Expr *result, int keyValuePairCount, IR::ExprList *keyValuePairs, IR::ExprList *arrayEntries, bool needSparseArray); - virtual void callBuiltinSetupArgumentObject(IR::Expr *result); - virtual void callBuiltinConvertThisToObject(); - virtual void callValue(IR::Expr *value, IR::ExprList *args, IR::Expr *result); - virtual void callQmlContextProperty(IR::Expr *base, IR::Member::MemberKind kind, int propertyIndex, IR::ExprList *args, IR::Expr *result); - virtual void callProperty(IR::Expr *base, const QString &name, IR::ExprList *args, IR::Expr *result); - virtual void callSubscript(IR::Expr *base, IR::Expr *index, IR::ExprList *args, IR::Expr *result); - virtual void convertType(IR::Expr *source, IR::Expr *target); - virtual void constructActivationProperty(IR::Name *func, IR::ExprList *args, IR::Expr *result); - virtual void constructProperty(IR::Expr *base, const QString &name, IR::ExprList *args, IR::Expr *result); - virtual void constructValue(IR::Expr *value, IR::ExprList *args, IR::Expr *result); - virtual void loadThisObject(IR::Expr *e); - virtual void loadQmlContext(IR::Expr *e); - virtual void loadQmlImportedScripts(IR::Expr *e); - virtual void loadQmlSingleton(const QString &name, IR::Expr *e); - virtual void loadConst(IR::Const *sourceConst, IR::Expr *e); - virtual void loadString(const QString &str, IR::Expr *target); - virtual void loadRegexp(IR::RegExp *sourceRegexp, IR::Expr *target); - virtual void getActivationProperty(const IR::Name *name, IR::Expr *target); - virtual void setActivationProperty(IR::Expr *source, const QString &targetName); - virtual void initClosure(IR::Closure *closure, IR::Expr *target); - virtual void getProperty(IR::Expr *base, const QString &name, IR::Expr *target); - virtual void setProperty(IR::Expr *source, IR::Expr *targetBase, const QString &targetName); - virtual void setQmlContextProperty(IR::Expr *source, IR::Expr *targetBase, IR::Member::MemberKind kind, int propertyIndex); - virtual void setQObjectProperty(IR::Expr *source, IR::Expr *targetBase, int propertyIndex); - virtual void getQmlContextProperty(IR::Expr *source, IR::Member::MemberKind kind, QQmlPropertyData *property, int index, IR::Expr *target); - virtual void getQObjectProperty(IR::Expr *base, QQmlPropertyData *property, bool captureRequired, bool isSingleton, int attachedPropertiesId, IR::Expr *target); - virtual void getElement(IR::Expr *base, IR::Expr *index, IR::Expr *target); - virtual void setElement(IR::Expr *source, IR::Expr *targetBase, IR::Expr *targetIndex); - virtual void copyValue(IR::Expr *source, IR::Expr *target); - virtual void swapValues(IR::Expr *source, IR::Expr *target); - virtual void unop(IR::AluOp oper, IR::Expr *source, IR::Expr *target); - virtual void binop(IR::AluOp oper, IR::Expr *leftSource, IR::Expr *rightSource, IR::Expr *target); + QQmlRefPointer<CompiledData::CompilationUnit> backendCompileStep() override; + + void visitJump(IR::Jump *) override; + void visitCJump(IR::CJump *) override; + void visitRet(IR::Ret *) override; + + void callBuiltinInvalid(IR::Name *func, IR::ExprList *args, IR::Expr *result) override; + void callBuiltinTypeofQmlContextProperty(IR::Expr *base, IR::Member::MemberKind kind, int propertyIndex, IR::Expr *result) override; + void callBuiltinTypeofMember(IR::Expr *base, const QString &name, IR::Expr *result) override; + void callBuiltinTypeofSubscript(IR::Expr *base, IR::Expr *index, IR::Expr *result) override; + void callBuiltinTypeofName(const QString &name, IR::Expr *result) override; + void callBuiltinTypeofValue(IR::Expr *value, IR::Expr *result) override; + void callBuiltinDeleteMember(IR::Expr *base, const QString &name, IR::Expr *result) override; + void callBuiltinDeleteSubscript(IR::Expr *base, IR::Expr *index, IR::Expr *result) override; + void callBuiltinDeleteName(const QString &name, IR::Expr *result) override; + void callBuiltinDeleteValue(IR::Expr *result) override; + void callBuiltinThrow(IR::Expr *arg) override; + void callBuiltinReThrow() override; + void callBuiltinUnwindException(IR::Expr *) override; + void callBuiltinPushCatchScope(const QString &exceptionName) override; + void callBuiltinForeachIteratorObject(IR::Expr *arg, IR::Expr *result) override; + void callBuiltinForeachNextPropertyname(IR::Expr *arg, IR::Expr *result) override; + void callBuiltinPushWithScope(IR::Expr *arg) override; + void callBuiltinPopScope() override; + void callBuiltinDeclareVar(bool deletable, const QString &name) override; + void callBuiltinDefineArray(IR::Expr *result, IR::ExprList *args) override; + void callBuiltinDefineObjectLiteral(IR::Expr *result, int keyValuePairCount, IR::ExprList *keyValuePairs, IR::ExprList *arrayEntries, bool needSparseArray) override; + void callBuiltinSetupArgumentObject(IR::Expr *result) override; + void callBuiltinConvertThisToObject() override; + void callValue(IR::Expr *value, IR::ExprList *args, IR::Expr *result) override; + void callQmlContextProperty(IR::Expr *base, IR::Member::MemberKind kind, int propertyIndex, IR::ExprList *args, IR::Expr *result) override; + void callProperty(IR::Expr *base, const QString &name, IR::ExprList *args, IR::Expr *result) override; + void callSubscript(IR::Expr *base, IR::Expr *index, IR::ExprList *args, IR::Expr *result) override; + void convertType(IR::Expr *source, IR::Expr *target) override; + void constructActivationProperty(IR::Name *func, IR::ExprList *args, IR::Expr *result) override; + void constructProperty(IR::Expr *base, const QString &name, IR::ExprList *args, IR::Expr *result) override; + void constructValue(IR::Expr *value, IR::ExprList *args, IR::Expr *result) override; + void loadThisObject(IR::Expr *e) override; + void loadQmlContext(IR::Expr *e) override; + void loadQmlImportedScripts(IR::Expr *e) override; + void loadQmlSingleton(const QString &name, IR::Expr *e) override; + void loadConst(IR::Const *sourceConst, IR::Expr *e) override; + void loadString(const QString &str, IR::Expr *target) override; + void loadRegexp(IR::RegExp *sourceRegexp, IR::Expr *target) override; + void getActivationProperty(const IR::Name *name, IR::Expr *target) override; + void setActivationProperty(IR::Expr *source, const QString &targetName) override; + void initClosure(IR::Closure *closure, IR::Expr *target) override; + void getProperty(IR::Expr *base, const QString &name, IR::Expr *target) override; + void setProperty(IR::Expr *source, IR::Expr *targetBase, const QString &targetName) override; + void setQmlContextProperty(IR::Expr *source, IR::Expr *targetBase, IR::Member::MemberKind kind, int propertyIndex) override; + void setQObjectProperty(IR::Expr *source, IR::Expr *targetBase, int propertyIndex) override; + void getQmlContextProperty(IR::Expr *source, IR::Member::MemberKind kind, int index, bool captureRequired, IR::Expr *target) override; + void getQObjectProperty(IR::Expr *base, int propertyIndex, bool captureRequired, bool isSingleton, int attachedPropertiesId, IR::Expr *target) override; + void getElement(IR::Expr *base, IR::Expr *index, IR::Expr *target) override; + void setElement(IR::Expr *source, IR::Expr *targetBase, IR::Expr *targetIndex) override; + void copyValue(IR::Expr *source, IR::Expr *target) override; + void swapValues(IR::Expr *source, IR::Expr *target) override; + void unop(IR::AluOp oper, IR::Expr *source, IR::Expr *target) override; + void binop(IR::AluOp oper, IR::Expr *leftSource, IR::Expr *rightSource, IR::Expr *target) override; private: Param binopHelper(IR::AluOp oper, IR::Expr *leftSource, IR::Expr *rightSource, IR::Expr *target); @@ -174,6 +178,8 @@ private: template <int Instr> inline ptrdiff_t addInstruction(const InstrData<Instr> &data); + inline void addDebugInstruction(); + ptrdiff_t addInstructionHelper(Instr::Type type, Instr &instr); void patchJumpAddresses(); QByteArray squeezeCode() const; @@ -192,7 +198,7 @@ private: uchar *_codeNext; uchar *_codeEnd; - QSet<IR::Jump *> _removableJumps; + BitVector _removableJumps; IR::Stmt *_currentStatement; QScopedPointer<CompilationUnit> compilationUnit; @@ -202,11 +208,14 @@ private: class Q_QML_EXPORT ISelFactory: public EvalISelFactory { public: + ISelFactory() : EvalISelFactory(QStringLiteral("moth")) {} virtual ~ISelFactory() {} - virtual EvalInstructionSelection *create(QQmlEnginePrivate *qmlEngine, QV4::ExecutableAllocator *execAllocator, IR::Module *module, QV4::Compiler::JSUnitGenerator *jsGenerator) - { return new InstructionSelection(qmlEngine, execAllocator, module, jsGenerator); } - virtual bool jitCompileRegexps() const + EvalInstructionSelection *create(QQmlEnginePrivate *qmlEngine, QV4::ExecutableAllocator *execAllocator, IR::Module *module, QV4::Compiler::JSUnitGenerator *jsGenerator) Q_DECL_OVERRIDE Q_DECL_FINAL + { return new InstructionSelection(qmlEngine, execAllocator, module, jsGenerator, this); } + bool jitCompileRegexps() const Q_DECL_OVERRIDE Q_DECL_FINAL { return false; } + QQmlRefPointer<QV4::CompiledData::CompilationUnit> createUnitForLoading() Q_DECL_OVERRIDE; + }; template<int InstrT> |