8e7e6cd148b284df9b7e606a2bb0025d38a2edc2
[cacao.git] / src / native / vm / gnuclasspath / java_lang_VMClass.cpp
1 /* src/native/vm/gnuclasspath/java_lang_VMClass.cpp
2
3    Copyright (C) 2006, 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/jni.h"
31 #include "native/llni.h"
32 #include "native/native.h"
33
34 // FIXME
35 //#include "native/include/java_lang_VMClass.h"
36
37 #include "vm/exceptions.hpp"
38 #include "vm/initialize.h"
39 #include "vm/string.hpp"
40
41 #include "vmcore/class.h"
42 #include "vmcore/globals.hpp"
43 #include "vmcore/javaobjects.hpp"
44
45 #if defined(ENABLE_ANNOTATIONS)
46 #include "vm/vm.hpp"
47
48 #include "vmcore/annotation.h"
49 #endif
50
51
52 // Native functions are exported as C functions.
53 extern "C" {
54
55 /*
56  * Class:     java/lang/VMClass
57  * Method:    isInstance
58  * Signature: (Ljava/lang/Class;Ljava/lang/Object;)Z
59  */
60 JNIEXPORT jboolean JNICALL Java_java_lang_VMClass_isInstance(JNIEnv *env, jclass clazz, jclass klass, jobject o)
61 {
62         classinfo     *c;
63         java_handle_t *h;
64
65         c = LLNI_classinfo_unwrap(klass);
66         h = (java_handle_t *) o;
67
68         return class_is_instance(c, h);
69 }
70
71
72 /*
73  * Class:     java/lang/VMClass
74  * Method:    isAssignableFrom
75  * Signature: (Ljava/lang/Class;Ljava/lang/Class;)Z
76  */
77 JNIEXPORT jboolean JNICALL Java_java_lang_VMClass_isAssignableFrom(JNIEnv *env, jclass clazz, jclass klass, jclass c)
78 {
79         classinfo *to;
80         classinfo *from;
81
82         to   = LLNI_classinfo_unwrap(klass);
83         from = LLNI_classinfo_unwrap(c);
84
85         if (from == NULL) {
86                 exceptions_throw_nullpointerexception();
87                 return 0;
88         }
89
90         return class_is_assignable_from(to, from);
91 }
92
93
94 /*
95  * Class:     java/lang/VMClass
96  * Method:    isInterface
97  * Signature: (Ljava/lang/Class;)Z
98  */
99 JNIEXPORT jboolean JNICALL Java_java_lang_VMClass_isInterface(JNIEnv *env, jclass clazz, jclass klass)
100 {
101         classinfo *c;
102
103         c = LLNI_classinfo_unwrap(klass);
104
105         return class_is_interface(c);
106 }
107
108
109 /*
110  * Class:     java/lang/VMClass
111  * Method:    isPrimitive
112  * Signature: (Ljava/lang/Class;)Z
113  */
114 JNIEXPORT jboolean JNICALL Java_java_lang_VMClass_isPrimitive(JNIEnv *env, jclass clazz, jclass klass)
115 {
116         classinfo *c;
117
118         c = LLNI_classinfo_unwrap(klass);
119
120         return class_is_primitive(c);
121 }
122
123
124 /*
125  * Class:     java/lang/VMClass
126  * Method:    getName
127  * Signature: (Ljava/lang/Class;)Ljava/lang/String;
128  */
129 JNIEXPORT jstring JNICALL Java_java_lang_VMClass_getName(JNIEnv *env, jclass clazz, jclass klass)
130 {
131         classinfo* c;
132
133         c = LLNI_classinfo_unwrap(klass);
134
135         return (jstring) class_get_classname(c);
136 }
137
138
139 /*
140  * Class:     java/lang/VMClass
141  * Method:    getSuperclass
142  * Signature: (Ljava/lang/Class;)Ljava/lang/Class;
143  */
144 JNIEXPORT jclass JNICALL Java_java_lang_VMClass_getSuperclass(JNIEnv *env, jclass clazz, jclass klass)
145 {
146         classinfo *c;
147         classinfo *super;
148
149         c = LLNI_classinfo_unwrap(klass);
150
151         super = class_get_superclass(c);
152
153         return (jclass) LLNI_classinfo_wrap(super);
154 }
155
156
157 /*
158  * Class:     java/lang/VMClass
159  * Method:    getInterfaces
160  * Signature: (Ljava/lang/Class;)[Ljava/lang/Class;
161  */
162 JNIEXPORT jobjectArray JNICALL Java_java_lang_VMClass_getInterfaces(JNIEnv *env, jclass clazz, jclass klass)
163 {
164         classinfo                 *c;
165         java_handle_objectarray_t *oa;
166
167         c = LLNI_classinfo_unwrap(klass);
168
169         oa = class_get_interfaces(c);
170
171         return (jobjectArray) oa;
172 }
173
174
175 /*
176  * Class:     java/lang/VMClass
177  * Method:    getComponentType
178  * Signature: (Ljava/lang/Class;)Ljava/lang/Class;
179  */
180 JNIEXPORT jclass JNICALL Java_java_lang_VMClass_getComponentType(JNIEnv *env, jclass clazz, jclass klass)
181 {
182         classinfo *c;
183         classinfo *component;
184         
185         c = LLNI_classinfo_unwrap(klass);
186         
187         component = class_get_componenttype(c);
188
189         return (jclass) LLNI_classinfo_wrap(component);
190 }
191
192
193 /*
194  * Class:     java/lang/VMClass
195  * Method:    getModifiers
196  * Signature: (Ljava/lang/Class;Z)I
197  */
198 JNIEXPORT jint JNICALL Java_java_lang_VMClass_getModifiers(JNIEnv *env, jclass clazz, jclass klass, jboolean ignoreInnerClassesAttrib)
199 {
200         classinfo *c;
201         int32_t    flags;
202
203         c = LLNI_classinfo_unwrap(klass);
204
205         flags = class_get_modifiers(c, ignoreInnerClassesAttrib);
206
207         return flags;
208 }
209
210
211 /*
212  * Class:     java/lang/VMClass
213  * Method:    getDeclaringClass
214  * Signature: (Ljava/lang/Class;)Ljava/lang/Class;
215  */
216 JNIEXPORT jclass JNICALL Java_java_lang_VMClass_getDeclaringClass(JNIEnv *env, jclass clazz, jclass klass)
217 {
218         classinfo *c;
219         classinfo *dc;
220
221         c = LLNI_classinfo_unwrap(klass);
222
223         dc = class_get_declaringclass(c);
224
225         return (jclass) LLNI_classinfo_wrap(dc);
226 }
227
228
229 /*
230  * Class:     java/lang/VMClass
231  * Method:    getDeclaredClasses
232  * Signature: (Ljava/lang/Class;Z)[Ljava/lang/Class;
233  */
234 JNIEXPORT jobjectArray JNICALL Java_java_lang_VMClass_getDeclaredClasses(JNIEnv *env, jclass clazz, jclass klass, jboolean publicOnly)
235 {
236         classinfo                 *c;
237         java_handle_objectarray_t *oa;
238
239         c = LLNI_classinfo_unwrap(klass);
240
241         oa = class_get_declaredclasses(c, publicOnly);
242
243         return (jobjectArray) oa;
244 }
245
246
247 /*
248  * Class:     java/lang/VMClass
249  * Method:    getDeclaredFields
250  * Signature: (Ljava/lang/Class;Z)[Ljava/lang/reflect/Field;
251  */
252 JNIEXPORT jobjectArray JNICALL Java_java_lang_VMClass_getDeclaredFields(JNIEnv *env, jclass clazz, jclass klass, jboolean publicOnly)
253 {
254         classinfo                 *c;
255         java_handle_objectarray_t *oa;
256
257         c = LLNI_classinfo_unwrap(klass);
258
259         oa = class_get_declaredfields(c, publicOnly);
260
261         return (jobjectArray) oa;
262 }
263
264
265 /*
266  * Class:     java/lang/VMClass
267  * Method:    getDeclaredMethods
268  * Signature: (Ljava/lang/Class;Z)[Ljava/lang/reflect/Method;
269  */
270 JNIEXPORT jobjectArray JNICALL Java_java_lang_VMClass_getDeclaredMethods(JNIEnv *env, jclass clazz, jclass klass, jboolean publicOnly)
271 {
272         classinfo                 *c;
273         java_handle_objectarray_t *oa;
274
275         c = LLNI_classinfo_unwrap(klass);
276
277         oa = class_get_declaredmethods(c, publicOnly);
278
279         return (jobjectArray) oa;
280 }
281
282
283 /*
284  * Class:     java/lang/VMClass
285  * Method:    getDeclaredConstructors
286  * Signature: (Ljava/lang/Class;Z)[Ljava/lang/reflect/Constructor;
287  */
288 JNIEXPORT jobjectArray JNICALL Java_java_lang_VMClass_getDeclaredConstructors(JNIEnv *env, jclass clazz, jclass klass, jboolean publicOnly)
289 {
290         classinfo                 *c;
291         java_handle_objectarray_t *oa;
292
293         c = LLNI_classinfo_unwrap(klass);
294
295         oa = class_get_declaredconstructors(c, publicOnly);
296
297         return (jobjectArray) oa;
298 }
299
300
301 /*
302  * Class:     java/lang/VMClass
303  * Method:    getClassLoader
304  * Signature: (Ljava/lang/Class;)Ljava/lang/ClassLoader;
305  */
306 JNIEXPORT jobject JNICALL Java_java_lang_VMClass_getClassLoader(JNIEnv *env, jclass clazz, jclass klass)
307 {
308         classinfo     *c;
309         classloader_t *cl;
310
311         c  = LLNI_classinfo_unwrap(klass);
312         cl = class_get_classloader(c);
313
314         return (jobject) cl;
315 }
316
317
318 /*
319  * Class:     java/lang/VMClass
320  * Method:    forName
321  * Signature: (Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class;
322  */
323 JNIEXPORT jclass JNICALL Java_java_lang_VMClass_forName(JNIEnv *env, jclass clazz, jstring name, jboolean initialize, jobject loader)
324 {
325         classloader_t *cl;
326         utf           *ufile;
327         utf           *uname;
328         classinfo     *c;
329         char*          pos;
330         int32_t        i;
331
332         cl = loader_hashtable_classloader_add((java_handle_t *) loader);
333
334         /* illegal argument */
335
336         if (name == NULL) {
337                 exceptions_throw_nullpointerexception();
338                 return NULL;
339         }
340
341         /* create utf string in which '.' is replaced by '/' */
342
343         ufile = javastring_toutf((java_handle_t *) name, true);
344         uname = javastring_toutf((java_handle_t *) name, false);
345
346         /* name must not contain '/' (mauve test) */
347
348         // FIXME Move this check into a function.
349         for (i = 0, pos = uname->text; i < uname->blength; i++, pos++) {
350                 if (*pos == '/') {
351                         exceptions_throw_classnotfoundexception(uname);
352                         return NULL;
353                 }
354         }
355
356         /* try to load, ... */
357
358         c = load_class_from_classloader(ufile, cl);
359
360         if (c == NULL)
361             return NULL;
362
363         /* link, ... */
364
365         if (!link_class(c))
366                 return NULL;
367         
368         /* ...and initialize it, if required */
369
370         if (initialize)
371                 if (!initialize_class(c))
372                         return NULL;
373
374         return (jclass) LLNI_classinfo_wrap(c);
375 }
376
377
378 /*
379  * Class:     java/lang/VMClass
380  * Method:    isArray
381  * Signature: (Ljava/lang/Class;)Z
382  */
383 JNIEXPORT jboolean JNICALL Java_java_lang_VMClass_isArray(JNIEnv *env, jclass clazz, jclass klass)
384 {
385         classinfo *c;
386
387         c = LLNI_classinfo_unwrap(klass);
388
389         return class_is_array(c);
390 }
391
392
393 /*
394  * Class:     java/lang/VMClass
395  * Method:    throwException
396  * Signature: (Ljava/lang/Throwable;)V
397  */
398 JNIEXPORT void JNICALL Java_java_lang_VMClass_throwException(JNIEnv *env, jclass clazz, jobject t)
399 {
400         java_handle_t *o;
401
402         o = (java_handle_t *) t;
403
404         exceptions_set_exception(o);
405 }
406
407
408 #if defined(ENABLE_ANNOTATIONS)
409 /*
410  * Class:     java/lang/VMClass
411  * Method:    getDeclaredAnnotations
412  * Signature: (Ljava/lang/Class;)[Ljava/lang/annotation/Annotation;
413  */
414 JNIEXPORT jobjectArray JNICALL Java_java_lang_VMClass_getDeclaredAnnotations(JNIEnv *env, jclass clazz, jclass klass)
415 {
416         static methodinfo* m_parseAnnotationsIntoArray = NULL;
417
418         if (klass == NULL) {
419                 exceptions_throw_nullpointerexception();
420                 return NULL;
421         }
422         
423         classinfo* c = LLNI_classinfo_unwrap(klass);
424
425         /* get annotations: */
426         java_handle_bytearray_t* annotations = class_get_annotations(c);
427
428         java_handle_t* h = native_new_and_init(class_sun_reflect_ConstantPool);
429         
430         if (h == NULL)
431                 return NULL;
432
433         sun_reflect_ConstantPool cp(h);
434         cp.set_constantPoolOop(klass);
435
436         /* only resolve the parser method the first time */
437         if (m_parseAnnotationsIntoArray == NULL) {
438                 utf* utf_parseAnnotationsIntoArray = utf_new_char("parseAnnotationsIntoArray");
439                 utf* utf_desc = utf_new_char("([BLsun/reflect/ConstantPool;Ljava/lang/Class;)"
440                                                                          "[Ljava/lang/annotation/Annotation;");
441
442                 if (utf_parseAnnotationsIntoArray == NULL || utf_desc == NULL) {
443                         /* out of memory */
444                         return NULL;
445                 }
446
447                 m_parseAnnotationsIntoArray = class_resolveclassmethod(
448                         class_sun_reflect_annotation_AnnotationParser,
449                         utf_parseAnnotationsIntoArray,
450                         utf_desc,
451                         class_java_lang_Class,
452                         true);
453
454                 if (m_parseAnnotationsIntoArray == NULL) {
455                         /* method not found */
456                         return NULL;
457                 }
458         }
459
460         java_handle_objectarray_t* oa = (java_handle_objectarray_t*) vm_call_method(m_parseAnnotationsIntoArray, NULL, annotations, cp.get_handle(), klass);
461         return (jobjectArray) oa;
462 }
463 #endif
464
465
466 /*
467  * Class:     java/lang/VMClass
468  * Method:    getEnclosingClass
469  * Signature: (Ljava/lang/Class;)Ljava/lang/Class;
470  */
471 JNIEXPORT jclass JNICALL Java_java_lang_VMClass_getEnclosingClass(JNIEnv *env, jclass clazz, jclass klass)
472 {
473         classinfo *c;
474         classinfo *result;
475
476         c = LLNI_classinfo_unwrap(klass);
477
478         result = class_get_enclosingclass(c);
479
480         return (jclass) LLNI_classinfo_wrap(result);
481 }
482
483
484 /*
485  * Class:     java/lang/VMClass
486  * Method:    getEnclosingConstructor
487  * Signature: (Ljava/lang/Class;)Ljava/lang/reflect/Constructor;
488  */
489 JNIEXPORT jobject JNICALL Java_java_lang_VMClass_getEnclosingConstructor(JNIEnv *env, jclass clazz, jclass klass)
490 {
491         classinfo*     c;
492         java_handle_t* h;
493
494         c = LLNI_classinfo_unwrap(klass);
495         h = class_get_enclosingconstructor(c);
496
497         return (jobject) h;
498 }
499
500
501 /*
502  * Class:     java/lang/VMClass
503  * Method:    getEnclosingMethod
504  * Signature: (Ljava/lang/Class;)Ljava/lang/reflect/Method;
505  */
506 JNIEXPORT jobject JNICALL Java_java_lang_VMClass_getEnclosingMethod(JNIEnv *env, jclass clazz, jclass klass)
507 {
508         classinfo*     c;
509         java_handle_t* h;
510
511         c = LLNI_classinfo_unwrap(klass);
512         h = class_get_enclosingmethod(c);
513
514         return (jobject) h;
515 }
516
517
518 /*
519  * Class:     java/lang/VMClass
520  * Method:    getClassSignature
521  * Signature: (Ljava/lang/Class;)Ljava/lang/String;
522  */
523 JNIEXPORT jstring JNICALL Java_java_lang_VMClass_getClassSignature(JNIEnv *env, jclass clazz, jclass klass)
524 {
525         classinfo     *c;
526         utf           *u;
527         java_handle_t *s;
528
529         c = LLNI_classinfo_unwrap(klass);
530
531         u = class_get_signature(c);
532
533         if (u == NULL)
534                 return NULL;
535
536         s = javastring_new(u);
537
538         /* in error case s is NULL */
539
540         return (jstring) s;
541 }
542
543
544 /*
545  * Class:     java/lang/VMClass
546  * Method:    isAnonymousClass
547  * Signature: (Ljava/lang/Class;)Z
548  */
549 JNIEXPORT jboolean JNICALL Java_java_lang_VMClass_isAnonymousClass(JNIEnv *env, jclass clazz, jclass klass)
550 {
551         return class_is_anonymousclass(LLNI_classinfo_unwrap(klass));
552 }
553
554
555 /*
556  * Class:     java/lang/VMClass
557  * Method:    isLocalClass
558  * Signature: (Ljava/lang/Class;)Z
559  */
560 JNIEXPORT jboolean JNICALL Java_java_lang_VMClass_isLocalClass(JNIEnv *env, jclass clazz, jclass klass)
561 {
562         return class_is_localclass(LLNI_classinfo_unwrap(klass));
563 }
564
565
566 /*
567  * Class:     java/lang/VMClass
568  * Method:    isMemberClass
569  * Signature: (Ljava/lang/Class;)Z
570  */
571 JNIEXPORT jboolean JNICALL Java_java_lang_VMClass_isMemberClass(JNIEnv *env, jclass clazz, jclass klass)
572 {
573         return class_is_memberclass(LLNI_classinfo_unwrap(klass));
574 }
575
576 } // extern "C"
577
578
579 /* native methods implemented by this file ************************************/
580
581 static JNINativeMethod methods[] = {
582         { (char*) "isInstance",              (char*) "(Ljava/lang/Class;Ljava/lang/Object;)Z",                        (void*) (uintptr_t) &Java_java_lang_VMClass_isInstance              },
583         { (char*) "isAssignableFrom",        (char*) "(Ljava/lang/Class;Ljava/lang/Class;)Z",                         (void*) (uintptr_t) &Java_java_lang_VMClass_isAssignableFrom        },
584         { (char*) "isInterface",             (char*) "(Ljava/lang/Class;)Z",                                          (void*) (uintptr_t) &Java_java_lang_VMClass_isInterface             },
585         { (char*) "isPrimitive",             (char*) "(Ljava/lang/Class;)Z",                                          (void*) (uintptr_t) &Java_java_lang_VMClass_isPrimitive             },
586         { (char*) "getName",                 (char*) "(Ljava/lang/Class;)Ljava/lang/String;",                         (void*) (uintptr_t) &Java_java_lang_VMClass_getName                 },
587         { (char*) "getSuperclass",           (char*) "(Ljava/lang/Class;)Ljava/lang/Class;",                          (void*) (uintptr_t) &Java_java_lang_VMClass_getSuperclass           },
588         { (char*) "getInterfaces",           (char*) "(Ljava/lang/Class;)[Ljava/lang/Class;",                         (void*) (uintptr_t) &Java_java_lang_VMClass_getInterfaces           },
589         { (char*) "getComponentType",        (char*) "(Ljava/lang/Class;)Ljava/lang/Class;",                          (void*) (uintptr_t) &Java_java_lang_VMClass_getComponentType        },
590         { (char*) "getModifiers",            (char*) "(Ljava/lang/Class;Z)I",                                         (void*) (uintptr_t) &Java_java_lang_VMClass_getModifiers            },
591         { (char*) "getDeclaringClass",       (char*) "(Ljava/lang/Class;)Ljava/lang/Class;",                          (void*) (uintptr_t) &Java_java_lang_VMClass_getDeclaringClass       },
592         { (char*) "getDeclaredClasses",      (char*) "(Ljava/lang/Class;Z)[Ljava/lang/Class;",                        (void*) (uintptr_t) &Java_java_lang_VMClass_getDeclaredClasses      },
593         { (char*) "getDeclaredFields",       (char*) "(Ljava/lang/Class;Z)[Ljava/lang/reflect/Field;",                (void*) (uintptr_t) &Java_java_lang_VMClass_getDeclaredFields       },
594         { (char*) "getDeclaredMethods",      (char*) "(Ljava/lang/Class;Z)[Ljava/lang/reflect/Method;",               (void*) (uintptr_t) &Java_java_lang_VMClass_getDeclaredMethods      },
595         { (char*) "getDeclaredConstructors", (char*) "(Ljava/lang/Class;Z)[Ljava/lang/reflect/Constructor;",          (void*) (uintptr_t) &Java_java_lang_VMClass_getDeclaredConstructors },
596         { (char*) "getClassLoader",          (char*) "(Ljava/lang/Class;)Ljava/lang/ClassLoader;",                    (void*) (uintptr_t) &Java_java_lang_VMClass_getClassLoader          },
597         { (char*) "forName",                 (char*) "(Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class;", (void*) (uintptr_t) &Java_java_lang_VMClass_forName                 },
598         { (char*) "isArray",                 (char*) "(Ljava/lang/Class;)Z",                                          (void*) (uintptr_t) &Java_java_lang_VMClass_isArray                 },
599         { (char*) "throwException",          (char*) "(Ljava/lang/Throwable;)V",                                      (void*) (uintptr_t) &Java_java_lang_VMClass_throwException          },
600 #if defined(ENABLE_ANNOTATIONS)
601         { (char*) "getDeclaredAnnotations",  (char*) "(Ljava/lang/Class;)[Ljava/lang/annotation/Annotation;",         (void*) (uintptr_t) &Java_java_lang_VMClass_getDeclaredAnnotations  },
602 #endif
603         { (char*) "getEnclosingClass",       (char*) "(Ljava/lang/Class;)Ljava/lang/Class;",                          (void*) (uintptr_t) &Java_java_lang_VMClass_getEnclosingClass       },
604         { (char*) "getEnclosingConstructor", (char*) "(Ljava/lang/Class;)Ljava/lang/reflect/Constructor;",            (void*) (uintptr_t) &Java_java_lang_VMClass_getEnclosingConstructor },
605         { (char*) "getEnclosingMethod",      (char*) "(Ljava/lang/Class;)Ljava/lang/reflect/Method;",                 (void*) (uintptr_t) &Java_java_lang_VMClass_getEnclosingMethod      },
606         { (char*) "getClassSignature",       (char*) "(Ljava/lang/Class;)Ljava/lang/String;",                         (void*) (uintptr_t) &Java_java_lang_VMClass_getClassSignature       },
607         { (char*) "isAnonymousClass",        (char*) "(Ljava/lang/Class;)Z",                                          (void*) (uintptr_t) &Java_java_lang_VMClass_isAnonymousClass        },
608         { (char*) "isLocalClass",            (char*) "(Ljava/lang/Class;)Z",                                          (void*) (uintptr_t) &Java_java_lang_VMClass_isLocalClass            },
609         { (char*) "isMemberClass",           (char*) "(Ljava/lang/Class;)Z",                                          (void*) (uintptr_t) &Java_java_lang_VMClass_isMemberClass           },
610 };
611
612
613 /* _Jv_java_lang_VMClass_init **************************************************
614
615    Register native functions.
616
617 *******************************************************************************/
618
619 // FIXME
620 extern "C" {
621 void _Jv_java_lang_VMClass_init(void)
622 {
623         utf *u;
624
625         u = utf_new_char("java/lang/VMClass");
626
627         native_method_register(u, methods, NATIVE_METHODS_COUNT);
628 }
629 }
630
631
632 /*
633  * These are local overrides for various environment variables in Emacs.
634  * Please do not remove this and leave it at the end of the file, where
635  * Emacs will automagically detect them.
636  * ---------------------------------------------------------------------
637  * Local variables:
638  * mode: c++
639  * indent-tabs-mode: t
640  * c-basic-offset: 4
641  * tab-width: 4
642  * End:
643  * vim:noexpandtab:sw=4:ts=4:
644  */