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