* merged default branch into jitcache-arm-x86 branch
[cacao.git] / src / vm / javaobjects.cpp
1 /* src/vm/javaobjects.cpp - functions to create and access Java objects
2
3    Copyright (C) 2008 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.h"
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  * Constructs a Java object with the given
43  * java.lang.reflect.Constructor.
44  *
45  * @param args     Constructor arguments.
46  *
47  * @return Handle to Java object.
48  */
49 java_handle_t* java_lang_reflect_Constructor::new_instance(java_handle_objectarray_t* args)
50 {
51         methodinfo* m = get_method();
52
53         // Should we bypass security the checks (AccessibleObject)?
54         if (get_override() == false) {
55                 /* This method is always called like this:
56                        [0] java.lang.reflect.Constructor.constructNative (Native Method)
57                        [1] java.lang.reflect.Constructor.newInstance
58                        [2] <caller>
59                 */
60
61                 if (!access_check_method(m, 2))
62                         return NULL;
63         }
64
65         // Create a Java object.
66         java_handle_t* h = builtin_new(m->clazz);
67
68         if (h == NULL)
69                 return NULL;
70         
71         // Call initializer.
72         (void) Reflection::invoke(m, h, args);
73
74         return h;
75 }
76
77
78 /**
79  * Invokes the given method.
80  *
81  * @param args Method arguments.
82  *
83  * @return return value of the method
84  */
85 java_handle_t* java_lang_reflect_Method::invoke(java_handle_t* o, 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 #if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
92                 /* This method is always called like this:
93                        [0] java.lang.reflect.Method.invokeNative (Native Method)
94                        [1] java.lang.reflect.Method.invoke (Method.java:329)
95                        [2] <caller>
96                 */
97
98                 if (!access_check_method(m, 2))
99                         return NULL;
100 #elif defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
101                 /* We only pass 1 here as stacktrace_get_caller_class, which
102                    is called from access_check_method, skips
103                    java.lang.reflect.Method.invoke(). */
104
105                 if (!access_check_method(m, 1))
106                         return NULL;
107 #else
108 # error unknown classpath configuration
109 #endif
110         }
111
112         // Check if method class is initialized.
113         if (!(m->clazz->state & CLASS_INITIALIZED))
114                 if (!initialize_class(m->clazz))
115                         return NULL;
116
117         // Call the Java method.
118         java_handle_t* result = Reflection::invoke(m, o, args);
119
120         return result;
121 }
122
123 #endif // ENABLE_JAVASE
124
125
126 /*
127  * These are local overrides for various environment variables in Emacs.
128  * Please do not remove this and leave it at the end of the file, where
129  * Emacs will automagically detect them.
130  * ---------------------------------------------------------------------
131  * Local variables:
132  * mode: c++
133  * indent-tabs-mode: t
134  * c-basic-offset: 4
135  * tab-width: 4
136  * End:
137  */