00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 # include "incls/_precompiled.incl"
00025 # include "incls/_byteArrayKlass.cpp.incl"
00026 # include <ctype.h>
00027
00028 oop byteArrayKlass::allocateObject() {
00029 assert(!can_inline_allocation(), "using nonstandard allocation");
00030 fatal("should never call allocateObject in byteArrayKlass");
00031 return badOop;
00032 }
00033
00034 oop byteArrayKlass::allocateObjectSize(int size) {
00035 klassOop k = as_klassOop();
00036 int ni_size = non_indexable_size();
00037 int obj_size = ni_size + 1 + roundTo(size, oopSize) / oopSize;
00038
00039 byteArrayOop obj = as_byteArrayOop(Universe::allocate(obj_size, (memOop*)&k));
00040
00041 memOop(obj)->initialize_header(true, k);
00042
00043 memOop(obj)->initialize_body(memOopDesc::header_size(), ni_size);
00044
00045 oop* base = (oop*) obj->addr();
00046 oop* end = base + obj_size;
00047
00048 base[ni_size] = as_smiOop(size);
00049
00050
00051 base = &base[ni_size+1];
00052 while (base < end) *base++ = (oop) 0;
00053 return obj;
00054 }
00055
00056 klassOop byteArrayKlass::create_subclass(mixinOop mixin, Format format) {
00057 if (format == mem_klass || format == byteArray_klass) {
00058 return byteArrayKlass::create_class(as_klassOop(), mixin);
00059 }
00060 return NULL;
00061 }
00062
00063 klassOop byteArrayKlass::create_class(klassOop super_class, mixinOop mixin) {
00064 byteArrayKlass o;
00065 return create_generic_class(super_class, mixin, o.vtbl_value());
00066 }
00067
00068 void byteArrayKlass::initialize_object(byteArrayOop obj, char* value, int len){
00069 for (int index = 1; index <= len; index++) {
00070 obj->byte_at_put(index, value[index-1]);
00071 }
00072 }
00073
00074 void set_byteArrayKlass_vtbl(Klass* k) {
00075 byteArrayKlass o;
00076 k->set_vtbl_value(o.vtbl_value());
00077 }
00078
00079 bool byteArrayKlass::oop_verify(oop obj) {
00080 assert_byteArray(obj,"Argument must be byteArray");
00081 return byteArrayOop(obj)->verify();
00082 }
00083
00084 void byteArrayKlass::oop_print_value_on(oop obj, outputStream* st) {
00085 assert_byteArray(obj,"Argument must be byteArray");
00086 byteArrayOop array = byteArrayOop(obj);
00087 int len = array->length();
00088 int n = min(MaxElementPrintSize, len);
00089 st->print("'");
00090 for(int index = 1; index <= n; index++) {
00091 char c = array->byte_at(index);
00092 if (isprint(c)) st->print("%c", c);
00093 else st->print("\\%o", c);
00094 }
00095 if (n < len) st->print("...");
00096 st->print("'");
00097 }
00098
00099 void byteArrayKlass::oop_layout_iterate(oop obj, ObjectLayoutClosure* blk) {
00100 u_char* p = byteArrayOop(obj)->bytes();
00101 oop* l = byteArrayOop(obj)->length_addr();
00102 int len = byteArrayOop(obj)->length();
00103
00104 memOopKlass::oop_layout_iterate(obj, blk);
00105
00106 blk->begin_indexables();
00107 blk->do_oop("length", l);
00108 for (int index = 1; index <= len; index++) {
00109 blk->do_indexable_byte(index, p++);
00110 }
00111 blk->end_indexables();
00112 }
00113
00114 void byteArrayKlass::oop_oop_iterate(oop obj, OopClosure* blk) {
00115 oop* l = byteArrayOop(obj)->length_addr();
00116
00117 memOopKlass::oop_oop_iterate(obj, blk);
00118 blk->do_oop(l);
00119 }
00120
00121 int byteArrayKlass::oop_scavenge_contents(oop obj) {
00122
00123 memOopKlass::oop_scavenge_contents(obj);
00124 return object_size(byteArrayOop(obj)->length());
00125 }
00126
00127 int byteArrayKlass::oop_scavenge_tenured_contents(oop obj) {
00128
00129 memOopKlass::oop_scavenge_tenured_contents(obj);
00130 return object_size(byteArrayOop(obj)->length());
00131 }