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/_blockKlass.cpp.incl"
00026
00027 klassOop blockClosureKlass::blockKlassFor(int numberOfArguments) {
00028 switch (numberOfArguments) {
00029 case 0: return Universe::zeroArgumentBlockKlassObj(); break;
00030 case 1: return Universe::oneArgumentBlockKlassObj(); break;
00031 case 2: return Universe::twoArgumentBlockKlassObj(); break;
00032 case 3: return Universe::threeArgumentBlockKlassObj(); break;
00033 case 4: return Universe::fourArgumentBlockKlassObj(); break;
00034 case 5: return Universe::fiveArgumentBlockKlassObj(); break;
00035 case 6: return Universe::sixArgumentBlockKlassObj(); break;
00036 case 7: return Universe::sevenArgumentBlockKlassObj(); break;
00037 case 8: return Universe::eightArgumentBlockKlassObj(); break;
00038 case 9: return Universe::nineArgumentBlockKlassObj(); break;
00039 }
00040 fatal("cannot handle block with more than 9 arguments");
00041 return NULL;
00042 }
00043
00044 bool blockClosureKlass::oop_verify(oop obj) {
00045 bool flag = Klass::oop_verify(obj);
00046
00047 return flag;
00048 }
00049
00050 void set_blockClosureKlass_vtbl(Klass* k) {
00051 blockClosureKlass o;
00052 k->set_vtbl_value(o.vtbl_value());
00053 }
00054
00055 oop blockClosureKlass::allocateObject() {
00056 klassOop k = as_klassOop();
00057
00058 blockClosureOop obj =
00059 as_blockClosureOop(Universe::allocate(blockClosureOopDesc::object_size(), (memOop*)&k));
00060
00061 obj->initialize_header(false, k);
00062
00063
00064
00065 return obj;
00066 }
00067
00068 klassOop blockClosureKlass::create_subclass(mixinOop mixin, Format format) {
00069 return NULL;
00070 }
00071
00072 int blockClosureKlass::oop_scavenge_contents(oop obj) {
00073
00074 memOop(obj)->scavenge_header();
00075
00076 scavenge_oop((oop*) &blockClosureOop(obj)->addr()->_lexical_scope);
00077 return blockClosureOopDesc::object_size();
00078 }
00079
00080 int blockClosureKlass::oop_scavenge_tenured_contents(oop obj) {
00081
00082 memOop(obj)->scavenge_tenured_header();
00083
00084 scavenge_tenured_oop((oop*) &blockClosureOop(obj)->addr()->_lexical_scope);
00085 return blockClosureOopDesc::object_size();
00086 }
00087
00088 void blockClosureKlass::oop_follow_contents(oop obj) {
00089
00090 memOop(obj)->follow_header();
00091 MarkSweep::reverse_and_push((oop*) &blockClosureOop(obj)->addr()->_methodOrJumpAddr);
00092 MarkSweep::reverse_and_push((oop*) &blockClosureOop(obj)->addr()->_lexical_scope);
00093 }
00094
00095 void blockClosureKlass::oop_layout_iterate(oop obj, ObjectLayoutClosure* blk) {
00096
00097 memOop(obj)->layout_iterate_header(blk);
00098 blk->do_oop("method", (oop*) &blockClosureOop(obj)->addr()->_methodOrJumpAddr);
00099 blk->do_oop("scope", (oop*) &blockClosureOop(obj)->addr()->_lexical_scope);
00100 }
00101
00102 void blockClosureKlass::oop_oop_iterate(oop obj, OopClosure* blk) {
00103
00104 memOop(obj)->oop_iterate_header(blk);
00105 blk->do_oop((oop*) &blockClosureOop(obj)->addr()->_methodOrJumpAddr);
00106 blk->do_oop((oop*) &blockClosureOop(obj)->addr()->_lexical_scope);
00107 }
00108
00109 int blockClosureKlass::number_of_arguments() const {
00110 klassOop k = klassOop(this);
00111 if (k == Universe::zeroArgumentBlockKlassObj()) return 0;
00112 if (k == Universe::oneArgumentBlockKlassObj()) return 1;
00113 if (k == Universe::twoArgumentBlockKlassObj()) return 2;
00114 if (k == Universe::threeArgumentBlockKlassObj()) return 3;
00115 if (k == Universe::fourArgumentBlockKlassObj()) return 4;
00116 if (k == Universe::fiveArgumentBlockKlassObj()) return 5;
00117 if (k == Universe::sixArgumentBlockKlassObj()) return 6;
00118 if (k == Universe::sevenArgumentBlockKlassObj()) return 7;
00119 if (k == Universe::eightArgumentBlockKlassObj()) return 8;
00120 if (k == Universe::nineArgumentBlockKlassObj()) return 9;
00121 fatal("unknown block closure class");
00122 return 0;
00123 }
00124
00125 void blockClosureKlass::oop_print_value_on(oop obj, outputStream* st) {
00126 if (PrintObjectID) {
00127 memOop(obj)->print_id_on(st);
00128 st->print("-");
00129 }
00130 st->print("[] in ");
00131 methodOop method = blockClosureOop(obj)->method();
00132 method->home()->selector()->print_symbol_on(st);
00133 st->print("(scope = ");
00134 blockClosureOop(obj)->lexical_scope()->print_value_on(st);
00135 st->print(")");
00136 }
00137
00138 void set_contextKlass_vtbl(Klass* k) {
00139 contextKlass o;
00140 k->set_vtbl_value(o.vtbl_value());
00141 }
00142
00143 oop contextKlass::allocateObjectSize(int num_of_temps) {
00144 klassOop k = as_klassOop();
00145 int obj_size = contextOopDesc::header_size() + num_of_temps;
00146
00147 contextOop obj = as_contextOop(Universe::allocate(obj_size, (memOop*)&k));
00148
00149 obj->set_klass_field(k);
00150
00151
00152 obj->set_mark(markOopDesc::tagged_prototype()->set_hash(num_of_temps + 1));
00153
00154 memOop(obj)->initialize_body(contextOopDesc::header_size(), obj_size);
00155 return obj;
00156 }
00157
00158 klassOop contextKlass::create_subclass(mixinOop mixin, Format format) {
00159 return NULL;
00160 }
00161
00162 contextOop contextKlass::allocate_context(int num_of_temps) {
00163 contextKlass* ck = (contextKlass*) contextKlassObj->klass_part();
00164 return contextOop(ck->allocateObjectSize(num_of_temps));
00165 }
00166
00167 int contextKlass::oop_scavenge_contents(oop obj) {
00168 int size = contextOop(obj)->object_size();
00169
00170 memOop(obj)->scavenge_header();
00171 scavenge_oop((oop*) &contextOop(obj)->addr()->_parent);
00172
00173 memOop(obj)->scavenge_body(contextOopDesc::header_size(), size);
00174 return size;
00175 }
00176
00177 int contextKlass::oop_scavenge_tenured_contents(oop obj) {
00178 int size = contextOop(obj)->object_size();
00179
00180 memOop(obj)->scavenge_tenured_header();
00181 scavenge_tenured_oop((oop*) &contextOop(obj)->addr()->_parent);
00182
00183 memOop(obj)->scavenge_tenured_body(contextOopDesc::header_size(), size);
00184 return size;
00185 }
00186
00187 void contextKlass::oop_follow_contents(oop obj) {
00188
00189 memOop(obj)->follow_header();
00190 MarkSweep::reverse_and_push((oop*) &contextOop(obj)->addr()->_parent);
00191
00192
00193
00194
00195
00196 oop* root_or_mark = (oop*) memOop(obj)->mark();
00197 while (!oop(root_or_mark)->is_mark()) {
00198 root_or_mark = (oop*) *root_or_mark;
00199 }
00200 int len = markOop(root_or_mark)->hash() - 1;
00201 memOop(obj)->follow_body(contextOopDesc::header_size(), contextOopDesc::header_size() + len);
00202 }
00203
00204 void contextKlass::oop_oop_iterate(oop obj, OopClosure* blk) {
00205
00206 memOop(obj)->oop_iterate_header(blk);
00207 blk->do_oop((oop*) &contextOop(obj)->addr()->_parent);
00208
00209 memOop(obj)->oop_iterate_body(blk, contextOopDesc::header_size(), oop_size(obj));
00210 }
00211
00212 void contextKlass::oop_layout_iterate(oop obj, ObjectLayoutClosure* blk) {
00213
00214 memOop(obj)->layout_iterate_header(blk);
00215 blk->do_oop("home", (oop*) &contextOop(obj)->addr()->_parent);
00216
00217 memOop(obj)->layout_iterate_body(blk, contextOopDesc::header_size(), oop_size(obj));
00218 }
00219
00220 int contextKlass::oop_size(oop obj) const {
00221 return contextOop(obj)->object_size();
00222 }
00223
00224 void contextKlass::oop_print_value_on(oop obj, outputStream* st) {
00225 memOopKlass::oop_print_value_on(obj, st);
00226 assert(obj->is_context(), "must be context");
00227 contextOop con = contextOop(obj);
00228 st->print("{");
00229 con->print_home_on(st);
00230 st->print(" |%d}", con->length());
00231 }
00232
00233 void contextKlass::oop_print_on(oop obj, outputStream* st) {
00234 memOopKlass::oop_print_value_on(obj, st);
00235 st->cr();
00236 assert(obj->is_context(), "must be context");
00237 contextOop con = contextOop(obj);
00238 st->print(" home: ");
00239 con->print_home_on(st);
00240 st->cr();
00241 for (int index = 0; index < con->length(); index++) {
00242 st->print(" - %d: ", index);
00243 con->obj_at(index)->print_value_on(st);
00244 st->cr();
00245 }
00246 }
00247