Mercurial > hg > truffle
comparison src/share/vm/classfile/javaClasses.cpp @ 665:c89f86385056
6814659: separable cleanups and subroutines for 6655638
Summary: preparatory but separable changes for method handles
Reviewed-by: kvn, never
author | jrose |
---|---|
date | Fri, 20 Mar 2009 23:19:36 -0700 |
parents | 0fbdb4381b99 |
children | e5b0439ef4ae |
comparison
equal
deleted
inserted
replaced
647:bd441136a5ce | 665:c89f86385056 |
---|---|
237 symbolHandle java_lang_String::as_symbol(Handle java_string, TRAPS) { | 237 symbolHandle java_lang_String::as_symbol(Handle java_string, TRAPS) { |
238 oop obj = java_string(); | 238 oop obj = java_string(); |
239 typeArrayOop value = java_lang_String::value(obj); | 239 typeArrayOop value = java_lang_String::value(obj); |
240 int offset = java_lang_String::offset(obj); | 240 int offset = java_lang_String::offset(obj); |
241 int length = java_lang_String::length(obj); | 241 int length = java_lang_String::length(obj); |
242 | 242 jchar* base = value->char_at_addr(offset); |
243 ResourceMark rm(THREAD); | 243 symbolOop sym = SymbolTable::lookup_unicode(base, length, THREAD); |
244 symbolHandle result; | 244 return symbolHandle(THREAD, sym); |
245 | 245 } |
246 if (length > 0) { | 246 |
247 int utf8_length = UNICODE::utf8_length(value->char_at_addr(offset), length); | 247 symbolOop java_lang_String::as_symbol_or_null(oop java_string) { |
248 char* chars = NEW_RESOURCE_ARRAY(char, utf8_length + 1); | 248 typeArrayOop value = java_lang_String::value(java_string); |
249 UNICODE::convert_to_utf8(value->char_at_addr(offset), length, chars); | 249 int offset = java_lang_String::offset(java_string); |
250 // Allocate the symbol | 250 int length = java_lang_String::length(java_string); |
251 result = oopFactory::new_symbol_handle(chars, utf8_length, CHECK_(symbolHandle())); | 251 jchar* base = value->char_at_addr(offset); |
252 } else { | 252 return SymbolTable::probe_unicode(base, length); |
253 result = oopFactory::new_symbol_handle("", 0, CHECK_(symbolHandle())); | 253 } |
254 } | 254 |
255 return result; | |
256 } | |
257 | 255 |
258 int java_lang_String::utf8_length(oop java_string) { | 256 int java_lang_String::utf8_length(oop java_string) { |
259 typeArrayOop value = java_lang_String::value(java_string); | 257 typeArrayOop value = java_lang_String::value(java_string); |
260 int offset = java_lang_String::offset(java_string); | 258 int offset = java_lang_String::offset(java_string); |
261 int length = java_lang_String::length(java_string); | 259 int length = java_lang_String::length(java_string); |
383 assert(k == NULL || k->is_klass(), "type check"); | 381 assert(k == NULL || k->is_klass(), "type check"); |
384 return k; | 382 return k; |
385 } | 383 } |
386 | 384 |
387 | 385 |
386 void java_lang_Class::print_signature(oop java_class, outputStream* st) { | |
387 assert(java_lang_Class::is_instance(java_class), "must be a Class object"); | |
388 symbolOop name = NULL; | |
389 bool is_instance = false; | |
390 if (is_primitive(java_class)) { | |
391 name = vmSymbols::type_signature(primitive_type(java_class)); | |
392 } else { | |
393 klassOop k = as_klassOop(java_class); | |
394 is_instance = Klass::cast(k)->oop_is_instance(); | |
395 name = Klass::cast(k)->name(); | |
396 } | |
397 if (name == NULL) { | |
398 st->print("<null>"); | |
399 return; | |
400 } | |
401 if (is_instance) st->print("L"); | |
402 st->write((char*) name->base(), (int) name->utf8_length()); | |
403 if (is_instance) st->print(";"); | |
404 } | |
405 | |
406 symbolOop java_lang_Class::as_signature(oop java_class, bool intern_if_not_found, TRAPS) { | |
407 assert(java_lang_Class::is_instance(java_class), "must be a Class object"); | |
408 symbolOop name = NULL; | |
409 if (is_primitive(java_class)) { | |
410 return vmSymbols::type_signature(primitive_type(java_class)); | |
411 } else { | |
412 klassOop k = as_klassOop(java_class); | |
413 if (!Klass::cast(k)->oop_is_instance()) { | |
414 return Klass::cast(k)->name(); | |
415 } else { | |
416 ResourceMark rm; | |
417 const char* sigstr = Klass::cast(k)->signature_name(); | |
418 int siglen = (int) strlen(sigstr); | |
419 if (!intern_if_not_found) | |
420 return SymbolTable::probe(sigstr, siglen); | |
421 else | |
422 return oopFactory::new_symbol(sigstr, siglen, THREAD); | |
423 } | |
424 } | |
425 } | |
426 | |
427 | |
388 klassOop java_lang_Class::array_klass(oop java_class) { | 428 klassOop java_lang_Class::array_klass(oop java_class) { |
389 klassOop k = klassOop(java_class->obj_field(array_klass_offset)); | 429 klassOop k = klassOop(java_class->obj_field(array_klass_offset)); |
390 assert(k == NULL || k->is_klass() && Klass::cast(k)->oop_is_javaArray(), "should be array klass"); | 430 assert(k == NULL || k->is_klass() && Klass::cast(k)->oop_is_javaArray(), "should be array klass"); |
391 return k; | 431 return k; |
392 } | 432 } |
410 java_class->obj_field_put(resolved_constructor_offset, constructor); | 450 java_class->obj_field_put(resolved_constructor_offset, constructor); |
411 } | 451 } |
412 | 452 |
413 | 453 |
414 bool java_lang_Class::is_primitive(oop java_class) { | 454 bool java_lang_Class::is_primitive(oop java_class) { |
455 // should assert: | |
456 //assert(java_lang_Class::is_instance(java_class), "must be a Class object"); | |
415 klassOop k = klassOop(java_class->obj_field(klass_offset)); | 457 klassOop k = klassOop(java_class->obj_field(klass_offset)); |
416 return k == NULL; | 458 return k == NULL; |
417 } | 459 } |
418 | 460 |
419 | 461 |
427 } else { | 469 } else { |
428 assert(java_class == Universe::void_mirror(), "only valid non-array primitive"); | 470 assert(java_class == Universe::void_mirror(), "only valid non-array primitive"); |
429 } | 471 } |
430 assert(Universe::java_mirror(type) == java_class, "must be consistent"); | 472 assert(Universe::java_mirror(type) == java_class, "must be consistent"); |
431 return type; | 473 return type; |
474 } | |
475 | |
476 BasicType java_lang_Class::as_BasicType(oop java_class, klassOop* reference_klass) { | |
477 assert(java_lang_Class::is_instance(java_class), "must be a Class object"); | |
478 if (is_primitive(java_class)) { | |
479 if (reference_klass != NULL) | |
480 (*reference_klass) = NULL; | |
481 return primitive_type(java_class); | |
482 } else { | |
483 if (reference_klass != NULL) | |
484 (*reference_klass) = as_klassOop(java_class); | |
485 return T_OBJECT; | |
486 } | |
432 } | 487 } |
433 | 488 |
434 | 489 |
435 oop java_lang_Class::primitive_mirror(BasicType t) { | 490 oop java_lang_Class::primitive_mirror(BasicType t) { |
436 oop mirror = Universe::java_mirror(t); | 491 oop mirror = Universe::java_mirror(t); |
1983 break; | 2038 break; |
1984 default: | 2039 default: |
1985 return T_ILLEGAL; | 2040 return T_ILLEGAL; |
1986 } // end switch | 2041 } // end switch |
1987 return type; | 2042 return type; |
2043 } | |
2044 | |
2045 | |
2046 void java_lang_boxing_object::print(BasicType type, jvalue* value, outputStream* st) { | |
2047 switch (type) { | |
2048 case T_BOOLEAN: st->print("%s", value->z ? "true" : "false"); break; | |
2049 case T_CHAR: st->print("%d", value->c); break; | |
2050 case T_BYTE: st->print("%d", value->b); break; | |
2051 case T_SHORT: st->print("%d", value->s); break; | |
2052 case T_INT: st->print("%d", value->i); break; | |
2053 case T_LONG: st->print(INT64_FORMAT, value->j); break; | |
2054 case T_FLOAT: st->print("%f", value->f); break; | |
2055 case T_DOUBLE: st->print("%lf", value->d); break; | |
2056 default: st->print("type %d?", type); break; | |
2057 } | |
1988 } | 2058 } |
1989 | 2059 |
1990 | 2060 |
1991 // Support for java_lang_ref_Reference | 2061 // Support for java_lang_ref_Reference |
1992 oop java_lang_ref_Reference::pending_list_lock() { | 2062 oop java_lang_ref_Reference::pending_list_lock() { |