CACAO
java_lang_reflect_VMField.cpp
Go to the documentation of this file.
1 /* src/native/vm/gnuclasspath/java_lang_reflect_VMField.cpp
2 
3  Copyright (C) 1996-2013
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 <assert.h>
29 #include <stdint.h>
30 
31 #include "native/jni.hpp"
32 #include "native/llni.hpp"
33 #include "native/native.hpp"
34 
35 #if defined(ENABLE_JNI_HEADERS)
36 # include "native/vm/include/java_lang_reflect_VMField.h"
37 #endif
38 
39 #if defined(ENABLE_ANNOTATIONS)
40 // REMOVEME
41 # include "native/vm/reflection.hpp"
42 #endif
43 
44 #include "vm/access.hpp"
45 #include "vm/descriptor.hpp"
46 #include "vm/exceptions.hpp"
47 #include "vm/global.hpp"
48 #include "vm/initialize.hpp"
49 #include "vm/javaobjects.hpp"
50 #include "vm/loader.hpp"
51 #include "vm/primitive.hpp"
52 #include "vm/resolve.hpp"
53 #include "vm/string.hpp"
54 #include "vm/utf8.hpp"
55 #include "vm/vm.hpp"
56 
57 #include "vm/jit/builtin.hpp"
58 
59 /* _field_access_check *********************************************************
60 
61  Checks if the field can be accessed.
62 
63  RETURN VALUE:
64  true......field can be accessed, or
65  false.....otherwise (maybe an Exception was thrown).
66 
67 *******************************************************************************/
68 
70 {
71  // Check if we should bypass security checks (AccessibleObject).
72 
73  java_lang_reflect_Field rf(rvmf.get_f());
74  int32_t override = rf.get_flag();
75 
76  if (override == false) {
77  /* This function is always called like this:
78  [0] java.lang.reflect.VMField.xxx (Native Method)
79  [1] java.lang.reflect.Field.xxx
80  [2] <caller>
81  */
82 
83  if (!access_check_field(f, 2))
84  return false;
85  }
86 
87  /* some general checks */
88 
89  if (f->flags & ACC_STATIC) {
90  /* initialize class if required */
91 
92  if (!(f->clazz->state & CLASS_INITIALIZED))
93  if (!initialize_class(f->clazz))
94  return false;
95 
96  /* everything is ok */
97 
98  return true;
99  }
100  else {
101  /* obj is required for not-static fields */
102 
103  if (o == NULL) {
105  return false;
106  }
107 
108  if (builtin_instanceof(o, f->clazz))
109  return true;
110  }
111 
112  /* exception path */
113 
115  return false;
116 }
117 
118 
119 /* _field_get_type *************************************************************
120 
121  Returns the content of the given field.
122 
123 *******************************************************************************/
124 
125 #define _FIELD_GET_TYPE(name, type, uniontype) \
126 static inline type _field_get_##name(fieldinfo *f, java_handle_t* h) \
127 { \
128  type ret; \
129  if (f->flags & ACC_STATIC) { \
130  ret = f->value->uniontype; \
131  } else { \
132  LLNI_CRITICAL_START; \
133  ret = *(type *) (((intptr_t) LLNI_DIRECT(h)) + f->offset); \
134  LLNI_CRITICAL_END; \
135  } \
136  return ret; \
137 }
138 
140 {
141  java_object_t* result;
142  java_handle_t* hresult;
143 
145 
146  if (f->flags & ACC_STATIC) {
147  result = (java_object_t*) f->value->a;
148  } else {
149  result = *(java_object_t**) (((intptr_t) LLNI_DIRECT(h)) + f->offset);
150  }
151 
152  hresult = LLNI_WRAP(result);
153 
155 
156  return hresult;
157 }
158 
159 _FIELD_GET_TYPE(int, int32_t, i)
160 _FIELD_GET_TYPE(long, int64_t, l)
161 _FIELD_GET_TYPE(float, float, f)
162 _FIELD_GET_TYPE(double, double, d)
163 
164 
165 /* _field_set_type *************************************************************
166 
167  Sets the content of the given field to the given value.
168 
169 *******************************************************************************/
170 
171 #define _FIELD_SET_TYPE(name, type, uniontype) \
172 static inline void _field_set_##name(fieldinfo* f, java_handle_t* h, type value) \
173 { \
174  if (f->flags & ACC_STATIC) { \
175  f->value->uniontype = value; \
176  } else { \
177  LLNI_CRITICAL_START; \
178  *(type *) (((intptr_t) LLNI_DIRECT(h)) + f->offset) = value; \
179  LLNI_CRITICAL_END; \
180  } \
181 }
182 
183 static inline void _field_set_handle(fieldinfo* f, java_handle_t* h, java_handle_t* hvalue)
184 {
186 
187  if (f->flags & ACC_STATIC) {
188  f->value->a = LLNI_DIRECT(hvalue);
189  } else {
190  *(java_object_t**) (((intptr_t) LLNI_DIRECT(h)) + f->offset) = LLNI_DIRECT(hvalue);
191  }
192 
194 }
195 
196 _FIELD_SET_TYPE(int, int32_t, i)
197 _FIELD_SET_TYPE(long, int64_t, l)
198 _FIELD_SET_TYPE(float, float, f)
199 _FIELD_SET_TYPE(double, double, d)
200 
201 
202 // Native functions are exported as C functions.
203 extern "C" {
204 
205 /*
206  * Class: java/lang/reflect/VMField
207  * Method: getModifiersInternal
208  * Signature: ()I
209  */
211 {
212  java_lang_reflect_VMField rvmf(_this);
213  fieldinfo* f = rvmf.get_field();
214  return f->flags;
215 }
216 
217 
218 /*
219  * Class: java/lang/reflect/VMField
220  * Method: getType
221  * Signature: ()Ljava/lang/Class;
222  */
224 {
225  java_lang_reflect_VMField rvmf(_this);
226  fieldinfo* f = rvmf.get_field();
227  classinfo *ret;
228 
229  typedesc* desc = f->parseddesc;
230 
231  if (desc == NULL)
232  return NULL;
233 
234  if (!resolve_class_from_typedesc(desc, true, false, &ret))
235  return NULL;
236 
237  return (jclass) LLNI_classinfo_wrap(ret);
238 }
239 
240 
241 /*
242  * Class: java/lang/reflect/VMField
243  * Method: get
244  * Signature: (Ljava/lang/Object;)Ljava/lang/Object;
245  */
247 {
248  java_lang_reflect_VMField rvmf(_this);
249  fieldinfo* f = rvmf.get_field();
250 
251  // Check if the field can be accessed.
252  if (!_field_access_check(rvmf, f, o))
253  return NULL;
254 
255  imm_union value;
256 
257  switch (f->parseddesc->primitivetype) {
259  case PRIMITIVETYPE_BYTE:
260  case PRIMITIVETYPE_CHAR:
261  case PRIMITIVETYPE_SHORT:
262  case PRIMITIVETYPE_INT:
263  value.i = _field_get_int(f, o);
264  break;
265 
266  case PRIMITIVETYPE_LONG:
267  value.l = _field_get_long(f, o);
268  break;
269 
270  case PRIMITIVETYPE_FLOAT:
271  value.f = _field_get_float(f, o);
272  break;
273 
275  value.d = _field_get_double(f, o);
276  break;
277 
278  case TYPE_ADR:
279  return (jobject) _field_get_handle(f, o);
280 
281  default:
282  assert(false);
283  break;
284  }
285 
286  // Now box the primitive types.
288 
289  return object;
290 }
291 
292 
293 /*
294  * Class: java/lang/reflect/VMField
295  * Method: getBoolean
296  * Signature: (Ljava/lang/Object;)Z
297  */
298 JNIEXPORT jboolean JNICALL Java_java_lang_reflect_VMField_getBoolean(JNIEnv *env, jobject _this, jobject o)
299 {
300  java_lang_reflect_VMField rvmf(_this);
301  fieldinfo* f = rvmf.get_field();
302 
303  // Check if the field can be accessed.
304  if (!_field_access_check(rvmf, f, o))
305  return 0;
306 
307  // Check the field type and return the value.
308  switch (f->parseddesc->primitivetype) {
310  return (jint) _field_get_int(f, o);
311  default:
313  return 0;
314  }
315 }
316 
317 
318 /*
319  * Class: java/lang/reflect/VMField
320  * Method: getByte
321  * Signature: (Ljava/lang/Object;)B
322  */
323 JNIEXPORT jbyte JNICALL Java_java_lang_reflect_VMField_getByte(JNIEnv *env, jobject _this, jobject o)
324 {
325  java_lang_reflect_VMField rvmf(_this);
326  fieldinfo* f = rvmf.get_field();
327 
328  // Check if the field can be accessed.
329  if (!_field_access_check(rvmf, f, o))
330  return 0;
331 
332  // Check the field type and return the value.
333  switch (f->parseddesc->primitivetype) {
334  case PRIMITIVETYPE_BYTE:
335  return (jint) _field_get_int(f, o);
336  default:
338  return 0;
339  }
340 }
341 
342 
343 /*
344  * Class: java/lang/reflect/VMField
345  * Method: getChar
346  * Signature: (Ljava/lang/Object;)C
347  */
348 JNIEXPORT jchar JNICALL Java_java_lang_reflect_VMField_getChar(JNIEnv *env, jobject _this, jobject o)
349 {
350  java_lang_reflect_VMField rvmf(_this);
351  fieldinfo* f = rvmf.get_field();
352 
353  // Check if the field can be accessed.
354  if (!_field_access_check(rvmf, f, o))
355  return 0;
356 
357  // Check the field type and return the value.
358  switch (f->parseddesc->primitivetype) {
359  case PRIMITIVETYPE_CHAR:
360  return (jint) _field_get_int(f, o);
361  default:
363  return 0;
364  }
365 }
366 
367 
368 /*
369  * Class: java/lang/reflect/VMField
370  * Method: getShort
371  * Signature: (Ljava/lang/Object;)S
372  */
373 JNIEXPORT jshort JNICALL Java_java_lang_reflect_VMField_getShort(JNIEnv *env, jobject _this, jobject o)
374 {
375  java_lang_reflect_VMField rvmf(_this);
376  fieldinfo* f = rvmf.get_field();
377 
378  // Check if the field can be accessed.
379  if (!_field_access_check(rvmf, f, o))
380  return 0;
381 
382  // Check the field type and return the value.
383  switch (f->parseddesc->primitivetype) {
384  case PRIMITIVETYPE_BYTE:
385  case PRIMITIVETYPE_SHORT:
386  return (jint) _field_get_int(f, o);
387  default:
389  return 0;
390  }
391 }
392 
393 
394 /*
395  * Class: java/lang/reflect/VMField
396  * Method: getInt
397  * Signature: (Ljava/lang/Object;)I
398  */
399 JNIEXPORT jint JNICALL Java_java_lang_reflect_VMField_getInt(JNIEnv *env , jobject _this, jobject o)
400 {
401  java_lang_reflect_VMField rvmf(_this);
402  fieldinfo* f = rvmf.get_field();
403 
404  // Check if the field can be accessed.
405  if (!_field_access_check(rvmf, f, o))
406  return 0;
407 
408  // Check the field type and return the value.
409  switch (f->parseddesc->primitivetype) {
410  case PRIMITIVETYPE_BYTE:
411  case PRIMITIVETYPE_CHAR:
412  case PRIMITIVETYPE_SHORT:
413  case PRIMITIVETYPE_INT:
414  return (jint) _field_get_int(f, o);
415  default:
417  return 0;
418  }
419 }
420 
421 
422 /*
423  * Class: java/lang/reflect/VMField
424  * Method: getLong
425  * Signature: (Ljava/lang/Object;)J
426  */
427 JNIEXPORT jlong JNICALL Java_java_lang_reflect_VMField_getLong(JNIEnv *env, jobject _this, jobject o)
428 {
429  java_lang_reflect_VMField rvmf(_this);
430  fieldinfo* f = rvmf.get_field();
431 
432  // Check if the field can be accessed.
433  if (!_field_access_check(rvmf, f, o))
434  return 0;
435 
436  // Check the field type and return the value.
437  switch (f->parseddesc->primitivetype) {
438  case PRIMITIVETYPE_BYTE:
439  case PRIMITIVETYPE_CHAR:
440  case PRIMITIVETYPE_SHORT:
441  case PRIMITIVETYPE_INT:
442  return (jlong) _field_get_int(f, o);
443  case PRIMITIVETYPE_LONG:
444  return (jlong) _field_get_long(f, o);
445  default:
447  return 0;
448  }
449 }
450 
451 
452 /*
453  * Class: java/lang/reflect/VMField
454  * Method: getFloat
455  * Signature: (Ljava/lang/Object;)F
456  */
457 JNIEXPORT jfloat JNICALL Java_java_lang_reflect_VMField_getFloat(JNIEnv *env, jobject _this, jobject o)
458 {
459  java_lang_reflect_VMField rvmf(_this);
460  fieldinfo* f = rvmf.get_field();
461 
462  // Check if the field can be accessed.
463  if (!_field_access_check(rvmf, f, o))
464  return 0;
465 
466  // Check the field type and return the value.
467  switch (f->parseddesc->primitivetype) {
468  case PRIMITIVETYPE_BYTE:
469  case PRIMITIVETYPE_CHAR:
470  case PRIMITIVETYPE_SHORT:
471  case PRIMITIVETYPE_INT:
472  return (jfloat) _field_get_int(f, o);
473  case PRIMITIVETYPE_LONG:
474  return (jfloat) _field_get_long(f, o);
475  case PRIMITIVETYPE_FLOAT:
476  return (jfloat) _field_get_float(f, o);
477  default:
479  return 0;
480  }
481 }
482 
483 
484 /*
485  * Class: java/lang/reflect/VMField
486  * Method: getDouble
487  * Signature: (Ljava/lang/Object;)D
488  */
489 JNIEXPORT jdouble JNICALL Java_java_lang_reflect_VMField_getDouble(JNIEnv *env , jobject _this, jobject o)
490 {
491  java_lang_reflect_VMField rvmf(_this);
492  fieldinfo* f = rvmf.get_field();
493 
494  // Check if the field can be accessed.
495  if (!_field_access_check(rvmf, f, o))
496  return 0;
497 
498  // Check the field type and return the value.
499  switch (f->parseddesc->primitivetype) {
500  case PRIMITIVETYPE_BYTE:
501  case PRIMITIVETYPE_CHAR:
502  case PRIMITIVETYPE_SHORT:
503  case PRIMITIVETYPE_INT:
504  return (jdouble) _field_get_int(f, o);
505  case PRIMITIVETYPE_LONG:
506  return (jdouble) _field_get_long(f, o);
507  case PRIMITIVETYPE_FLOAT:
508  return (jdouble) _field_get_float(f, o);
510  return (jdouble) _field_get_double(f, o);
511  default:
513  return 0;
514  }
515 }
516 
517 
518 /*
519  * Class: java/lang/reflect/VMField
520  * Method: set
521  * Signature: (Ljava/lang/Object;Ljava/lang/Object;)V
522  */
523 JNIEXPORT void JNICALL Java_java_lang_reflect_VMField_set(JNIEnv *env, jobject _this, jobject o, jobject value)
524 {
525  java_lang_reflect_VMField rvmf(_this);
526  fieldinfo* df = rvmf.get_field();
527 
528  classinfo *sc;
529  fieldinfo *sf;
530 
531  // Check if the field can be accessed.
532  if (!_field_access_check(rvmf, df, o))
533  return;
534 
535  // Get the source classinfo from the object.
536  if (value == NULL)
537  sc = NULL;
538  else
539  LLNI_class_get(value, sc);
540 
541  /* The fieldid is used to set the new value, for primitive
542  types the value has to be retrieved from the wrapping
543  object */
544 
545  switch (df->parseddesc->primitivetype) {
546  case PRIMITIVETYPE_BOOLEAN: {
547  int32_t val;
548 
549  /* determine the field to read the value */
550 
551  if ((sc == NULL) || !(sf = class_findfield(sc, utf8::value, utf8::Z)))
552  break;
553 
554  switch (sf->parseddesc->primitivetype) {
556  val = java_lang_Boolean(value).get_value();
557  break;
558  default:
560  return;
561  }
562 
563  _field_set_int(df, o, val);
564  return;
565  }
566 
567  case PRIMITIVETYPE_BYTE: {
568  int32_t val;
569 
570  if ((sc == NULL) || !(sf = class_findfield(sc, utf8::value, utf8::B)))
571  break;
572 
573  switch (sf->parseddesc->primitivetype) {
574  case PRIMITIVETYPE_BYTE:
575  val = java_lang_Byte(value).get_value();
576  break;
577  default:
579  return;
580  }
581 
582  _field_set_int(df, o, val);
583  return;
584  }
585 
586  case PRIMITIVETYPE_CHAR: {
587  int32_t val;
588 
589  if ((sc == NULL) || !(sf = class_findfield(sc, utf8::value, utf8::C)))
590  break;
591 
592  switch (sf->parseddesc->primitivetype) {
593  case PRIMITIVETYPE_CHAR:
594  val = java_lang_Character(value).get_value();
595  break;
596  default:
598  return;
599  }
600 
601  _field_set_int(df, o, val);
602  return;
603  }
604 
605  case PRIMITIVETYPE_SHORT: {
606  int32_t val;
607 
608  /* get field only by name, it can be one of B, S */
609 
610  if ((sc == NULL) || !(sf = class_findfield_by_name(sc, utf8::value, true)))
611  break;
612 
613  switch (sf->parseddesc->primitivetype) {
614  case PRIMITIVETYPE_BYTE:
615  val = java_lang_Byte(value).get_value();
616  break;
617  case PRIMITIVETYPE_SHORT:
618  val = java_lang_Short(value).get_value();
619  break;
620  default:
622  return;
623  }
624 
625  _field_set_int(df, o, val);
626  return;
627  }
628 
629  case PRIMITIVETYPE_INT: {
630  int32_t val;
631 
632  /* get field only by name, it can be one of B, S, C, I */
633 
634  if ((sc == NULL) || !(sf = class_findfield_by_name(sc, utf8::value, true)))
635  break;
636 
637  switch (sf->parseddesc->primitivetype) {
638  case PRIMITIVETYPE_BYTE:
639  val = java_lang_Byte(value).get_value();
640  break;
641  case PRIMITIVETYPE_CHAR:
642  val = java_lang_Character(value).get_value();
643  break;
644  case PRIMITIVETYPE_SHORT:
645  val = java_lang_Short(value).get_value();
646  break;
647  case PRIMITIVETYPE_INT:
648  val = java_lang_Integer(value).get_value();
649  break;
650  default:
652  return;
653  }
654 
655  _field_set_int(df, o, val);
656  return;
657  }
658 
659  case PRIMITIVETYPE_LONG: {
660  int64_t val;
661 
662  /* get field only by name, it can be one of B, S, C, I, J */
663 
664  if ((sc == NULL) || !(sf = class_findfield_by_name(sc, utf8::value, true)))
665  break;
666 
667  switch (sf->parseddesc->primitivetype) {
668  case PRIMITIVETYPE_BYTE:
669  val = java_lang_Byte(value).get_value();
670  break;
671  case PRIMITIVETYPE_CHAR:
672  val = java_lang_Character(value).get_value();
673  break;
674  case PRIMITIVETYPE_SHORT:
675  val = java_lang_Short(value).get_value();
676  break;
677  case PRIMITIVETYPE_INT:
678  val = java_lang_Integer(value).get_value();
679  break;
680  case PRIMITIVETYPE_LONG:
681  val = java_lang_Long(value).get_value();
682  break;
683  default:
685  return;
686  }
687 
688  _field_set_long(df, o, val);
689  return;
690  }
691 
692  case PRIMITIVETYPE_FLOAT: {
693  float val;
694 
695  /* get field only by name, it can be one of B, S, C, I, J, F */
696 
697  if ((sc == NULL) || !(sf = class_findfield_by_name(sc, utf8::value, true)))
698  break;
699 
700  switch (sf->parseddesc->primitivetype) {
701  case PRIMITIVETYPE_BYTE:
702  val = java_lang_Byte(value).get_value();
703  break;
704  case PRIMITIVETYPE_CHAR:
705  val = java_lang_Character(value).get_value();
706  break;
707  case PRIMITIVETYPE_SHORT:
708  val = java_lang_Short(value).get_value();
709  break;
710  case PRIMITIVETYPE_INT:
711  val = java_lang_Integer(value).get_value();
712  break;
713  case PRIMITIVETYPE_LONG:
714  val = java_lang_Long(value).get_value();
715  break;
716  case PRIMITIVETYPE_FLOAT:
717  val = java_lang_Float(value).get_value();
718  break;
719  default:
721  return;
722  }
723 
724  _field_set_float(df, o, val);
725  return;
726  }
727 
728  case PRIMITIVETYPE_DOUBLE: {
729  double val;
730 
731  /* get field only by name, it can be one of B, S, C, I, J, F, D */
732 
733  if ((sc == NULL) || !(sf = class_findfield_by_name(sc, utf8::value, true)))
734  break;
735 
736  switch (sf->parseddesc->primitivetype) {
737  case PRIMITIVETYPE_BYTE:
738  val = java_lang_Byte(value).get_value();
739  break;
740  case PRIMITIVETYPE_CHAR:
741  val = java_lang_Character(value).get_value();
742  break;
743  case PRIMITIVETYPE_SHORT:
744  val = java_lang_Short(value).get_value();
745  break;
746  case PRIMITIVETYPE_INT:
747  val = java_lang_Integer(value).get_value();
748  break;
749  case PRIMITIVETYPE_LONG:
750  val = java_lang_Long(value).get_value();
751  break;
752  case PRIMITIVETYPE_FLOAT:
753  val = java_lang_Float(value).get_value();
754  break;
756  val = java_lang_Double(value).get_value();
757  break;
758  default:
760  return;
761  }
762 
763  _field_set_double(df, o, val);
764  return;
765  }
766 
767  case TYPE_ADR:
768  /* check if value is an instance of the destination class */
769 
770  /* XXX TODO */
771  /* if (!builtin_instanceof((java_handle_t *) value, df->class)) */
772  /* break; */
773 
774  _field_set_handle(df, o, value);
775  return;
776 
777  default:
778  assert(false);
779  break;
780  }
781 
782  /* raise exception */
783 
785 }
786 
787 
788 /*
789  * Class: java/lang/reflect/VMField
790  * Method: setBoolean
791  * Signature: (Ljava/lang/Object;Z)V
792  */
793 JNIEXPORT void JNICALL Java_java_lang_reflect_VMField_setBoolean(JNIEnv *env, jobject _this, jobject o, jboolean value)
794 {
795  java_lang_reflect_VMField rvmf(_this);
796  fieldinfo* f = rvmf.get_field();
797 
798  // Check if the field can be accessed.
799  if (!_field_access_check(rvmf, f, o))
800  return;
801 
802  // Check the field type and set the value.
803  switch (f->parseddesc->primitivetype) {
805  _field_set_int(f, o, value);
806  break;
807  default:
809  }
810 }
811 
812 
813 /*
814  * Class: java/lang/reflect/VMField
815  * Method: setByte
816  * Signature: (Ljava/lang/Object;B)V
817  */
818 JNIEXPORT void JNICALL Java_java_lang_reflect_VMField_setByte(JNIEnv *env, jobject _this, jobject o, jbyte value)
819 {
820  java_lang_reflect_VMField rvmf(_this);
821  fieldinfo* f = rvmf.get_field();
822 
823  // Check if the field can be accessed.
824  if (!_field_access_check(rvmf, f, o))
825  return;
826 
827  // Check the field type and set the value.
828  switch (f->parseddesc->primitivetype) {
829  case PRIMITIVETYPE_BYTE:
830  case PRIMITIVETYPE_SHORT:
831  case PRIMITIVETYPE_INT:
832  _field_set_int(f, o, value);
833  break;
834  case PRIMITIVETYPE_LONG:
835  _field_set_long(f, o, value);
836  break;
837  case PRIMITIVETYPE_FLOAT:
838  _field_set_float(f, o, value);
839  break;
841  _field_set_double(f, o, value);
842  break;
843  default:
845  }
846 }
847 
848 
849 /*
850  * Class: java/lang/reflect/VMField
851  * Method: setChar
852  * Signature: (Ljava/lang/Object;C)V
853  */
854 JNIEXPORT void JNICALL Java_java_lang_reflect_VMField_setChar(JNIEnv *env, jobject _this, jobject o, jchar value)
855 {
856  java_lang_reflect_VMField rvmf(_this);
857  fieldinfo* f = rvmf.get_field();
858 
859  // Check if the field can be accessed.
860  if (!_field_access_check(rvmf, f, o))
861  return;
862 
863  // Check the field type and set the value.
864  switch (f->parseddesc->primitivetype) {
865  case PRIMITIVETYPE_CHAR:
866  case PRIMITIVETYPE_INT:
867  _field_set_int(f, o, value);
868  break;
869  case PRIMITIVETYPE_LONG:
870  _field_set_long(f, o, value);
871  break;
872  case PRIMITIVETYPE_FLOAT:
873  _field_set_float(f, o, value);
874  break;
876  _field_set_double(f, o, value);
877  break;
878  default:
880  }
881 }
882 
883 
884 /*
885  * Class: java/lang/reflect/VMField
886  * Method: setShort
887  * Signature: (Ljava/lang/Object;S)V
888  */
889 JNIEXPORT void JNICALL Java_java_lang_reflect_VMField_setShort(JNIEnv *env, jobject _this, jobject o, jshort value)
890 {
891  java_lang_reflect_VMField rvmf(_this);
892  fieldinfo* f = rvmf.get_field();
893 
894  // Check if the field can be accessed.
895  if (!_field_access_check(rvmf, f, o))
896  return;
897 
898  // Check the field type and set the value.
899  switch (f->parseddesc->primitivetype) {
900  case PRIMITIVETYPE_SHORT:
901  case PRIMITIVETYPE_INT:
902  _field_set_int(f, o, value);
903  break;
904  case PRIMITIVETYPE_LONG:
905  _field_set_long(f, o, value);
906  break;
907  case PRIMITIVETYPE_FLOAT:
908  _field_set_float(f, o, value);
909  break;
911  _field_set_double(f, o, value);
912  break;
913  default:
915  }
916 }
917 
918 
919 /*
920  * Class: java/lang/reflect/VMField
921  * Method: setInt
922  * Signature: (Ljava/lang/Object;I)V
923  */
924 JNIEXPORT void JNICALL Java_java_lang_reflect_VMField_setInt(JNIEnv *env, jobject _this, jobject o, jint value)
925 {
926  java_lang_reflect_VMField rvmf(_this);
927  fieldinfo* f = rvmf.get_field();
928 
929  // Check if the field can be accessed.
930  if (!_field_access_check(rvmf, f, o))
931  return;
932 
933  // Check the field type and set the value.
934  switch (f->parseddesc->primitivetype) {
935  case PRIMITIVETYPE_INT:
936  _field_set_int(f, o, value);
937  break;
938  case PRIMITIVETYPE_LONG:
939  _field_set_long(f, o, value);
940  break;
941  case PRIMITIVETYPE_FLOAT:
942  _field_set_float(f, o, value);
943  break;
945  _field_set_double(f, o, value);
946  break;
947  default:
949  }
950 }
951 
952 
953 /*
954  * Class: java/lang/reflect/VMField
955  * Method: setLong
956  * Signature: (Ljava/lang/Object;J)V
957  */
958 JNIEXPORT void JNICALL Java_java_lang_reflect_VMField_setLong(JNIEnv *env, jobject _this, jobject o, jlong value)
959 {
960  java_lang_reflect_VMField rvmf(_this);
961  fieldinfo* f = rvmf.get_field();
962 
963  // Check if the field can be accessed.
964  if (!_field_access_check(rvmf, f, o))
965  return;
966 
967  // Check the field type and set the value.
968  switch (f->parseddesc->primitivetype) {
969  case PRIMITIVETYPE_LONG:
970  _field_set_long(f, o, value);
971  break;
972  case PRIMITIVETYPE_FLOAT:
973  _field_set_float(f, o, value);
974  break;
976  _field_set_double(f, o, value);
977  break;
978  default:
980  }
981 }
982 
983 
984 /*
985  * Class: java/lang/reflect/VMField
986  * Method: setFloat
987  * Signature: (Ljava/lang/Object;F)V
988  */
989 JNIEXPORT void JNICALL Java_java_lang_reflect_VMField_setFloat(JNIEnv *env, jobject _this, jobject o, jfloat value)
990 {
991  java_lang_reflect_VMField rvmf(_this);
992  fieldinfo* f = rvmf.get_field();
993 
994  // Check if the field can be accessed.
995  if (!_field_access_check(rvmf, f, o))
996  return;
997 
998  // Check the field type and set the value.
999  switch (f->parseddesc->primitivetype) {
1000  case PRIMITIVETYPE_FLOAT:
1001  _field_set_float(f, o, value);
1002  break;
1003  case PRIMITIVETYPE_DOUBLE:
1004  _field_set_double(f, o, value);
1005  break;
1006  default:
1008  }
1009 }
1010 
1011 
1012 /*
1013  * Class: java/lang/reflect/VMField
1014  * Method: setDouble
1015  * Signature: (Ljava/lang/Object;D)V
1016  */
1017 JNIEXPORT void JNICALL Java_java_lang_reflect_VMField_setDouble(JNIEnv *env, jobject _this, jobject o, jdouble value)
1018 {
1019  java_lang_reflect_VMField rvmf(_this);
1020  fieldinfo* f = rvmf.get_field();
1021 
1022  // Check if the field can be accessed.
1023  if (!_field_access_check(rvmf, f, o))
1024  return;
1025 
1026  // Check the field type and set the value.
1027  switch (f->parseddesc->primitivetype) {
1028  case PRIMITIVETYPE_DOUBLE:
1029  _field_set_double(f, o, value);
1030  break;
1031  default:
1033  }
1034 }
1035 
1036 
1037 /*
1038  * Class: java/lang/reflect/VMField
1039  * Method: getSignature
1040  * Signature: ()Ljava/lang/String;
1041  */
1043 {
1044  java_lang_reflect_VMField rvmf(_this);
1045  fieldinfo* f = rvmf.get_field();
1046 
1047  if (f->signature == NULL)
1048  return NULL;
1049 
1051 
1052  /* in error case o is NULL */
1053 
1054  return o;
1055 }
1056 
1057 
1058 #if defined(ENABLE_ANNOTATIONS)
1059 /*
1060  * Class: java/lang/reflect/VMField
1061  * Method: declaredAnnotations
1062  * Signature: ()Ljava/util/Map;
1063  */
1065 {
1066  java_lang_reflect_VMField rvmf(_this);
1067 
1068  java_handle_t* declaredAnnotations = rvmf.get_declaredAnnotations();
1069 
1070  // Are the annotations parsed yet?
1071  if (declaredAnnotations == NULL) {
1072  java_handle_bytearray_t* annotations = rvmf.get_annotations();
1073  classinfo* declaringClass = rvmf.get_clazz();
1074  classinfo* referer = rvmf.get_Class();
1075 
1076  declaredAnnotations = Reflection::get_declaredannotations(annotations, declaringClass, referer);
1077 
1078  rvmf.set_declaredAnnotations(declaredAnnotations);
1079  }
1080 
1081  return (jobject) declaredAnnotations;
1082 }
1083 #endif
1084 
1085 } // extern "C"
1086 
1087 
1088 /* native methods implemented by this file ************************************/
1089 
1090 static const JNINativeMethod methods[] = {
1091  { (char*) "getModifiersInternal", (char*) "()I", (void*) (uintptr_t) &Java_java_lang_reflect_VMField_getModifiersInternal },
1092  { (char*) "getType", (char*) "()Ljava/lang/Class;", (void*) (uintptr_t) &Java_java_lang_reflect_VMField_getType },
1093  { (char*) "get", (char*) "(Ljava/lang/Object;)Ljava/lang/Object;", (void*) (uintptr_t) &Java_java_lang_reflect_VMField_get },
1094  { (char*) "getBoolean", (char*) "(Ljava/lang/Object;)Z", (void*) (uintptr_t) &Java_java_lang_reflect_VMField_getBoolean },
1095  { (char*) "getByte", (char*) "(Ljava/lang/Object;)B", (void*) (uintptr_t) &Java_java_lang_reflect_VMField_getByte },
1096  { (char*) "getChar", (char*) "(Ljava/lang/Object;)C", (void*) (uintptr_t) &Java_java_lang_reflect_VMField_getChar },
1097  { (char*) "getShort", (char*) "(Ljava/lang/Object;)S", (void*) (uintptr_t) &Java_java_lang_reflect_VMField_getShort },
1098  { (char*) "getInt", (char*) "(Ljava/lang/Object;)I", (void*) (uintptr_t) &Java_java_lang_reflect_VMField_getInt },
1099  { (char*) "getLong", (char*) "(Ljava/lang/Object;)J", (void*) (uintptr_t) &Java_java_lang_reflect_VMField_getLong },
1100  { (char*) "getFloat", (char*) "(Ljava/lang/Object;)F", (void*) (uintptr_t) &Java_java_lang_reflect_VMField_getFloat },
1101  { (char*) "getDouble", (char*) "(Ljava/lang/Object;)D", (void*) (uintptr_t) &Java_java_lang_reflect_VMField_getDouble },
1102  { (char*) "set", (char*) "(Ljava/lang/Object;Ljava/lang/Object;)V", (void*) (uintptr_t) &Java_java_lang_reflect_VMField_set },
1103  { (char*) "setBoolean", (char*) "(Ljava/lang/Object;Z)V", (void*) (uintptr_t) &Java_java_lang_reflect_VMField_setBoolean },
1104  { (char*) "setByte", (char*) "(Ljava/lang/Object;B)V", (void*) (uintptr_t) &Java_java_lang_reflect_VMField_setByte },
1105  { (char*) "setChar", (char*) "(Ljava/lang/Object;C)V", (void*) (uintptr_t) &Java_java_lang_reflect_VMField_setChar },
1106  { (char*) "setShort", (char*) "(Ljava/lang/Object;S)V", (void*) (uintptr_t) &Java_java_lang_reflect_VMField_setShort },
1107  { (char*) "setInt", (char*) "(Ljava/lang/Object;I)V", (void*) (uintptr_t) &Java_java_lang_reflect_VMField_setInt },
1108  { (char*) "setLong", (char*) "(Ljava/lang/Object;J)V", (void*) (uintptr_t) &Java_java_lang_reflect_VMField_setLong },
1109  { (char*) "setFloat", (char*) "(Ljava/lang/Object;F)V", (void*) (uintptr_t) &Java_java_lang_reflect_VMField_setFloat },
1110  { (char*) "setDouble", (char*) "(Ljava/lang/Object;D)V", (void*) (uintptr_t) &Java_java_lang_reflect_VMField_setDouble },
1111  { (char*) "getSignature", (char*) "()Ljava/lang/String;", (void*) (uintptr_t) &Java_java_lang_reflect_VMField_getSignature },
1112 #if defined(ENABLE_ANNOTATIONS)
1113  { (char*) "declaredAnnotations", (char*) "()Ljava/util/Map;", (void*) (uintptr_t) &Java_java_lang_reflect_VMField_declaredAnnotations },
1114 #endif
1115 };
1116 
1117 
1118 /* _Jv_java_lang_reflect_VMField_init ******************************************
1119 
1120  Register native functions.
1121 
1122 *******************************************************************************/
1123 
1125 {
1126  Utf8String u = Utf8String::from_utf8("java/lang/reflect/VMField");
1127 
1129  nm.register_methods(u, methods, NATIVE_METHODS_COUNT);
1130 }
1131 
1132 
1133 /*
1134  * These are local overrides for various environment variables in Emacs.
1135  * Please do not remove this and leave it at the end of the file, where
1136  * Emacs will automagically detect them.
1137  * ---------------------------------------------------------------------
1138  * Local variables:
1139  * mode: c++
1140  * indent-tabs-mode: t
1141  * c-basic-offset: 4
1142  * tab-width: 4
1143  * End:
1144  * vim:noexpandtab:sw=4:ts=4:
1145  */
void exceptions_throw_illegalargumentexception(void)
java/lang/Integer
static java_handle_t * get_declaredannotations(java_handle_bytearray_t *annotations, classinfo *declaringClass, classinfo *referer)
Definition: reflection.cpp:143
static void _field_set_handle(fieldinfo *f, java_handle_t *h, java_handle_t *hvalue)
JNIEXPORT void JNICALL Java_java_lang_reflect_VMField_setInt(JNIEnv *env, jobject _this, jobject o, jint value)
bool builtin_instanceof(java_handle_t *o, classinfo *c)
Definition: builtin.cpp:403
JNIEnv jthread jmethodID jlocation jclass jobject object
Definition: jvmti.h:221
float f
Definition: global.hpp:56
JNIEXPORT jbyte JNICALL Java_java_lang_reflect_VMField_getByte(JNIEnv *env, jobject _this, jobject o)
double d
Definition: global.hpp:57
Table containing all native methods registered with the VM.
Definition: native.hpp:132
JNIEXPORT void JNICALL Java_java_lang_reflect_VMField_set(JNIEnv *env, jobject _this, jobject o, jobject value)
NativeMethods & get_nativemethods()
Definition: vm.hpp:128
void register_methods(Utf8String classname, const JNINativeMethod *methods, size_t count)
Register native methods with the VM.
Definition: native.cpp:242
java/lang/Float
JNIEXPORT void JNICALL Java_java_lang_reflect_VMField_setDouble(JNIEnv *env, jobject _this, jobject o, jdouble value)
_Jv_JNIEnv JNIEnv
Definition: jni.hpp:112
void * a
Definition: global.hpp:58
int8_t get_value()
#define NATIVE_METHODS_COUNT
Definition: native.hpp:45
JNIEXPORT void JNICALL Java_java_lang_reflect_VMField_setFloat(JNIEnv *env, jobject _this, jobject o, jfloat value)
static JavaString from_utf8(Utf8String)
Definition: string.cpp:184
classinfo * get_clazz() const
JNIEXPORT void JNICALL Java_java_lang_reflect_VMField_setByte(JNIEnv *env, jobject _this, jobject o, jbyte value)
s4 state
Definition: class.hpp:115
JNIEXPORT jint JNICALL Java_java_lang_reflect_VMField_getModifiersInternal(JNIEnv *env, jobject _this)
java_handle_t * get_declaredAnnotations() const
java/lang/Boolean
JNIEXPORT void JNICALL Java_java_lang_reflect_VMField_setChar(JNIEnv *env, jobject _this, jobject o, jchar value)
java_handle_bytearray_t * get_annotations() const
GNU Classpath java/lang/reflect/Field.
void _Jv_java_lang_reflect_VMField_init(void)
classinfo * get_Class() const
#define _FIELD_SET_TYPE(name, type, uniontype)
JNIEXPORT jboolean JNICALL Java_java_lang_reflect_VMField_getBoolean(JNIEnv *env, jobject _this, jobject o)
#define LLNI_CRITICAL_END
Definition: llni.hpp:141
static java_handle_t * box(int type, imm_union value)
Box a primitive of the given type.
Definition: primitive.cpp:393
JNIEXPORT void JNICALL Java_java_lang_reflect_VMField_setLong(JNIEnv *env, jobject _this, jobject o, jlong value)
static const JNINativeMethod methods[]
bool resolve_class_from_typedesc(typedesc *d, bool checkaccess, bool link, classinfo **result)
Definition: resolve.cpp:473
#define LLNI_classinfo_wrap(classinfo)
Definition: llni.hpp:110
#define LLNI_class_get(obj, variable)
Definition: llni.hpp:60
fieldinfo * class_findfield_by_name(classinfo *c, Utf8String name, bool throwexception)
Definition: class.cpp:1319
JNIEXPORT jlong JNICALL Java_java_lang_reflect_VMField_getLong(JNIEnv *env, jobject _this, jobject o)
java_handle_t * get_f() const
#define LLNI_WRAP(obj)
Definition: llni.hpp:51
fieldinfo * get_field() const
JNIEXPORT jshort JNICALL Java_java_lang_reflect_VMField_getShort(JNIEnv *env, jobject _this, jobject o)
JNIEXPORT void JNICALL Java_java_lang_reflect_VMField_setShort(JNIEnv *env, jobject _this, jobject o, jshort value)
static PassRegistry< BasicBlockPrinterPass > Z("BasicBlockPrinterPass")
#define _FIELD_GET_TYPE(name, type, uniontype)
int32_t offset
Definition: field.hpp:66
void exceptions_throw_nullpointerexception(void)
s4 flags
Definition: field.hpp:59
imm_union * value
Definition: field.hpp:67
fieldinfo * class_findfield(classinfo *c, Utf8String name, Utf8String desc)
Definition: class.cpp:1299
java/lang/Character
typedesc * parseddesc
Definition: field.hpp:64
void set_declaredAnnotations(java_handle_t *value)
static Utf8String from_utf8(const char *, size_t)
Definition: utf8.cpp:335
JNIEXPORT jfloat JNICALL Java_java_lang_reflect_VMField_getFloat(JNIEnv *env, jobject _this, jobject o)
MIIterator i
JNIEXPORT jint JNICALL Java_java_lang_reflect_VMField_getInt(JNIEnv *env, jobject _this, jobject o)
java/lang/Double
classinfo * clazz
Definition: field.hpp:55
JNIEXPORT jdouble JNICALL Java_java_lang_reflect_VMField_getDouble(JNIEnv *env, jobject _this, jobject o)
static bool _field_access_check(const java_lang_reflect_VMField &rvmf, fieldinfo *f, java_handle_t *o)
bool initialize_class(classinfo *c)
Definition: initialize.cpp:110
java/lang/Long
JNIEXPORT jstring JNICALL Java_java_lang_reflect_VMField_getSignature(JNIEnv *env, jobject _this)
bool access_check_field(fieldinfo *f, int callerdepth)
Definition: access.cpp:208
int16_t get_value()
JNIEXPORT jchar JNICALL Java_java_lang_reflect_VMField_getChar(JNIEnv *env, jobject _this, jobject o)
int32_t get_flag() const
#define LLNI_CRITICAL_START
Definition: llni.hpp:140
JNIEXPORT jobject JNICALL Java_java_lang_reflect_VMField_declaredAnnotations(JNIEnv *env, jobject _this)
JNIEXPORT jclass JNICALL Java_java_lang_reflect_VMField_getType(JNIEnv *env, jobject _this)
#define LLNI_DIRECT(hdl)
Definition: llni.hpp:54
static java_handle_t * _field_get_handle(fieldinfo *f, java_handle_t *h)
JNIEXPORT void JNICALL Java_java_lang_reflect_VMField_setBoolean(JNIEnv *env, jobject _this, jobject o, jboolean value)
java/lang/Byte
java/lang/Short
Utf8String signature
Definition: field.hpp:63
PrimitiveType primitivetype
Definition: descriptor.hpp:137
int64_t get_value()
GNU Classpath java/lang/reflect/VMField.
static VM * get_current()
Definition: vm.hpp:99
JNIEXPORT jobject JNICALL Java_java_lang_reflect_VMField_get(JNIEnv *env, jobject _this, jobject o)