CACAO
primitive.cpp
Go to the documentation of this file.
1 /* src/vm/primitive.cpp - primitive types
2 
3  Copyright (C) 2007-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/llni.hpp"
32 
33 #include "toolbox/logging.hpp"
34 
35 #include "vm/jit/builtin.hpp"
36 #include "vm/class.hpp"
37 #include "vm/global.hpp"
38 #include "vm/globals.hpp"
39 #include "vm/javaobjects.hpp"
40 #include "vm/options.hpp"
41 #include "vm/os.hpp"
42 #include "vm/primitive.hpp"
43 #include "vm/utf8.hpp"
44 #include "vm/vm.hpp"
45 
46 
47 /* primitivetype_table *********************************************************
48 
49  Structure for primitive classes: contains the class for wrapping
50  the primitive type, the primitive class, the name of the class for
51  wrapping, the one character type signature and the name of the
52  primitive class.
53 
54  CAUTION: Don't change the order of the types. This table is indexed
55  by the ARRAYTYPE_ constants (except ARRAYTYPE_OBJECT).
56 
57 *******************************************************************************/
58 
60  { "int" , NULL, NULL, NULL, "java/lang/Integer", 'I', "[I", NULL },
61  { "long" , NULL, NULL, NULL, "java/lang/Long", 'J', "[J", NULL },
62  { "float" , NULL, NULL, NULL, "java/lang/Float", 'F', "[F", NULL },
63  { "double" , NULL, NULL, NULL, "java/lang/Double", 'D', "[D", NULL },
64  { NULL , NULL, NULL, NULL, NULL, 0 , NULL, NULL },
65  { "byte" , NULL, NULL, NULL, "java/lang/Byte", 'B', "[B", NULL },
66  { "char" , NULL, NULL, NULL, "java/lang/Character", 'C', "[C", NULL },
67  { "short" , NULL, NULL, NULL, "java/lang/Short", 'S', "[S", NULL },
68  { "boolean" , NULL, NULL, NULL, "java/lang/Boolean", 'Z', "[Z", NULL },
69  { NULL , NULL, NULL, NULL, NULL, 0 , NULL, NULL },
70 #if defined(ENABLE_JAVASE)
71  { "void" , NULL, NULL, NULL, "java/lang/Void", 'V', NULL, NULL }
72 #else
73  { NULL , NULL, NULL, NULL, NULL, 0 , NULL, NULL },
74 #endif
75 };
76 
77 
78 /**
79  * Fill the primitive type table with the primitive-type classes,
80  * array-classes and wrapper classes. This is important in the VM
81  * startup.
82  *
83  * We split this primitive-type table initialization because of
84  * annotations in the bootstrap classes.
85  *
86  * But we may get a problem if we have annotations in:
87  *
88  * java/lang/Object
89  * java/lang/Cloneable
90  * java/io/Serializable
91  *
92  * Also see: loader_preinit and linker_preinit.
93  */
95 {
96  TRACESUBSYSTEMINITIALIZATION("primitive_init");
97 
98  /* Load and link primitive-type classes and array-classes. */
99 
100  for (int i = 0; i < PRIMITIVETYPE_MAX; i++) {
101  /* Skip dummy entries. */
102 
103  if (primitivetype_table[i].cname == NULL)
104  continue;
105 
106  /* create UTF-8 name */
107 
108  Utf8String name = Utf8String::from_utf8(primitivetype_table[i].cname);
109 
110  primitivetype_table[i].name = name;
111 
112  /* create primitive class */
113 
115 
116  /* Primitive type classes don't have a super class. */
117 
118  c->super = NULL;
119 
120  /* set flags and mark it as primitive class */
121 
123 
124  /* prevent loader from loading primitive class */
125 
126  c->state |= CLASS_LOADED;
127 
128  /* INFO: don't put primitive classes into the classcache */
129 
130  if (!link_class(c))
131  vm_abort("linker_init: linking failed");
132 
133  /* Just to be sure. */
134 
135  assert(c->state & CLASS_LOADED);
136  assert(c->state & CLASS_LINKED);
137 
138  primitivetype_table[i].class_primitive = c;
139 
140  /* Create primitive array class. */
141 
142  if (primitivetype_table[i].arrayname != NULL) {
143  Utf8String u = Utf8String::from_utf8(primitivetype_table[i].arrayname);
145  ac = load_newly_created_array(ac, NULL);
146 
147  if (ac == NULL)
148  vm_abort("primitive_init: loading failed");
149 
150  assert(ac->state & CLASS_LOADED);
151 
152  if (!link_class(ac))
153  vm_abort("primitive_init: linking failed");
154 
155  /* Just to be sure. */
156 
157  assert(ac->state & CLASS_LOADED);
158  assert(ac->state & CLASS_LINKED);
159 
160  primitivetype_table[i].arrayclass = ac;
161  }
162  }
163 
164  /* We use two for-loops to have the array-classes already in the
165  primitive-type table (hint: annotations in wrapper-classes). */
166 
167  for (int i = 0; i < PRIMITIVETYPE_MAX; i++) {
168  /* Skip dummy entries. */
169 
170  if (primitivetype_table[i].cname == NULL)
171  continue;
172 
173  /* Create class for wrapping the primitive type. */
174 
175  Utf8String u = Utf8String::from_utf8(primitivetype_table[i].wrapname);
177 
178  if (c == NULL)
179  vm_abort("primitive_init: loading failed");
180 
181  if (!link_class(c))
182  vm_abort("primitive_init: linking failed");
183 
184  /* Just to be sure. */
185 
186  assert(c->state & CLASS_LOADED);
187  assert(c->state & CLASS_LINKED);
188 
189  primitivetype_table[i].class_wrap = c;
190  }
191 }
192 
193 
194 /**
195  * Finish the primitive-type table initialization. In this step we
196  * set the vftbl of the primitive-type classes.
197  *
198  * This is necessary because java/lang/Class is loaded and linked
199  * after the primitive types have been linked.
200  *
201  * We have to do that in an extra function, as the primitive types are
202  * not stored in the classcache.
203  */
205 {
206  TRACESUBSYSTEMINITIALIZATION("primitive_postinit");
207 
208  assert(class_java_lang_Class);
209  assert(class_java_lang_Class->vftbl);
210 
211  for (int i = 0; i < PRIMITIVETYPE_MAX; i++) {
212  /* Skip dummy entries. */
213 
214  if (primitivetype_table[i].cname == NULL)
215  continue;
216 
217  classinfo *c = primitivetype_table[i].class_primitive;
218 
220  }
221 }
222 
223 
224 /**
225  * Returns the primitive class of the given class name.
226  *
227  * @param name Name of the class.
228  *
229  * @return Class structure.
230  */
232 {
233  /* search table of primitive classes */
234 
235  for (int i = 0; i < PRIMITIVETYPE_MAX; i++)
236  if (primitivetype_table[i].name == name)
237  return primitivetype_table[i].class_primitive;
238 
239  /* keep compiler happy */
240 
241  assert(false);
242  return NULL;
243 }
244 
245 
246 /**
247  * Returns the primitive class of the given type.
248  *
249  * @param type Integer type of the class.
250  *
251  * @return Class structure.
252  */
254 {
255  return primitivetype_table[type].class_primitive;
256 }
257 
258 
259 /**
260  * Returns the primitive class of the given type.
261  *
262  * @param ch
263  *
264  * @return Class structure.
265  */
267 {
268  int index;
269 
270  switch (ch) {
271  case 'I':
272  index = PRIMITIVETYPE_INT;
273  break;
274  case 'J':
275  index = PRIMITIVETYPE_LONG;
276  break;
277  case 'F':
278  index = PRIMITIVETYPE_FLOAT;
279  break;
280  case 'D':
281  index = PRIMITIVETYPE_DOUBLE;
282  break;
283  case 'B':
284  index = PRIMITIVETYPE_BYTE;
285  break;
286  case 'C':
287  index = PRIMITIVETYPE_CHAR;
288  break;
289  case 'S':
290  index = PRIMITIVETYPE_SHORT;
291  break;
292  case 'Z':
293  index = PRIMITIVETYPE_BOOLEAN;
294  break;
295  case 'V':
296  index = PRIMITIVETYPE_VOID;
297  break;
298  default:
299  return NULL;
300  }
301 
302  return primitivetype_table[index].class_primitive;
303 }
304 
305 
306 /**
307  * Returns the primitive array-class of the given primitive class
308  * name.
309  *
310  * @param name Name of the class.
311  *
312  * @return Class structure.
313  */
315 {
316  /* search table of primitive classes */
317 
318  for (int i = 0; i < PRIMITIVETYPE_MAX; i++)
319  if (primitivetype_table[i].name == name)
320  return primitivetype_table[i].arrayclass;
321 
322  /* keep compiler happy */
323 
324  assert(false);
325  return NULL;
326 }
327 
328 
329 /**
330  * Returns the primitive array-class of the given type.
331  *
332  * @param type Integer type of the class.
333  *
334  * @return Class structure.
335  */
337 {
338  return primitivetype_table[type].arrayclass;
339 }
340 
341 
342 /**
343  * Returns the primitive type of the given wrapper-class.
344  *
345  * @param c Class structure.
346  *
347  * @return Integer type of the class.
348  */
350 {
351  /* Search primitive table. */
352 
353  for (int i = 0; i < PRIMITIVETYPE_MAX; i++)
354  if (primitivetype_table[i].class_wrap == c)
355  return i;
356 
357  /* Invalid primitive wrapper-class. */
358 
359  return -1;
360 }
361 
362 
363 /**
364  * Returns the primitive type of the given primitive-class.
365  *
366  * @param c Class structure.
367  *
368  * @return Integer type of the class.
369  */
371 {
372  /* Search primitive table. */
373 
374  for (int i = 0; i < PRIMITIVETYPE_MAX; i++)
375  if (primitivetype_table[i].class_primitive == c)
376  return i;
377 
378  /* Invalid primitive class. */
379 
380  return -1;
381 }
382 
383 
384 /**
385  * Box a primitive of the given type. If the type is an object,
386  * simply return it.
387  *
388  * @param type Type of the passed value.
389  * @param value Value to box.
390  *
391  * @return Handle of the boxing Java object.
392  */
394 {
395  java_handle_t* o;
396 
397  switch (type) {
399  o = box((uint8_t) value.i);
400  break;
401  case PRIMITIVETYPE_BYTE:
402  o = box((int8_t) value.i);
403  break;
404  case PRIMITIVETYPE_CHAR:
405  o = box((uint16_t) value.i);
406  break;
407  case PRIMITIVETYPE_SHORT:
408  o = box((int16_t) value.i);
409  break;
410  case PRIMITIVETYPE_INT:
411  o = box(value.i);
412  break;
413  case PRIMITIVETYPE_LONG:
414  o = box(value.l);
415  break;
416  case PRIMITIVETYPE_FLOAT:
417  o = box(value.f);
418  break;
420  o = box(value.d);
421  break;
422  case PRIMITIVETYPE_VOID:
423  o = (java_handle_t*) value.a;
424  break;
425  default:
426  o = NULL;
427  os::abort("Primitive::box: Invalid primitive type %d", type);
428  }
429 
430  return o;
431 }
432 
433 
434 /**
435  * Unbox a primitive of the given type. If the type is an object,
436  * simply return it.
437  *
438  * @param h Handle of the Java object.
439  *
440  * @return Unboxed value as union.
441  */
443 {
444  classinfo *c;
445  imm_union value;
446 
447  if (h == NULL) {
448  value.a = NULL;
449  return value;
450  }
451 
452  LLNI_class_get(h, c);
453 
454  int type = get_type_by_wrapperclass(c);
455 
456  switch (type) {
458  value.i = unbox_boolean(h);
459  break;
460  case PRIMITIVETYPE_BYTE:
461  value.i = unbox_byte(h);
462  break;
463  case PRIMITIVETYPE_CHAR:
464  value.i = unbox_char(h);
465  break;
466  case PRIMITIVETYPE_SHORT:
467  value.i = unbox_short(h);
468  break;
469  case PRIMITIVETYPE_INT:
470  value.i = unbox_int(h);
471  break;
472  case PRIMITIVETYPE_LONG:
473  value.l = unbox_long(h);
474  break;
475  case PRIMITIVETYPE_FLOAT:
476  value.f = unbox_float(h);
477  break;
479  value.d = unbox_double(h);
480  break;
481  case -1:
482  /* If type is -1 the object is not a primitive box but a
483  normal object. */
484  value.a = h;
485  break;
486  default:
487  os::abort("Primitive::unbox: Invalid primitive type %d", type);
488  }
489 
490  return value;
491 }
492 
493 
494 /**
495  * Unbox a primitive of the given type. Also checks if the
496  * boxed primitive type can be widened into the destination
497  * type. This conversion is done according to
498  * "The Java Language Specification, Third Edition,
499  * $5.1.2 Widening Primitive Conversion".
500  *
501  * @param h Handle of the boxing Java object.
502  * @param type Destination type of the conversion.
503  * @param value Pointer to union where the resulting primitive
504  * value will be stored will.
505  *
506  * @return True of the conversion is allowed, false otherwise.
507  */
509 {
510  classinfo *c;
511  int src_type;
512 
513  if (h == NULL)
514  return false;
515 
516  LLNI_class_get(h, c);
517 
518  src_type = get_type_by_wrapperclass(c);
519 
520  switch (src_type) {
522  switch (type) {
524  value->i = unbox_boolean(h);
525  return true;
526  default:
527  return false;
528  }
529 
530  case PRIMITIVETYPE_BYTE:
531  switch (type) {
532  case PRIMITIVETYPE_BYTE:
533  case PRIMITIVETYPE_SHORT:
534  case PRIMITIVETYPE_INT:
535  value->i = unbox_byte(h);
536  return true;
537  case PRIMITIVETYPE_LONG:
538  value->l = unbox_byte(h);
539  return true;
540  case PRIMITIVETYPE_FLOAT:
541  value->f = unbox_byte(h);
542  return true;
544  value->d = unbox_byte(h);
545  return true;
546  default:
547  return false;
548  }
549 
550  case PRIMITIVETYPE_CHAR:
551  switch (type) {
552  case PRIMITIVETYPE_CHAR:
553  case PRIMITIVETYPE_INT:
554  value->i = unbox_char(h);
555  return true;
556  case PRIMITIVETYPE_LONG:
557  value->l = unbox_char(h);
558  return true;
559  case PRIMITIVETYPE_FLOAT:
560  value->f = unbox_char(h);
561  return true;
563  value->d = unbox_char(h);
564  return true;
565  default:
566  return false;
567  }
568 
569  case PRIMITIVETYPE_SHORT:
570  switch (type) {
571  case PRIMITIVETYPE_SHORT:
572  case PRIMITIVETYPE_INT:
573  value->i = unbox_short(h);
574  return true;
575  case PRIMITIVETYPE_LONG:
576  value->l = unbox_short(h);
577  return true;
578  case PRIMITIVETYPE_FLOAT:
579  value->f = unbox_short(h);
580  return true;
582  value->d = unbox_short(h);
583  return true;
584  default:
585  return false;
586  }
587 
588  case PRIMITIVETYPE_INT:
589  switch (type) {
590  case PRIMITIVETYPE_INT:
591  value->i = unbox_int(h);
592  return true;
593  case PRIMITIVETYPE_LONG:
594  value->l = unbox_int(h);
595  return true;
596  case PRIMITIVETYPE_FLOAT:
597  value->f = unbox_int(h);
598  return true;
600  value->d = unbox_int(h);
601  return true;
602  default:
603  return false;
604  }
605 
606  case PRIMITIVETYPE_LONG:
607  switch (type) {
608  case PRIMITIVETYPE_LONG:
609  value->l = unbox_long(h);
610  return true;
611  case PRIMITIVETYPE_FLOAT:
612  value->f = unbox_long(h);
613  return true;
615  value->d = unbox_long(h);
616  return true;
617  default:
618  return false;
619  }
620 
621  case PRIMITIVETYPE_FLOAT:
622  switch (type) {
623  case PRIMITIVETYPE_FLOAT:
624  value->f = unbox_float(h);
625  return true;
627  value->d = unbox_float(h);
628  return true;
629  default:
630  return false;
631  }
632 
634  switch (type) {
636  value->d = unbox_double(h);
637  return true;
638  default:
639  return false;
640  }
641 
642  default:
643  os::abort("Primitive::unbox_typed: Invalid primitive type %d", type);
644  return false;
645  }
646 }
647 
648 
649 /**
650  * Box a primitive type.
651  */
653 {
655 
656  if (h == NULL)
657  return NULL;
658 
659  java_lang_Boolean b(h);
660  b.set_value(value);
661 
662  return h;
663 }
664 
666 {
668 
669  if (h == NULL)
670  return NULL;
671 
672  java_lang_Byte b(h);
673  b.set_value(value);
674 
675  return h;
676 }
677 
679 {
681 
682  if (h == NULL)
683  return NULL;
684 
685  java_lang_Character c(h);
686  c.set_value(value);
687 
688  return h;
689 }
690 
692 {
694 
695  if (h == NULL)
696  return NULL;
697 
698  java_lang_Short s(h);
699  s.set_value(value);
700 
701  return h;
702 }
703 
705 {
707 
708  if (h == NULL)
709  return NULL;
710 
711  java_lang_Integer i(h);
712  i.set_value(value);
713 
714  return h;
715 }
716 
718 {
720 
721  if (h == NULL)
722  return NULL;
723 
724  java_lang_Long l(h);
725  l.set_value(value);
726 
727  return h;
728 }
729 
731 {
733 
734  if (h == NULL)
735  return NULL;
736 
737  java_lang_Float f(h);
738  f.set_value(value);
739 
740  return h;
741 }
742 
744 {
746 
747  if (h == NULL)
748  return NULL;
749 
750  java_lang_Double d(h);
751  d.set_value(value);
752 
753  return h;
754 }
755 
756 
757 
758 /**
759  * Unbox a primitive type.
760  */
761 
762 // template<class T> T Primitive::unbox(java_handle_t *h)
763 // {
764 // return java_lang_Boolean::get_value(h);
765 // }
766 
768 {
769  java_lang_Boolean b(h);
770  return b.get_value();
771 }
772 
774 {
775  java_lang_Byte b(h);
776  return b.get_value();
777 }
778 
780 {
781  java_lang_Character c(h);
782  return c.get_value();
783 }
784 
786 {
787  java_lang_Short s(h);
788  return s.get_value();
789 }
790 
792 {
793  java_lang_Integer i(h);
794  return i.get_value();
795 }
796 
798 {
799  java_lang_Long l(h);
800  return l.get_value();
801 }
802 
804 {
805  java_lang_Float f(h);
806  return f.get_value();
807 }
808 
810 {
811  java_lang_Double d(h);
812  return d.get_value();
813 }
814 
815 
816 /*
817  * These are local overrides for various environment variables in Emacs.
818  * Please do not remove this and leave it at the end of the file, where
819  * Emacs will automagically detect them.
820  * ---------------------------------------------------------------------
821  * Local variables:
822  * mode: c++
823  * indent-tabs-mode: t
824  * c-basic-offset: 4
825  * tab-width: 4
826  * End:
827  * vim:noexpandtab:sw=4:ts=4:
828  */
java/lang/Integer
static float unbox_float(java_handle_t *o)
Definition: primitive.cpp:803
java_object_t header
Definition: class.hpp:73
std::size_t index
dummy_java_lang_Class object
Definition: class.hpp:88
float f
Definition: global.hpp:56
double d
Definition: global.hpp:57
classinfo * class_java_lang_Long
Definition: globals.cpp:73
classinfo * load_newly_created_array(classinfo *c, classloader_t *loader)
Definition: loader.cpp:2094
java/lang/Float
static uint16_t unbox_char(java_handle_t *o)
Definition: primitive.cpp:779
static classinfo * get_class_by_type(int type)
Returns the primitive class of the given type.
Definition: primitive.cpp:253
void set_value(int16_t value)
classinfo * class_java_lang_Float
Definition: globals.cpp:74
void * a
Definition: global.hpp:58
int8_t get_value()
classinfo * class_java_lang_Short
Definition: globals.cpp:71
classinfo * super
Definition: class.hpp:102
static int32_t unbox_int(java_handle_t *o)
Definition: primitive.cpp:791
static int get_type_by_primitiveclass(classinfo *c)
Returns the primitive type of the given primitive-class.
Definition: primitive.cpp:370
classinfo * class_java_lang_Character
Definition: globals.cpp:70
s4 state
Definition: class.hpp:115
java/lang/Boolean
void set_value(float value)
void set_value(int64_t value)
classinfo * load_class_bootstrap(Utf8String name)
Definition: loader.cpp:1276
static java_handle_t * box(int type, imm_union value)
Box a primitive of the given type.
Definition: primitive.cpp:393
static classinfo * get_arrayclass_by_type(int type)
Returns the primitive array-class of the given type.
Definition: primitive.cpp:336
static classinfo * get_class_by_name(Utf8String name)
Returns the primitive class of the given class name.
Definition: primitive.cpp:231
JNIEnv jclass jobject const char * name
Definition: jvmti.h:312
static int16_t unbox_short(java_handle_t *o)
Definition: primitive.cpp:785
static imm_union unbox(java_handle_t *o)
Unbox a primitive of the given type.
Definition: primitive.cpp:442
#define TRACESUBSYSTEMINITIALIZATION(text)
Definition: options.hpp:258
classinfo * class_primitive
Definition: primitive.hpp:114
classinfo * class_wrap
Definition: primitive.hpp:113
java_handle_t * builtin_new(classinfo *c)
Definition: builtin.cpp:816
void vm_abort(const char *text,...)
Definition: vm.cpp:2586
#define LLNI_class_get(obj, variable)
Definition: llni.hpp:60
classinfo * class_java_lang_Byte
Definition: globals.cpp:69
static int get_type_by_wrapperclass(classinfo *c)
Returns the primitive type of the given wrapper-class.
Definition: primitive.cpp:349
static void initialize_table()
Fill the primitive type table with the primitive-type classes, array-classes and wrapper classes...
Definition: primitive.cpp:94
classinfo * class_java_lang_Class
Definition: globals.cpp:35
static uint8_t unbox_boolean(java_handle_t *o)
Unbox a primitive type.
Definition: primitive.cpp:767
java/lang/Character
void set_value(double value)
s4 flags
Definition: class.hpp:90
static Utf8String from_utf8(const char *, size_t)
Definition: utf8.cpp:335
MIIterator i
java/lang/Double
static double unbox_double(java_handle_t *o)
Definition: primitive.cpp:809
void set_value(int8_t value)
void set_value(int32_t value)
static void abort()
Definition: os.hpp:196
Utf8String name
Definition: primitive.hpp:112
java/lang/Long
void set_value(uint16_t value)
vftbl_t * vftbl
Definition: class.hpp:121
static int64_t unbox_long(java_handle_t *o)
Definition: primitive.cpp:797
int16_t get_value()
static void post_initialize_table()
Finish the primitive-type table initialization.
Definition: primitive.cpp:204
classinfo * class_java_lang_Integer
Definition: globals.cpp:72
classinfo * link_class(classinfo *c)
Definition: linker.cpp:378
static classinfo * get_arrayclass_by_name(Utf8String name)
Returns the primitive array-class of the given primitive class name.
Definition: primitive.cpp:314
static bool unbox_typed(java_handle_t *o, int type, imm_union *value)
Unbox a primitive of the given type.
Definition: primitive.cpp:508
void set_value(uint8_t value)
classinfo * class_java_lang_Double
Definition: globals.cpp:75
static int8_t unbox_byte(java_handle_t *o)
Definition: primitive.cpp:773
static classinfo * get_class_by_char(char ch)
Returns the primitive class of the given type.
Definition: primitive.cpp:266
java/lang/Byte
java/lang/Short
classinfo * class_create_classinfo(Utf8String classname)
Definition: class.cpp:145
primitivetypeinfo primitivetype_table[PRIMITIVETYPE_MAX]
Definition: primitive.cpp:59
vftbl_t * vftbl
Definition: global.hpp:264
classinfo * class_java_lang_Boolean
Definition: globals.cpp:68
int64_t get_value()
classinfo * arrayclass
Definition: primitive.hpp:118