00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040 const int vtbl_position = 0;
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051 class Klass : ValueObj {
00052 protected:
00053 smiOop _non_indexable_size;
00054 smiOop _has_untagged_contents;
00055 objArrayOop _classVars;
00056 objArrayOop _methods;
00057 klassOop _superKlass;
00058 mixinOop _mixin;
00059
00060 public:
00061 friend klassOop as_klassOop(void* p) { return klassOop(as_memOop(p)); }
00062
00063
00064 klassOop as_klassOop() const {
00065
00066 return (klassOop) (((char*) this) - sizeof(memOopDesc) + Mem_Tag);
00067 }
00068
00069 smi non_indexable_size() const {
00070 return _non_indexable_size->value(); }
00071 void set_non_indexable_size(smi size) {
00072 _non_indexable_size = as_smiOop(size); }
00073
00074 bool has_untagged_contents() const { return _has_untagged_contents == smiOop_one; }
00075 void set_untagged_contents(bool v) { _has_untagged_contents = v ? smiOop_one : smiOop_zero; }
00076
00077 objArrayOop classVars() const { return _classVars; }
00078 void set_classVars(objArrayOop c) { STORE_OOP(&_classVars, c); }
00079
00080 objArrayOop methods() const { return _methods; }
00081 void set_methods(objArrayOop m) { STORE_OOP(&_methods, m); }
00082
00083 klassOop superKlass() const { return _superKlass; }
00084 void set_superKlass(klassOop super) { STORE_OOP(&_superKlass, super); }
00085
00086 mixinOop mixin() const { return _mixin; }
00087 void set_mixin(mixinOop m) { STORE_OOP(&_mixin, m); }
00088
00089
00090 bool has_superKlass() const { return oop(superKlass()) != nilObj; }
00091
00092 public:
00093 int number_of_methods() const;
00094 methodOop method_at(int index) const;
00095 void add_method(methodOop method);
00096 methodOop remove_method_at(int index);
00097
00098 int number_of_classVars() const;
00099 associationOop classVar_at(int index) const;
00100 void add_classVar(associationOop assoc);
00101 associationOop remove_classVar_at(int index);
00102 bool includes_classVar(symbolOop name);
00103
00104
00105 int vtbl_value() const { return ((int*) this)[vtbl_position]; }
00106 void set_vtbl_value(int vtbl) {
00107 assert(vtbl % 4 == 0, "VTBL should be aligned");
00108 ((int*) this)[vtbl_position] = vtbl; }
00109
00110 void bootstrap_klass_part_one(bootstrap* bs);
00111 void bootstrap_klass_part_two(bootstrap* bs);
00112
00113 public:
00114
00115 void fixup_after_snapshot_read();
00116
00117
00118 virtual bool can_inline_allocation() const { return false; }
00119
00120
00121
00122
00123
00124 virtual bool can_have_instance_variables() const { return false; }
00125 virtual bool can_be_subclassed() const { return false; }
00126 bool is_specialized_class() const;
00127
00128
00129 bool is_named_class() const;
00130
00131
00132 int size() const { return sizeof(Klass)/sizeof(oop); }
00133
00134 virtual oop allocateObject();
00135 virtual oop allocateObjectSize(int size);
00136
00137 enum Format {
00138 no_klass,
00139 mem_klass,
00140 association_klass,
00141 blockClosure_klass,
00142 byteArray_klass,
00143 symbol_klass,
00144 context_klass,
00145 doubleByteArray_klass,
00146 doubleValueArray_klass,
00147 double_klass,
00148 klass_klass,
00149 method_klass,
00150 mixin_klass,
00151 objArray_klass,
00152 weakArray_klass,
00153 process_klass,
00154 vframe_klass,
00155 proxy_klass,
00156 smi_klass,
00157 special_klass
00158 };
00159
00160
00161 virtual Format format() { return no_klass; }
00162
00163 static Format format_from_symbol(symbolOop format);
00164 static char* name_from_format(Format format);
00165
00166
00167 bool has_same_layout_as(klassOop klass);
00168
00169
00170 virtual klassOop create_subclass(mixinOop mixin, Format format);
00171
00172 protected:
00173 static klassOop create_generic_class(klassOop super_class, mixinOop mixin, int vtbl);
00174
00175 public:
00176
00177 virtual char* name() const { return ""; }
00178 void print_klass();
00179 void print_name_on(outputStream* st);
00180
00181
00182 inline methodOop local_lookup(symbolOop selector);
00183 methodOop lookup(symbolOop selector);
00184 bool is_method_holder_for(methodOop method);
00185 klassOop lookup_method_holder_for(methodOop method);
00186
00187
00188 void flush_methods();
00189
00190
00191 associationOop local_lookup_class_var(symbolOop name);
00192 associationOop lookup_class_var(symbolOop name);
00193
00194
00195
00196
00197
00198 int lookup_inst_var(symbolOop name) const;
00199
00200
00201
00202 symbolOop inst_var_name_at(int offset) const;
00203
00204
00205 int number_of_instance_variables() const;
00206
00207
00208 void mark_for_schema_change();
00209 bool is_marked_for_schema_change();
00210
00211 void initialize();
00212
00213
00214
00215 public:
00216
00217 virtual int oop_size(oop obj) const { return non_indexable_size(); }
00218
00219
00220 virtual int oop_header_size() const { return 0; }
00221
00222
00223 virtual bool oop_verify(oop obj);
00224
00225 virtual int oop_scavenge_contents(oop obj);
00226 virtual int oop_scavenge_tenured_contents(oop obj);
00227 virtual void oop_follow_contents(oop obj);
00228
00229
00230 virtual bool oop_is_smi() const { return false; }
00231 virtual bool oop_is_double() const { return false; }
00232 virtual bool oop_is_block() const { return false; }
00233 virtual bool oop_is_byteArray() const { return false; }
00234 virtual bool oop_is_doubleByteArray() const { return false; }
00235 virtual bool oop_is_doubleValueArray() const { return false; }
00236 virtual bool oop_is_symbol() const { return false; }
00237 virtual bool oop_is_objArray() const { return false; }
00238 virtual bool oop_is_weakArray() const { return false; }
00239 virtual bool oop_is_klass() const { return false; }
00240 virtual bool oop_is_process() const { return false; }
00241 virtual bool oop_is_vframe() const { return false; }
00242 virtual bool oop_is_method() const { return false; }
00243 virtual bool oop_is_proxy() const { return false; }
00244 virtual bool oop_is_mixin() const { return false; }
00245 virtual bool oop_is_association() const { return false; }
00246 virtual bool oop_is_context() const { return false; }
00247 virtual bool oop_is_message() const { return false; }
00248 virtual bool oop_is_indexable() const { return false; }
00249
00250
00251 virtual oop oop_primitive_allocate(oop obj);
00252 virtual oop oop_primitive_allocate_size(oop obj, int size);
00253 virtual oop oop_shallow_copy(oop obj, bool tenured);
00254
00255
00256 virtual void oop_print_on (oop obj, outputStream* st);
00257 virtual void oop_short_print_on(oop obj, outputStream* st);
00258 virtual void oop_print_value_on(oop obj, outputStream* st);
00259
00260
00261 virtual void oop_oop_iterate(oop obj, OopClosure* blk);
00262 virtual void oop_layout_iterate(oop obj, ObjectLayoutClosure* blk);
00263
00264 friend klassKlass;
00265 };