* src/native/vm/openjdk/jvm.cpp (JVM_CurrentClassLoader): Implemented.
[cacao.git] / src / vm / javaobjects.cpp
1 /* src/vm/javaobjects.cpp - functions to create and access Java objects
2
3    Copyright (C) 2008, 2009 Theobroma Systems Ltd.
4
5    This file is part of CACAO.
6
7    This program is free software; you can redistribute it and/or
8    modify it under the terms of the GNU General Public License as
9    published by the Free Software Foundation; either version 2, or (at
10    your option) any later version.
11
12    This program is distributed in the hope that it will be useful, but
13    WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15    General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with this program; if not, write to the Free Software
19    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
20    02110-1301, USA.
21
22 */
23
24
25 #include "config.h"
26
27 #include <stdint.h>
28
29 #include "native/vm/reflection.hpp"
30
31 #include "vm/access.hpp"
32 #include "vm/jit/builtin.hpp"
33 #include "vm/global.h"
34 #include "vm/globals.hpp"
35 #include "vm/initialize.hpp"
36 #include "vm/javaobjects.hpp"
37
38
39 #if defined(ENABLE_JAVASE)
40
41 /**
42  * Invokes the static Java method getSystemClassLoader().
43  *
44  * @return Return value of the invocation or NULL in
45  * case of an exception.
46  */
47 java_handle_t* java_lang_ClassLoader::invoke_getSystemClassLoader()
48 {
49         methodinfo    *m;
50         java_handle_t *clo;
51         classloader_t *cl;
52
53         assert(class_java_lang_Object);
54         assert(class_java_lang_ClassLoader);
55         assert(class_java_lang_ClassLoader->state & CLASS_LINKED);
56
57         m = class_resolveclassmethod(class_java_lang_ClassLoader,
58                                                                  utf_getSystemClassLoader,
59                                                                  utf_void__java_lang_ClassLoader,
60                                                                  class_java_lang_Object,
61                                                                  false);
62
63         if (m == NULL)
64                 return NULL;
65
66         clo = vm_call_method(m, NULL);
67
68         if (clo == NULL)
69                 return NULL;
70
71         cl = loader_hashtable_classloader_add(clo);
72
73         return cl;
74 }
75
76
77 /**
78  * Constructs a Java object with the given
79  * java.lang.reflect.Constructor.
80  *
81  * @param args     Constructor arguments.
82  *
83  * @return Handle to Java object.
84  */
85 java_handle_t* java_lang_reflect_Constructor::new_instance(java_handle_objectarray_t* args)
86 {
87         methodinfo* m = get_method();
88
89         // Should we bypass security the checks (AccessibleObject)?
90         if (get_override() == false) {
91                 /* This method is always called like this:
92                        [0] java.lang.reflect.Constructor.constructNative (Native Method)
93                        [1] java.lang.reflect.Constructor.newInstance
94                        [2] <caller>
95                 */
96
97                 if (!access_check_method(m, 2))
98                         return NULL;
99         }
100
101         // Create a Java object.
102         java_handle_t* h = builtin_new(m->clazz);
103
104         if (h == NULL)
105                 return NULL;
106
107         // Call initializer.
108         (void) Reflection::invoke(m, h, args);
109
110         return h;
111 }
112
113
114 /**
115  * Invokes the given method.
116  *
117  * @param args Method arguments.
118  *
119  * @return return value of the method
120  */
121 java_handle_t* java_lang_reflect_Method::invoke(java_handle_t* o, java_handle_objectarray_t* args)
122 {
123         methodinfo* m = get_method();
124
125         // Should we bypass security the checks (AccessibleObject)?
126         if (get_override() == false) {
127 #if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
128                 /* This method is always called like this:
129                        [0] java.lang.reflect.Method.invokeNative (Native Method)
130                        [1] java.lang.reflect.Method.invoke (Method.java:329)
131                        [2] <caller>
132                 */
133
134                 if (!access_check_method(m, 2))
135                         return NULL;
136 #elif defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
137                 /* We only pass 1 here as stacktrace_get_caller_class, which
138                    is called from access_check_method, skips
139                    java.lang.reflect.Method.invoke(). */
140
141                 if (!access_check_method(m, 1))
142                         return NULL;
143 #else
144 # error unknown classpath configuration
145 #endif
146         }
147
148         // Check if method class is initialized.
149         if (!(m->clazz->state & CLASS_INITIALIZED))
150                 if (!initialize_class(m->clazz))
151                         return NULL;
152
153         // Call the Java method.
154         java_handle_t* result = Reflection::invoke(m, o, args);
155
156         return result;
157 }
158
159 #endif // ENABLE_JAVASE
160
161
162 /*
163  * These are local overrides for various environment variables in Emacs.
164  * Please do not remove this and leave it at the end of the file, where
165  * Emacs will automagically detect them.
166  * ---------------------------------------------------------------------
167  * Local variables:
168  * mode: c++
169  * indent-tabs-mode: t
170  * c-basic-offset: 4
171  * tab-width: 4
172  * End:
173  */