File: jvminterpreter.h

package info (click to toggle)
kross-interpreters 4%3A22.12.3-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 1,488 kB
  • sloc: cpp: 12,206; java: 560; python: 375; ruby: 323; xml: 53; ansic: 38; makefile: 7
file content (176 lines) | stat: -rw-r--r-- 7,019 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
/***************************************************************************
 * jvminterpreter.h
 * This file is part of the KDE project
 *
 * copyright (C)2007 by Vincent Verhoeven <verhoevenv@gmail.com>
 * copyright (C)2007 by Sebastian Sauer <mail@dipe.org>
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Library General Public
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Library General Public License for more details.
 * You should have received a copy of the GNU Library General Public License
 * along with this program; see the file COPYING.  If not, write to
 * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
 * Boston, MA 02110-1301, USA.
 ***************************************************************************/

#ifndef KROSS_JVMINTERPRETER_H
#define KROSS_JVMINTERPRETER_H

#include "jvmconfig.h"

#include <kross/core/interpreter.h>

#include <QString>

namespace Kross {

    // Forward declarations.
    class Script;
    class Action;
    class JVMScript;
    class JVMModule;
    class JVMExtension;
    class JVMInterpreterPrivate;

    /**
    * The JVMInterpreter class implements a \a Kross::Interpreter for
    * the Java backend. At each time there exist exactly one instance
    * of the interpreter.
    */
    class JVMInterpreter : public Interpreter
    {
        public:

            /**
            * Constructor.
            * \param info the \a InterpreterInfo instance the Kross core
            * uses to provide details about the Java-interpreter without
            * actualy loading the krossjava library.
            */
            explicit JVMInterpreter(InterpreterInfo* info);

            /**
            * Destructor.
            */
            virtual ~JVMInterpreter();

            /**
            * Factory method that returns a \a JVMScript instance. There
            * can be 0..n instances of \a JVMScript around where each of
            * them represents an independend java project.
            *
            * \param action The \a Kross::Action that contains details
            * about the actual Java code we got e.g. from an application
            * that uses Kross.
            * \return The new \a JVMScript instance that implements a
            * abstract script container for the java language.
            */
            virtual Script* createScript(Action* action);

            /**
            * \return A valid JNIEnv that can be used in the current thread.
            */
            static JNIEnv* getEnv();

            /**
            * \return The Java Virtual Machine used to run the Java code.
            */
            static JavaVM* getJVM();

            /**
            * Defines a new Java class. This can be used in two ways:
            * either by passing in the bytecode of a Java class, or the
            * data of a JAR file.
            *
            * \param name The name by which to register this class. This is
            * used to prevent double definitions of the same code.
            * \param data The Java bytecode that makes up this class or
            * the raw contents of a JAR file.
            * \return The Java class name of the executable script, or the
            * empty string "" if none could be found. For class data, this
            * returns the (real) classname, for JAR data, it returns the
            * value of the "Kross-Main" attribute in the manifest.
            */
            static QString addClass(const QString& name, const QByteArray& data);

            /**
            * Adds a URL to the Java classpath.
            *
            * \param url A URL to add to the search path when looking for
            * class definitions.
            */
            static void addToCP(const QUrl& url);

            /**
            * Creates a new Java object of the given class. If an exception
            * occurred, it will be handled.
            *
            * \param name The name of a Java class.
            * \return A new object of the given class, or NULL if an
            * exception was thrown while attempting to create the object.
            */
            static jobject newObject(const QString& name);

            /**
            * Registers a \a JVMExtension. This creates a Java object to
            * mirror the C object and stores the links between the
            * involved objects.
            *
            * \param name The name of the extension.
            * \param obj The JVMExtension to bridge to Java.
            * \param clazz The raw data of the Java class.
            * \param wrapped The QObject wrapped by \p obj.
            * \return A KrossQExtension mirrorring the JVMExtension in Java.
            */
            static jobject addExtension(const QString& name, const JVMExtension* obj, const QByteArray& clazz, const QObject* wrapped);

            /**
            * Returns the registered JVMExtension associated to a QObject.
            * \param obj A bridged QObject.
            * \return The JVMExtension associated with this QObject, or 0
            * if none could be found.
            */
            static const JVMExtension* extension(const QObject* obj);

            /**
            * Checks to see if an exception has occurred in the Java world.
            * If so, it clears the exception state and prints out the
            * stacktrace of the thrown exception.
            *
            * \return True if an exception occurred, false if not.
            */
            static bool handleException();
#ifdef KROSS_JVM_INTERPRETER_DEBUG
            /**
            * Prints some debug information about a Java object. Printed
            * are the toString() method and the runtime class.
            *
            * \param obj A Java object to know more about.
            */
            static void showDebugInfo(jobject obj);
#endif

        private:
            /// \internal d-pointer class.
            class Private;

            //TODO: is it okay for a d-pointer to be static?
            //sebsauer: normaly it isn't since if there are multiple instances of the JVMInterpreter
            //          around they would need to share it. While in our case the JVMInterpreter class
            //          is a singleton and therefore static should be ok, it may better to use
            //          K_GLOBAL_STATIC ( http://www.englishbreakfastnetwork.org/apidocs/apidox-kde-4.0/kdelibs-apidocs/kdecore/html/group__KDEMacros.html#g75ca0c60b03dc5e4f9427263bf4043c7 )
            //          but JNIEnv* shouldn't be static anyway.

            /// \internal d-pointer instance.
            static Private * const d;
    };

}

#endif