* src/toolbox/sequence.hpp: Added new file to hold sequence builder class.
[cacao.git] / src / native / vm / nativevm.cpp
1 /* src/native/vm/nativevm.cpp - Register native VM interface functions.
2
3    Copyright (C) 2007, 2008
4    CACAOVM - Verein zur Foerderung der freien virtuellen Maschine CACAO
5
6    This file is part of CACAO.
7
8    This program is free software; you can redistribute it and/or
9    modify it under the terms of the GNU General Public License as
10    published by the Free Software Foundation; either version 2, or (at
11    your option) any later version.
12
13    This program is distributed in the hope that it will be useful, but
14    WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16    General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with this program; if not, write to the Free Software
20    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21    02110-1301, USA.
22
23 */
24
25
26 #include "config.h"
27
28 #include <stdint.h>
29
30 #include "native/vm/nativevm.hpp"
31
32 #include "vm/class.hpp"
33 #include "vm/exceptions.hpp"
34 #include "vm/initialize.hpp"
35 #include "vm/method.hpp"
36 #include "vm/options.h"
37 #include "vm/os.hpp"
38
39 #if defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
40 # include "mm/memory.hpp"
41
42 # include "native/native.hpp"
43
44 # include "native/vm/openjdk/hpi.hpp"
45
46 # include "toolbox/sequence.hpp"
47
48 # include "vm/globals.hpp"
49 # include "vm/properties.hpp"
50 # include "vm/utf8.h"
51 # include "vm/vm.hpp"
52 #endif
53
54
55 /* nativevm_preinit ************************************************************
56
57    Pre-initialize the implementation specific native stuff.
58
59 *******************************************************************************/
60
61 void nativevm_preinit(void)
62 {
63         TRACESUBSYSTEMINITIALIZATION("nativevm_preinit");
64
65         /* Register native methods of all classes implemented. */
66
67 #if defined(ENABLE_JAVASE)
68 # if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
69
70         _Jv_gnu_classpath_VMStackWalker_init();
71         _Jv_gnu_classpath_VMSystemProperties_init();
72         _Jv_gnu_java_lang_VMCPStringBuilder_init();
73         _Jv_gnu_java_lang_management_VMClassLoadingMXBeanImpl_init();
74         _Jv_gnu_java_lang_management_VMMemoryMXBeanImpl_init();
75         _Jv_gnu_java_lang_management_VMRuntimeMXBeanImpl_init();
76         _Jv_gnu_java_lang_management_VMThreadMXBeanImpl_init();
77         _Jv_java_lang_VMClass_init();
78         _Jv_java_lang_VMClassLoader_init();
79         _Jv_java_lang_VMObject_init();
80         _Jv_java_lang_VMRuntime_init();
81         _Jv_java_lang_VMSystem_init();
82         _Jv_java_lang_VMString_init();
83         _Jv_java_lang_VMThread_init();
84         _Jv_java_lang_VMThrowable_init();
85         _Jv_java_lang_management_VMManagementFactory_init();
86         _Jv_java_lang_reflect_VMConstructor_init();
87         _Jv_java_lang_reflect_VMField_init();
88         _Jv_java_lang_reflect_VMMethod_init();
89         //_Jv_java_lang_reflect_VMProxy_init();
90         _Jv_java_security_VMAccessController_init();
91         _Jv_java_util_concurrent_atomic_AtomicLong_init();
92         _Jv_sun_misc_Unsafe_init();
93
94 #if defined(ENABLE_ANNOTATIONS)
95         _Jv_sun_reflect_ConstantPool_init();
96 #endif
97
98 # elif defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
99
100         // Load libjava.so
101         VM* vm = VM::get_current();
102         Properties& properties = vm->get_properties();
103         const char* boot_library_path = properties.get("sun.boot.library.path");
104
105         // Use sequence builder to assemble library path.
106         SequenceBuilder sb;
107
108         sb.cat(boot_library_path);
109         sb.cat("/libjava.so");
110
111         // XXX This should actually be sb.export_symbol()
112         utf* u = utf_new_char(sb.c_str());
113
114         NativeLibrary nl(u);
115         void* handle = nl.open();
116
117         if (handle == NULL)
118                 os::abort("nativevm_init: failed to open libjava.so at: %s", sb.c_str());
119
120         NativeLibraries& nls = vm->get_nativelibraries();
121         nls.add(nl);
122
123         // Initialize the HPI.
124         HPI& hpi = vm->get_hpi();
125         hpi.initialize();
126
127         _Jv_sun_misc_Unsafe_init();
128
129 # else
130 #  error unknown classpath configuration
131 # endif
132
133 #elif defined(ENABLE_JAVAME_CLDC1_1)
134
135         _Jv_com_sun_cldc_io_ResourceInputStream_init();
136         _Jv_com_sun_cldc_io_j2me_socket_Protocol_init();
137         _Jv_com_sun_cldchi_io_ConsoleOutputStream_init();
138         _Jv_com_sun_cldchi_jvm_JVM_init();
139         _Jv_java_lang_Class_init();
140         _Jv_java_lang_Double_init();
141         _Jv_java_lang_Float_init();
142         _Jv_java_lang_Math_init();
143         _Jv_java_lang_Object_init();
144         _Jv_java_lang_Runtime_init();
145         _Jv_java_lang_String_init();
146         _Jv_java_lang_System_init();
147         _Jv_java_lang_Thread_init();
148         _Jv_java_lang_Throwable_init();
149
150 #else
151 # error unknown Java configuration
152 #endif
153 }
154
155
156 /* nativevm_init ***************************************************************
157
158    Initialize the implementation specific native stuff.
159
160 *******************************************************************************/
161
162 bool nativevm_init(void)
163 {
164         TRACESUBSYSTEMINITIALIZATION("nativevm_init");
165
166 #if defined(ENABLE_JAVASE)
167
168 # if defined(WITH_JAVA_RUNTIME_LIBRARY_GNU_CLASSPATH)
169
170         // Nothing to do.
171
172 # elif defined(WITH_JAVA_RUNTIME_LIBRARY_OPENJDK)
173
174         methodinfo* m = class_resolveclassmethod(class_java_lang_System,
175                                                                                          utf_new_char("initializeSystemClass"),
176                                                                                          utf_void__void,
177                                                                                          class_java_lang_Object,
178                                                                                          false);
179
180         if (m == NULL)
181                 return false;
182
183         (void) vm_call_method(m, NULL);
184
185         if (exceptions_get_exception() != NULL)
186                 return false;
187
188 # else
189 #  error unknown classpath configuration
190 # endif
191
192 #elif defined(ENABLE_JAVAME_CLDC1_1)
193
194         // Nothing to do.
195
196 #else
197 # error unknown Java configuration
198 #endif
199
200         return true;
201 }
202
203
204 /*
205  * These are local overrides for various environment variables in Emacs.
206  * Please do not remove this and leave it at the end of the file, where
207  * Emacs will automagically detect them.
208  * ---------------------------------------------------------------------
209  * Local variables:
210  * mode: c++
211  * indent-tabs-mode: t
212  * c-basic-offset: 4
213  * tab-width: 4
214  * End:
215  * vim:noexpandtab:sw=4:ts=4:
216  */