From 49670800d439a5e28a6f1527b15b0dc21502a1d7 Mon Sep 17 00:00:00 2001 From: Lars Knoll Date: Fri, 9 Aug 2013 14:26:39 +0200 Subject: [PATCH] Add initial draft of the compiled data structures for JS and QML To be able to cleanly separate the compilation stage from the runtime, the compiler will create a read-only data structure, that is described in this file. This will later on also allow us to fully compile JS and QML in separate threads, and longer term replace the qqmlcompiler/vme infrastructure. Change-Id: Iafe6d527c0994c3bc17ba1630959ffd32cc74067 Reviewed-by: Simon Hausmann --- src/qml/compiler/qv4compileddata_p.h | 221 +++++++++++++++++++++++++++++++++++ 1 file changed, 221 insertions(+) create mode 100644 src/qml/compiler/qv4compileddata_p.h diff --git a/src/qml/compiler/qv4compileddata_p.h b/src/qml/compiler/qv4compileddata_p.h new file mode 100644 index 0000000..9fcae5f --- /dev/null +++ b/src/qml/compiler/qv4compileddata_p.h @@ -0,0 +1,221 @@ +/**************************************************************************** +** +** Copyright (C) 2013 Digia Plc and/or its subsidiary(-ies). +** Contact: http://www.qt-project.org/legal +** +** 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 Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/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 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ +#ifndef QV4COMPILEDDATA_P_H +#define QV4COMPILEDDATA_P_H + +#include + +QT_BEGIN_NAMESPACE + +namespace QV4 { + +struct ExecutionContext; + +namespace CompiledData { + +static const char magic_str[] = "qv4cdata"; + +struct Header +{ + char magic[8]; + qint16 architecture; + qint16 version; + + enum { + IsJavascript = 0x1, + IsQml = 0x2 + }; + quint32 flags; +}; + +struct Function +{ + Value (*code)(ExecutionContext *, const uchar *); + quint32 offsetToName; + qint64 flags; // strict, etc. + quint32 nFormals; + quint32 formalsOffset; + quint32 nLocals; + quint32 localsOffset; + quint32 nInnerFunctions; + quint32 innerFunctionsOffset; +// quint32 offsetForFormals[nFormals] +// quint32 offsetForLocals[nLocals] +// quint32 offsetForInnerFunctions[nInnerFunctions] +// Function[nInnerFunctions] +}; + +struct String +{ + quint32 hash; + quint32 flags; // isArrayIndex + QArrayData str; + // uint16 strdata[] +}; + + +struct JSUnit +{ + Header header; + Function entry; + // String stringTable; +}; + + +// Qml data structures + +struct Value +{ + quint32 type; // Invalid, Boolean, Number, String, Function, Object, ListOfObjects + union { + bool b; + int i; + double d; + quint32 offsetToString; + quint32 offsetToFunction; + quint32 offsetToObject; + }; +}; + +struct Binding +{ + quint32 offsetToPropertyName; + Value value; +}; + +struct Parameter +{ + quint32 offsetToName; + quint32 type; + quint32 offsetToCustomTypeName; + quint32 reserved; +}; + +struct Signal +{ + quint32 offsetToName; + quint32 nParameters; + Parameter parameters[1]; +}; + +struct Property +{ + quint32 offsetToName; + quint32 type; + quint32 offsetToCustomTypeName; + quint32 flags; // default, readonly + Value value; +}; + +struct Object +{ + quint32 offsetToInheritedTypeName; + quint32 offsetToId; + quint32 offsetToDefaultProperty; + quint32 nFunctions; + quint32 offsetToFunctions; + quint32 nProperties; + quint32 offsetToProperties; + quint32 nSignals; + quint32 offsetToSignals; + quint32 nBindings; + quint32 offsetToBindings; +// Function[] +// Property[] +// Signal[] +// Binding[] +}; + +struct Imports +{ +}; + + +struct QmlUnit +{ + Header header; + int offsetToTypeName; + Imports imports; + Object object; +}; + +// This is how this hooks into the existing structures: + +//VM::Function +// CompilationUnit * (for functions that need to clean up) +// CompiledData::Function *compiledFunction + +struct CompilationUnit +{ + virtual ~CompilationUnit(); + Header *data; + + // ### runtime data + // pointer to qml data for QML unit +}; + +struct MasmCompilationUnit : public CompilationUnit +{ + virtual ~MasmCompilationUnit() { + // free all jitted code + } + + // Coderef + execution engine + +}; + +struct MothCompilationUnit : public CompilationUnit +{ + virtual ~MothCompilationUnit() { + // free all bytecode + } + + // vector of bytecode + +}; + +} + +} + +QT_END_NAMESPACE + +#endif -- 2.7.4