| /**************************************************************************** |
| ** |
| ** Copyright (C) 2016 The Qt Company Ltd. |
| ** Contact: https://www.qt.io/licensing/ |
| ** |
| ** This file is part of the QtQml module of the Qt Toolkit. |
| ** |
| ** $QT_BEGIN_LICENSE:LGPL$ |
| ** Commercial License Usage |
| ** Licensees holding valid commercial Qt licenses may use this file in |
| ** accordance with the commercial license agreement provided with the |
| ** Software or, alternatively, in accordance with the terms contained in |
| ** a written agreement between you and The Qt Company. For licensing terms |
| ** and conditions see https://www.qt.io/terms-conditions. For further |
| ** information use the contact form at https://www.qt.io/contact-us. |
| ** |
| ** GNU Lesser General Public License Usage |
| ** Alternatively, this file may be used under the terms of the GNU Lesser |
| ** General Public License version 3 as published by the Free Software |
| ** Foundation and appearing in the file LICENSE.LGPL3 included in the |
| ** packaging of this file. Please review the following information to |
| ** ensure the GNU Lesser General Public License version 3 requirements |
| ** will be met: https://www.gnu.org/licenses/lgpl-3.0.html. |
| ** |
| ** GNU General Public License Usage |
| ** Alternatively, this file may be used under the terms of the GNU |
| ** General Public License version 2.0 or (at your option) the GNU General |
| ** Public license version 3 or any later version approved by the KDE Free |
| ** Qt Foundation. The licenses are as published by the Free Software |
| ** Foundation and appearing in the file LICENSE.GPL2 and LICENSE.GPL3 |
| ** included in the packaging of this file. Please review the following |
| ** information to ensure the GNU General Public License requirements will |
| ** be met: https://www.gnu.org/licenses/gpl-2.0.html and |
| ** https://www.gnu.org/licenses/gpl-3.0.html. |
| ** |
| ** $QT_END_LICENSE$ |
| ** |
| ****************************************************************************/ |
| #ifndef QV4RUNTIMEAPI_P_H |
| #define QV4RUNTIMEAPI_P_H |
| |
| // |
| // W A R N I N G |
| // ------------- |
| // |
| // This file is not part of the Qt API. It exists purely as an |
| // implementation detail. This header file may change from version to |
| // version without notice, or even be removed. |
| // |
| // We mean it. |
| // |
| |
| #include <private/qv4global_p.h> |
| #include <private/qv4staticvalue_p.h> |
| |
| QT_BEGIN_NAMESPACE |
| |
| namespace QV4 { |
| |
| typedef uint Bool; |
| |
| struct Q_QML_PRIVATE_EXPORT Runtime { |
| typedef ReturnedValue (*UnaryOperation)(const Value &value); |
| typedef ReturnedValue (*BinaryOperation)(const Value &left, const Value &right); |
| typedef ReturnedValue (*BinaryOperationContext)(ExecutionEngine *, const Value &left, const Value &right); |
| |
| enum class Throws { No, Yes }; |
| enum class ChangesContext { No, Yes }; |
| enum class Pure { No, Yes }; |
| enum class LastArgumentIsOutputValue { No, Yes }; |
| |
| template<Throws t, ChangesContext c = ChangesContext::No, Pure p = Pure::No, |
| LastArgumentIsOutputValue out = LastArgumentIsOutputValue::No> |
| struct Method |
| { |
| static constexpr bool throws = t == Throws::Yes; |
| static constexpr bool changesContext = c == ChangesContext::Yes; |
| static constexpr bool pure = p == Pure::Yes; |
| static constexpr bool lastArgumentIsOutputValue = out == LastArgumentIsOutputValue::Yes; |
| }; |
| using PureMethod = Method<Throws::No, ChangesContext::No, Pure::Yes>; |
| using IteratorMethod = Method<Throws::Yes, ChangesContext::No, Pure::No, |
| LastArgumentIsOutputValue::Yes>; |
| |
| /* call */ |
| struct Q_QML_PRIVATE_EXPORT CallGlobalLookup : Method<Throws::Yes> |
| { |
| static ReturnedValue call(ExecutionEngine *, uint, Value[], int); |
| }; |
| struct Q_QML_PRIVATE_EXPORT CallQmlContextPropertyLookup : Method<Throws::Yes> |
| { |
| static ReturnedValue call(ExecutionEngine *, uint, Value[], int); |
| }; |
| struct Q_QML_PRIVATE_EXPORT CallName : Method<Throws::Yes> |
| { |
| static ReturnedValue call(ExecutionEngine *, int, Value[], int); |
| }; |
| struct Q_QML_PRIVATE_EXPORT CallProperty : Method<Throws::Yes> |
| { |
| static ReturnedValue call(ExecutionEngine *, const Value &, int, Value[], int); |
| }; |
| struct Q_QML_PRIVATE_EXPORT CallPropertyLookup : Method<Throws::Yes> |
| { |
| static ReturnedValue call(ExecutionEngine *, const Value &, uint, Value[], int); |
| }; |
| struct Q_QML_PRIVATE_EXPORT CallElement : Method<Throws::Yes> |
| { |
| static ReturnedValue call(ExecutionEngine *, const Value &, const Value &, Value[], int); |
| }; |
| struct Q_QML_PRIVATE_EXPORT CallValue : Method<Throws::Yes> |
| { |
| static ReturnedValue call(ExecutionEngine *, const Value &, Value[], int); |
| }; |
| struct Q_QML_PRIVATE_EXPORT CallWithReceiver : Method<Throws::Yes> |
| { |
| static ReturnedValue call(ExecutionEngine *, const Value &, const Value &, Value[], int); |
| }; |
| struct Q_QML_PRIVATE_EXPORT CallPossiblyDirectEval : Method<Throws::Yes> |
| { |
| static ReturnedValue call(ExecutionEngine *, Value[], int); |
| }; |
| struct Q_QML_PRIVATE_EXPORT CallWithSpread : Method<Throws::Yes> |
| { |
| static ReturnedValue call(ExecutionEngine *, const Value &, const Value &, Value[], int); |
| }; |
| struct Q_QML_PRIVATE_EXPORT TailCall : Method<Throws::Yes> |
| { |
| static ReturnedValue call(CppStackFrame *, ExecutionEngine *); |
| }; |
| |
| /* construct */ |
| struct Q_QML_PRIVATE_EXPORT Construct : Method<Throws::Yes> |
| { |
| static ReturnedValue call(ExecutionEngine *, const Value &, const Value &, Value[], int); |
| }; |
| struct Q_QML_PRIVATE_EXPORT ConstructWithSpread : Method<Throws::Yes> |
| { |
| static ReturnedValue call(ExecutionEngine *, const Value &, const Value &, Value[], int); |
| }; |
| |
| /* load & store */ |
| struct Q_QML_PRIVATE_EXPORT StoreNameStrict : Method<Throws::Yes> |
| { |
| static void call(ExecutionEngine *, int, const Value &); |
| }; |
| struct Q_QML_PRIVATE_EXPORT StoreNameSloppy : Method<Throws::Yes> |
| { |
| static void call(ExecutionEngine *, int, const Value &); |
| }; |
| struct Q_QML_PRIVATE_EXPORT StoreProperty : Method<Throws::Yes> |
| { |
| static void call(ExecutionEngine *, const Value &, int, const Value &); |
| }; |
| struct Q_QML_PRIVATE_EXPORT StoreElement : Method<Throws::Yes> |
| { |
| static void call(ExecutionEngine *, const Value &, const Value &, const Value &); |
| }; |
| struct Q_QML_PRIVATE_EXPORT LoadProperty : Method<Throws::Yes> |
| { |
| static ReturnedValue call(ExecutionEngine *, const Value &, int); |
| }; |
| struct Q_QML_PRIVATE_EXPORT LoadName : Method<Throws::Yes> |
| { |
| static ReturnedValue call(ExecutionEngine *, int); |
| }; |
| struct Q_QML_PRIVATE_EXPORT LoadElement : Method<Throws::Yes> |
| { |
| static ReturnedValue call(ExecutionEngine *, const Value &, const Value &); |
| }; |
| struct Q_QML_PRIVATE_EXPORT LoadSuperProperty : Method<Throws::Yes> |
| { |
| static ReturnedValue call(ExecutionEngine *, const Value &); |
| }; |
| struct Q_QML_PRIVATE_EXPORT StoreSuperProperty : Method<Throws::Yes> |
| { |
| static void call(ExecutionEngine *, const Value &, const Value &); |
| }; |
| struct Q_QML_PRIVATE_EXPORT LoadSuperConstructor : Method<Throws::Yes> |
| { |
| static ReturnedValue call(ExecutionEngine *, const Value &); |
| }; |
| struct Q_QML_PRIVATE_EXPORT LoadGlobalLookup : Method<Throws::Yes> |
| { |
| static ReturnedValue call(ExecutionEngine *, Function *, int); |
| }; |
| struct Q_QML_PRIVATE_EXPORT LoadQmlContextPropertyLookup : Method<Throws::Yes> |
| { |
| static ReturnedValue call(ExecutionEngine *, uint); |
| }; |
| struct Q_QML_PRIVATE_EXPORT GetLookup : Method<Throws::Yes> |
| { |
| static ReturnedValue call(ExecutionEngine *, Function *, const Value &, int); |
| }; |
| struct Q_QML_PRIVATE_EXPORT SetLookupStrict : Method<Throws::Yes> |
| { |
| static void call(Function *, const Value &, int, const Value &); |
| }; |
| struct Q_QML_PRIVATE_EXPORT SetLookupSloppy : Method<Throws::Yes> |
| { |
| static void call(Function *, const Value &, int, const Value &); |
| }; |
| |
| /* typeof */ |
| struct Q_QML_PRIVATE_EXPORT TypeofValue : PureMethod |
| { |
| static ReturnedValue call(ExecutionEngine *, const Value &); |
| }; |
| struct Q_QML_PRIVATE_EXPORT TypeofName : Method<Throws::No> |
| { |
| static ReturnedValue call(ExecutionEngine *, int); |
| }; |
| |
| /* delete */ |
| struct Q_QML_PRIVATE_EXPORT DeleteProperty_NoThrow : Method<Throws::No> |
| { |
| static Bool call(ExecutionEngine *, const Value &, const Value &); |
| }; |
| struct Q_QML_PRIVATE_EXPORT DeleteProperty : Method<Throws::Yes> |
| { |
| static ReturnedValue call(ExecutionEngine *, Function *, const Value &, const Value &); |
| }; |
| struct Q_QML_PRIVATE_EXPORT DeleteName_NoThrow : Method<Throws::No> |
| { |
| static Bool call(ExecutionEngine *, int); |
| }; |
| struct Q_QML_PRIVATE_EXPORT DeleteName : Method<Throws::Yes> |
| { |
| static ReturnedValue call(ExecutionEngine *, Function *, int); |
| }; |
| |
| /* exceptions & scopes */ |
| struct Q_QML_PRIVATE_EXPORT ThrowException : Method<Throws::Yes> |
| { |
| static void call(ExecutionEngine *, const Value &); |
| }; |
| struct Q_QML_PRIVATE_EXPORT PushCallContext : Method<Throws::No, ChangesContext::Yes> |
| { |
| static void call(CppStackFrame *); |
| }; |
| struct Q_QML_PRIVATE_EXPORT PushWithContext : Method<Throws::Yes, ChangesContext::Yes> |
| { |
| static ReturnedValue call(ExecutionEngine *, const Value &); |
| }; |
| struct Q_QML_PRIVATE_EXPORT PushCatchContext : Method<Throws::No, ChangesContext::Yes> |
| { |
| static void call(ExecutionEngine *, int, int); |
| }; |
| struct Q_QML_PRIVATE_EXPORT PushBlockContext : Method<Throws::No, ChangesContext::Yes> |
| { |
| static void call(ExecutionEngine *, int); |
| }; |
| struct Q_QML_PRIVATE_EXPORT CloneBlockContext : Method<Throws::No, ChangesContext::Yes> |
| { |
| static void call(ExecutionEngine *); |
| }; |
| struct Q_QML_PRIVATE_EXPORT PushScriptContext : Method<Throws::No, ChangesContext::Yes> |
| { |
| static void call(ExecutionEngine *, int); |
| }; |
| struct Q_QML_PRIVATE_EXPORT PopScriptContext : Method<Throws::No, ChangesContext::Yes> |
| { |
| static void call(ExecutionEngine *); |
| }; |
| struct Q_QML_PRIVATE_EXPORT ThrowReferenceError : Method<Throws::Yes> |
| { |
| static void call(ExecutionEngine *, int); |
| }; |
| struct Q_QML_PRIVATE_EXPORT ThrowOnNullOrUndefined : Method<Throws::Yes> |
| { |
| static void call(ExecutionEngine *, const Value &); |
| }; |
| |
| /* closures */ |
| struct Q_QML_PRIVATE_EXPORT Closure : Method<Throws::No> |
| { |
| static ReturnedValue call(ExecutionEngine *, int); |
| }; |
| |
| /* Function header */ |
| struct Q_QML_PRIVATE_EXPORT ConvertThisToObject : Method<Throws::Yes> |
| { |
| static ReturnedValue call(ExecutionEngine *, const Value &); |
| }; |
| struct Q_QML_PRIVATE_EXPORT DeclareVar : Method<Throws::Yes> |
| { |
| static void call(ExecutionEngine *, Bool, int); |
| }; |
| struct Q_QML_PRIVATE_EXPORT CreateMappedArgumentsObject : Method<Throws::No> |
| { |
| static ReturnedValue call(ExecutionEngine *); |
| }; |
| struct Q_QML_PRIVATE_EXPORT CreateUnmappedArgumentsObject : Method<Throws::No> |
| { |
| static ReturnedValue call(ExecutionEngine *); |
| }; |
| struct Q_QML_PRIVATE_EXPORT CreateRestParameter : PureMethod |
| { |
| static ReturnedValue call(ExecutionEngine *, int); |
| }; |
| |
| /* literals */ |
| struct Q_QML_PRIVATE_EXPORT ArrayLiteral : Method<Throws::Yes> |
| { |
| static ReturnedValue call(ExecutionEngine *, Value[], uint); |
| }; |
| struct Q_QML_PRIVATE_EXPORT ObjectLiteral : Method<Throws::Yes> |
| { |
| static ReturnedValue call(ExecutionEngine *, int, Value[], int); |
| }; |
| struct Q_QML_PRIVATE_EXPORT CreateClass : Method<Throws::Yes> |
| { |
| static ReturnedValue call(ExecutionEngine *, int, const Value &, Value[]); |
| }; |
| |
| /* for-in, for-of and array destructuring */ |
| struct Q_QML_PRIVATE_EXPORT GetIterator : Method<Throws::Yes> |
| { |
| static ReturnedValue call(ExecutionEngine *, const Value &, int); |
| }; |
| struct Q_QML_PRIVATE_EXPORT IteratorNext : IteratorMethod |
| { |
| static ReturnedValue call(ExecutionEngine *, const Value &, Value *); |
| }; |
| struct Q_QML_PRIVATE_EXPORT IteratorNextForYieldStar : IteratorMethod |
| { |
| static ReturnedValue call(ExecutionEngine *, const Value &, const Value &, Value *); |
| }; |
| struct Q_QML_PRIVATE_EXPORT IteratorClose : Method<Throws::Yes> |
| { |
| static ReturnedValue call(ExecutionEngine *, const Value &, const Value &); |
| }; |
| struct Q_QML_PRIVATE_EXPORT DestructureRestElement : Method<Throws::Yes> |
| { |
| static ReturnedValue call(ExecutionEngine *, const Value &); |
| }; |
| |
| /* conversions */ |
| struct Q_QML_PRIVATE_EXPORT ToObject : Method<Throws::Yes> |
| { |
| static ReturnedValue call(ExecutionEngine *, const Value &); |
| }; |
| struct Q_QML_PRIVATE_EXPORT ToBoolean : PureMethod |
| { |
| static Bool call(const Value &); |
| }; |
| struct Q_QML_PRIVATE_EXPORT ToNumber : Method<Throws::Yes> |
| { |
| static ReturnedValue call(ExecutionEngine *, const Value &); |
| }; |
| /* unary operators */ |
| struct Q_QML_PRIVATE_EXPORT UMinus : Method<Throws::Yes> |
| { |
| static ReturnedValue call(const Value &); |
| }; |
| |
| /* binary operators */ |
| struct Q_QML_PRIVATE_EXPORT Instanceof : Method<Throws::Yes> |
| { |
| static ReturnedValue call(ExecutionEngine *, const Value &, const Value &); |
| }; |
| struct Q_QML_PRIVATE_EXPORT In : Method<Throws::Yes> |
| { |
| static ReturnedValue call(ExecutionEngine *, const Value &, const Value &); |
| }; |
| struct Q_QML_PRIVATE_EXPORT Add : Method<Throws::Yes> |
| { |
| static ReturnedValue call(ExecutionEngine *, const Value &, const Value &); |
| }; |
| struct Q_QML_PRIVATE_EXPORT Sub : Method<Throws::Yes> |
| { |
| static ReturnedValue call(const Value &, const Value &); |
| }; |
| struct Q_QML_PRIVATE_EXPORT Mul : Method<Throws::Yes> |
| { |
| static ReturnedValue call(const Value &, const Value &); |
| }; |
| struct Q_QML_PRIVATE_EXPORT Div : Method<Throws::Yes> |
| { |
| static ReturnedValue call(const Value &, const Value &); |
| }; |
| struct Q_QML_PRIVATE_EXPORT Mod : Method<Throws::Yes> |
| { |
| static ReturnedValue call(const Value &, const Value &); |
| }; |
| struct Q_QML_PRIVATE_EXPORT Exp : Method<Throws::Yes> |
| { |
| static ReturnedValue call(const Value &, const Value &); |
| }; |
| struct Q_QML_PRIVATE_EXPORT BitAnd : Method<Throws::Yes> |
| { |
| static ReturnedValue call(const Value &, const Value &); |
| }; |
| struct Q_QML_PRIVATE_EXPORT BitOr : Method<Throws::Yes> |
| { |
| static ReturnedValue call(const Value &, const Value &); |
| }; |
| struct Q_QML_PRIVATE_EXPORT BitXor : Method<Throws::Yes> |
| { |
| static ReturnedValue call(const Value &, const Value &); |
| }; |
| struct Q_QML_PRIVATE_EXPORT Shl : Method<Throws::Yes> |
| { |
| static ReturnedValue call(const Value &, const Value &); |
| }; |
| struct Q_QML_PRIVATE_EXPORT Shr : Method<Throws::Yes> |
| { |
| static ReturnedValue call(const Value &, const Value &); |
| }; |
| struct Q_QML_PRIVATE_EXPORT UShr : Method<Throws::Yes> |
| { |
| static ReturnedValue call(const Value &, const Value &); |
| }; |
| struct Q_QML_PRIVATE_EXPORT GreaterThan : Method<Throws::Yes> |
| { |
| static ReturnedValue call(const Value &, const Value &); |
| }; |
| struct Q_QML_PRIVATE_EXPORT LessThan : Method<Throws::Yes> |
| { |
| static ReturnedValue call(const Value &, const Value &); |
| }; |
| struct Q_QML_PRIVATE_EXPORT GreaterEqual : Method<Throws::Yes> |
| { |
| static ReturnedValue call(const Value &, const Value &); |
| }; |
| struct Q_QML_PRIVATE_EXPORT LessEqual : Method<Throws::Yes> |
| { |
| static ReturnedValue call(const Value &, const Value &); |
| }; |
| struct Q_QML_PRIVATE_EXPORT Equal : Method<Throws::Yes> |
| { |
| static ReturnedValue call(const Value &, const Value &); |
| }; |
| struct Q_QML_PRIVATE_EXPORT NotEqual : Method<Throws::Yes> |
| { |
| static ReturnedValue call(const Value &, const Value &); |
| }; |
| struct Q_QML_PRIVATE_EXPORT StrictEqual : Method<Throws::Yes> |
| { |
| static ReturnedValue call(const Value &, const Value &); |
| }; |
| struct Q_QML_PRIVATE_EXPORT StrictNotEqual : Method<Throws::Yes> |
| { |
| static ReturnedValue call(const Value &, const Value &); |
| }; |
| |
| /* comparisons */ |
| struct Q_QML_PRIVATE_EXPORT CompareGreaterThan : Method<Throws::Yes> |
| { |
| static Bool call(const Value &, const Value &); |
| }; |
| struct Q_QML_PRIVATE_EXPORT CompareLessThan : Method<Throws::Yes> |
| { |
| static Bool call(const Value &, const Value &); |
| }; |
| struct Q_QML_PRIVATE_EXPORT CompareGreaterEqual : Method<Throws::Yes> |
| { |
| static Bool call(const Value &, const Value &); |
| }; |
| struct Q_QML_PRIVATE_EXPORT CompareLessEqual : Method<Throws::Yes> |
| { |
| static Bool call(const Value &, const Value &); |
| }; |
| struct Q_QML_PRIVATE_EXPORT CompareEqual : Method<Throws::Yes> |
| { |
| static Bool call(const Value &, const Value &); |
| }; |
| struct Q_QML_PRIVATE_EXPORT CompareNotEqual : Method<Throws::Yes> |
| { |
| static Bool call(const Value &, const Value &); |
| }; |
| struct Q_QML_PRIVATE_EXPORT CompareStrictEqual : Method<Throws::Yes> |
| { |
| static Bool call(const Value &, const Value &); |
| }; |
| struct Q_QML_PRIVATE_EXPORT CompareStrictNotEqual : Method<Throws::Yes> |
| { |
| static Bool call(const Value &, const Value &); |
| }; |
| |
| struct Q_QML_PRIVATE_EXPORT CompareInstanceof : Method<Throws::Yes> |
| { |
| static Bool call(ExecutionEngine *, const Value &, const Value &); |
| }; |
| struct Q_QML_PRIVATE_EXPORT CompareIn : Method<Throws::Yes> |
| { |
| static Bool call(ExecutionEngine *, const Value &, const Value &); |
| }; |
| |
| struct Q_QML_PRIVATE_EXPORT RegexpLiteral : PureMethod |
| { |
| static ReturnedValue call(ExecutionEngine *, int); |
| }; |
| struct Q_QML_PRIVATE_EXPORT GetTemplateObject : PureMethod |
| { |
| static ReturnedValue call(Function *, int); |
| }; |
| |
| struct StackOffsets { |
| static const int tailCall_function = -1; |
| static const int tailCall_thisObject = -2; |
| static const int tailCall_argv = -3; |
| static const int tailCall_argc = -4; |
| }; |
| }; |
| |
| static_assert(std::is_standard_layout<Runtime>::value, "Runtime needs to be standard layout in order for us to be able to use offsetof"); |
| static_assert(sizeof(Runtime::BinaryOperation) == sizeof(void*), "JIT expects a function pointer to fit into a regular pointer, for cross-compilation offset translation"); |
| |
| } // namespace QV4 |
| |
| QT_END_NAMESPACE |
| |
| #endif // QV4RUNTIMEAPI_P_H |