blockKlass.cpp

Go to the documentation of this file.
00001 /* Copyright 1994, 1995 LongView Technologies L.L.C. $Revision: 1.36 $ */
00002 /* Copyright (c) 2006, Sun Microsystems, Inc.
00003 All rights reserved.
00004 
00005 Redistribution and use in source and binary forms, with or without modification, are permitted provided that the 
00006 following conditions are met:
00007 
00008     * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
00009     * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following 
00010           disclaimer in the documentation and/or other materials provided with the distribution.
00011     * Neither the name of Sun Microsystems nor the names of its contributors may be used to endorse or promote products derived 
00012           from this software without specific prior written permission.
00013 
00014 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT 
00015 NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL 
00016 THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
00017 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
00018 INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE 
00019 OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE
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   // FIX LATER
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   // allocate
00058   blockClosureOop obj =
00059     as_blockClosureOop(Universe::allocate(blockClosureOopDesc::object_size(), (memOop*)&k));
00060   // header
00061   obj->initialize_header(false, k);
00062   // %not initialized by the interpreter
00063   // obj->addr()->_method         = (methodOop)      smiOop_zero;
00064   // obj->addr()->_lexical_scope  = (heapContextOop) smiOop_zero;
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   // header
00074   memOop(obj)->scavenge_header();
00075   // %note _method can be ignored since methods are tenured 
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   // header
00082   memOop(obj)->scavenge_tenured_header();
00083   // %note _method can be ignored since methods are tenured 
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   // header
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   // header
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   // header
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);          // C++ bogosity alert
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   // allocate
00147   contextOop obj = as_contextOop(Universe::allocate(obj_size, (memOop*)&k));
00148   // header
00149   obj->set_klass_field(k);
00150   //%clean the up later
00151   //  hash value must by convention be different from 0 (check markOop.hpp)
00152   obj->set_mark(markOopDesc::tagged_prototype()->set_hash(num_of_temps + 1));
00153   // indexables
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   // header
00170   memOop(obj)->scavenge_header();
00171   scavenge_oop((oop*) &contextOop(obj)->addr()->_parent);
00172   // temporaries
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   // header
00180   memOop(obj)->scavenge_tenured_header();
00181   scavenge_tenured_oop((oop*) &contextOop(obj)->addr()->_parent);
00182   // temporaries
00183   memOop(obj)->scavenge_tenured_body(contextOopDesc::header_size(), size);
00184   return size;
00185 }
00186 
00187 void contextKlass::oop_follow_contents(oop obj) {
00188   // header
00189   memOop(obj)->follow_header();
00190   MarkSweep::reverse_and_push((oop*) &contextOop(obj)->addr()->_parent);
00191   // temporaries
00192 
00193   // we have to find the header word in order to compute object size.
00194   // %implementation note:
00195   //   implement this another way if possible
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   // header
00206   memOop(obj)->oop_iterate_header(blk);
00207   blk->do_oop((oop*) &contextOop(obj)->addr()->_parent);
00208   // temporaries
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   // header
00214   memOop(obj)->layout_iterate_header(blk);
00215   blk->do_oop("home", (oop*) &contextOop(obj)->addr()->_parent);
00216   // temporaries
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 

Generated on Mon Oct 9 13:37:03 2006 for Strongtalk VM by  doxygen 1.4.7