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