00001 /* Copyright 1994, 1995 LongView Technologies L.L.C. $Revision: 1.30 $ */ 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/_behavior_prims.cpp.incl" 00026 00027 TRACE_FUNC(TraceBehaviorPrims, "behavior") 00028 00029 int behaviorPrimitives::number_of_calls; 00030 00031 #define ASSERT_RECEIVER assert(receiver->is_klass(), "receiver must klass") 00032 00033 PRIM_DECL_1(behaviorPrimitives::allocate, oop receiver) { 00034 PROLOGUE_1("allocate", receiver) 00035 ASSERT_RECEIVER; 00036 return receiver->primitive_allocate(); 00037 } 00038 00039 PRIM_DECL_1(behaviorPrimitives::superclass, oop receiver) { 00040 PROLOGUE_1("superclass", receiver); 00041 ASSERT_RECEIVER; 00042 return klassOop(receiver)->klass_part()->superKlass(); 00043 } 00044 00045 PRIM_DECL_1(behaviorPrimitives::superclass_of, oop klass) { 00046 PROLOGUE_1("superclass_of", klass); 00047 if (!klass->is_klass()) 00048 return markSymbol(vmSymbols::first_argument_has_wrong_type()); 00049 return klassOop(klass)->klass_part()->superKlass(); 00050 } 00051 00052 PRIM_DECL_1(behaviorPrimitives::mixinOf, oop behavior) { 00053 PROLOGUE_1("mixinOf", behavior); 00054 if (!behavior->is_klass()) 00055 return markSymbol(vmSymbols::first_argument_has_wrong_type()); 00056 00057 return klassOop(behavior)->klass_part()->mixin(); 00058 } 00059 00060 PRIM_DECL_1(behaviorPrimitives::headerSize, oop behavior) { 00061 PROLOGUE_1("headerSize", behavior); 00062 if (!behavior->is_klass()) 00063 return markSymbol(vmSymbols::first_argument_has_wrong_type()); 00064 00065 return as_smiOop(klassOop(behavior)->klass_part()->oop_header_size()); 00066 } 00067 00068 PRIM_DECL_1(behaviorPrimitives::nonIndexableSize, oop behavior) { 00069 PROLOGUE_1("nonIndexableSize", behavior); 00070 if (!behavior->is_klass()) 00071 return markSymbol(vmSymbols::first_argument_has_wrong_type()); 00072 00073 return as_smiOop(klassOop(behavior)->klass_part()->non_indexable_size()); 00074 } 00075 00076 PRIM_DECL_1(behaviorPrimitives::is_specialized_class, oop behavior) { 00077 PROLOGUE_1("is_specialized_class", behavior); 00078 if (!behavior->is_klass()) 00079 return markSymbol(vmSymbols::first_argument_has_wrong_type()); 00080 00081 return klassOop(behavior)->klass_part()->is_specialized_class() ? trueObj : falseObj; 00082 } 00083 00084 PRIM_DECL_1(behaviorPrimitives::can_be_subclassed, oop behavior) { 00085 PROLOGUE_1("can_be_subclassed", behavior); 00086 if (!behavior->is_klass()) 00087 return markSymbol(vmSymbols::first_argument_has_wrong_type()); 00088 00089 return klassOop(behavior)->klass_part()->can_be_subclassed() ? trueObj : falseObj; 00090 } 00091 00092 PRIM_DECL_1(behaviorPrimitives::can_have_instance_variables, oop behavior) { 00093 PROLOGUE_1("can_have_instance_variables", behavior); 00094 if (!behavior->is_klass()) 00095 return markSymbol(vmSymbols::first_argument_has_wrong_type()); 00096 00097 return klassOop(behavior)->klass_part()->can_have_instance_variables() ? trueObj : falseObj; 00098 } 00099 00100 // OPERATIONS FOR CLASS VARIABLES 00101 00102 PRIM_DECL_2(behaviorPrimitives::classVariableAt, oop behavior, oop index) { 00103 PROLOGUE_2("classVariableAt", behavior, index); 00104 if (!behavior->is_klass()) 00105 return markSymbol(vmSymbols::first_argument_has_wrong_type()); 00106 if (!index->is_smi()) 00107 return markSymbol(vmSymbols::second_argument_has_wrong_type()); 00108 00109 int i = smiOop(index)->value(); 00110 if (i > 0 && i <= klassOop(behavior)->klass_part()->number_of_classVars()) 00111 return klassOop(behavior)->klass_part()->classVar_at(i); 00112 return markSymbol(vmSymbols::out_of_bounds()); 00113 } 00114 00115 PRIM_DECL_1(behaviorPrimitives::classVariables, oop behavior) { 00116 PROLOGUE_1("classVariables", behavior); 00117 if (!behavior->is_klass()) 00118 return markSymbol(vmSymbols::first_argument_has_wrong_type()); 00119 return klassOop(behavior)->klass_part()->classVars(); 00120 } 00121 00122 // OPERATIONS FOR METHODS 00123 00124 PRIM_DECL_2(behaviorPrimitives::printMethod, oop receiver, oop name){ 00125 PROLOGUE_2("printMethod", receiver, name); 00126 ASSERT_RECEIVER; 00127 if (!name->is_byteArray()) 00128 return markSymbol(vmSymbols::first_argument_has_wrong_type()); 00129 00130 methodOop m = klassOop(receiver)->klass_part()->lookup(symbolOop(name)); 00131 if (!m) return markSymbol(vmSymbols::not_found()); 00132 m->print_codes(); 00133 return receiver; 00134 } 00135 00136 /* 00137 00138 PRIM_DECL_1(behaviorPrimitives::new0, oop receiver){ 00139 PROLOGUE_1("new0", receiver); 00140 memOop klass = memOop(receiver); 00141 // allocate 00142 memOop obj = as_memOop(Universe::allocate(memOopDesc::header_size(), &klass)); 00143 // header 00144 obj->initialize_header(false, klassOop(klass)); 00145 return obj; 00146 } 00147 00148 PRIM_DECL_1(behaviorPrimitives::new1, oop receiver){ 00149 PROLOGUE_1("new1", receiver); 00150 memOop klass = memOop(receiver); 00151 // allocate 00152 memOop obj = as_memOop(Universe::allocate(memOopDesc::header_size() + 1, &klass)); 00153 // header 00154 obj->initialize_header(false, klassOop(klass)); 00155 // initialize 1 instance variable 00156 oop value = nilObj; 00157 Universe::store(obj->oops(memOopDesc::header_size() + 0), value, false); 00158 return obj; 00159 } 00160 00161 PRIM_DECL_1(behaviorPrimitives::new2, oop receiver){ 00162 PROLOGUE_1("new2", receiver); 00163 memOop klass = memOop(receiver); 00164 // allocate 00165 memOop obj = as_memOop(Universe::allocate(memOopDesc::header_size() + 2, &klass)); 00166 // header 00167 obj->initialize_header(false, klassOop(klass)); 00168 // initialize 2 instance variable 00169 oop value = nilObj; 00170 Universe::store(obj->oops(memOopDesc::header_size() + 0), value, false); 00171 Universe::store(obj->oops(memOopDesc::header_size() + 1), value, false); 00172 return obj; 00173 } 00174 00175 PRIM_DECL_1(behaviorPrimitives::new3, oop receiver){ 00176 PROLOGUE_1("new3", receiver); 00177 memOop klass = memOop(receiver); 00178 // allocate 00179 memOop obj = as_memOop(Universe::allocate(memOopDesc::header_size() + 3, &klass)); 00180 // header 00181 obj->initialize_header(false, klassOop(klass)); 00182 // initialize 3 instance variable 00183 oop value = nilObj; 00184 Universe::store(obj->oops(memOopDesc::header_size() + 0), value, false); 00185 Universe::store(obj->oops(memOopDesc::header_size() + 1), value, false); 00186 Universe::store(obj->oops(memOopDesc::header_size() + 2), value, false); 00187 return obj; 00188 } 00189 00190 PRIM_DECL_1(behaviorPrimitives::new4, oop receiver){ 00191 PROLOGUE_1("new4", receiver); 00192 memOop klass = memOop(receiver); 00193 // allocate 00194 memOop obj = as_memOop(Universe::allocate(memOopDesc::header_size() + 4, &klass)); 00195 // header 00196 obj->initialize_header(false, klassOop(klass)); 00197 // initialize 4 instance variable 00198 oop value = nilObj; 00199 Universe::store(obj->oops(memOopDesc::header_size() + 0), value, false); 00200 Universe::store(obj->oops(memOopDesc::header_size() + 1), value, false); 00201 Universe::store(obj->oops(memOopDesc::header_size() + 2), value, false); 00202 Universe::store(obj->oops(memOopDesc::header_size() + 3), value, false); 00203 return obj; 00204 } 00205 00206 PRIM_DECL_1(behaviorPrimitives::new5, oop receiver){ 00207 PROLOGUE_1("new5", receiver); 00208 memOop klass = memOop(receiver); 00209 // allocate 00210 memOop obj = as_memOop(Universe::allocate(memOopDesc::header_size() + 5, &klass)); 00211 // header 00212 obj->initialize_header(false, klassOop(klass)); 00213 // initialize 5 instance variable 00214 oop value = nilObj; 00215 Universe::store(obj->oops(memOopDesc::header_size() + 0), value, false); 00216 Universe::store(obj->oops(memOopDesc::header_size() + 1), value, false); 00217 Universe::store(obj->oops(memOopDesc::header_size() + 2), value, false); 00218 Universe::store(obj->oops(memOopDesc::header_size() + 3), value, false); 00219 Universe::store(obj->oops(memOopDesc::header_size() + 4), value, false); 00220 return obj; 00221 } 00222 00223 PRIM_DECL_1(behaviorPrimitives::new6, oop receiver){ 00224 PROLOGUE_1("new6", receiver); 00225 memOop klass = memOop(receiver); 00226 // allocate 00227 memOop obj = as_memOop(Universe::allocate(memOopDesc::header_size() + 6, &klass)); 00228 // header 00229 obj->initialize_header(false, klassOop(klass)); 00230 // initialize 6 instance variable 00231 oop value = nilObj; 00232 Universe::store(obj->oops(memOopDesc::header_size() + 0), value, false); 00233 Universe::store(obj->oops(memOopDesc::header_size() + 1), value, false); 00234 Universe::store(obj->oops(memOopDesc::header_size() + 2), value, false); 00235 Universe::store(obj->oops(memOopDesc::header_size() + 3), value, false); 00236 Universe::store(obj->oops(memOopDesc::header_size() + 4), value, false); 00237 Universe::store(obj->oops(memOopDesc::header_size() + 5), value, false); 00238 return obj; 00239 } 00240 00241 PRIM_DECL_1(behaviorPrimitives::new7, oop receiver){ 00242 PROLOGUE_1("new7", receiver); 00243 memOop klass = memOop(receiver); 00244 // allocate 00245 memOop obj = as_memOop(Universe::allocate(memOopDesc::header_size() + 7, &klass)); 00246 // header 00247 obj->initialize_header(false, klassOop(klass)); 00248 // initialize 7 instance variable 00249 oop value = nilObj; 00250 Universe::store(obj->oops(memOopDesc::header_size() + 0), value, false); 00251 Universe::store(obj->oops(memOopDesc::header_size() + 1), value, false); 00252 Universe::store(obj->oops(memOopDesc::header_size() + 2), value, false); 00253 Universe::store(obj->oops(memOopDesc::header_size() + 3), value, false); 00254 Universe::store(obj->oops(memOopDesc::header_size() + 4), value, false); 00255 Universe::store(obj->oops(memOopDesc::header_size() + 5), value, false); 00256 Universe::store(obj->oops(memOopDesc::header_size() + 6), value, false); 00257 return obj; 00258 } 00259 00260 PRIM_DECL_1(behaviorPrimitives::new8, oop receiver){ 00261 PROLOGUE_1("new8", receiver); 00262 memOop klass = memOop(receiver); 00263 // allocate 00264 memOop obj = as_memOop(Universe::allocate(memOopDesc::header_size() + 8, &klass)); 00265 // header 00266 obj->initialize_header(false, klassOop(klass)); 00267 // initialize 8 instance variable 00268 oop value = nilObj; 00269 Universe::store(obj->oops(memOopDesc::header_size() + 0), value, false); 00270 Universe::store(obj->oops(memOopDesc::header_size() + 1), value, false); 00271 Universe::store(obj->oops(memOopDesc::header_size() + 2), value, false); 00272 Universe::store(obj->oops(memOopDesc::header_size() + 3), value, false); 00273 Universe::store(obj->oops(memOopDesc::header_size() + 4), value, false); 00274 Universe::store(obj->oops(memOopDesc::header_size() + 5), value, false); 00275 Universe::store(obj->oops(memOopDesc::header_size() + 6), value, false); 00276 Universe::store(obj->oops(memOopDesc::header_size() + 7), value, false); 00277 return obj; 00278 } 00279 00280 PRIM_DECL_1(behaviorPrimitives::new9, oop receiver){ 00281 PROLOGUE_1("new9", receiver); 00282 memOop klass = memOop(receiver); 00283 // allocate 00284 memOop obj = as_memOop(Universe::allocate(memOopDesc::header_size() + 9, &klass)); 00285 // header 00286 obj->initialize_header(false, klassOop(klass)); 00287 // initialize 9 instance variable 00288 oop value = nilObj; 00289 Universe::store(obj->oops(memOopDesc::header_size() + 0), value, false); 00290 Universe::store(obj->oops(memOopDesc::header_size() + 1), value, false); 00291 Universe::store(obj->oops(memOopDesc::header_size() + 2), value, false); 00292 Universe::store(obj->oops(memOopDesc::header_size() + 3), value, false); 00293 Universe::store(obj->oops(memOopDesc::header_size() + 4), value, false); 00294 Universe::store(obj->oops(memOopDesc::header_size() + 5), value, false); 00295 Universe::store(obj->oops(memOopDesc::header_size() + 6), value, false); 00296 Universe::store(obj->oops(memOopDesc::header_size() + 7), value, false); 00297 Universe::store(obj->oops(memOopDesc::header_size() + 8), value, false); 00298 return obj; 00299 } 00300 00301 */ 00302 00303 00304 PRIM_DECL_2(behaviorPrimitives::methodFor, oop receiver, oop selector) { 00305 PROLOGUE_2("methodFor", receiver, selector); 00306 ASSERT_RECEIVER; 00307 00308 if (!selector->is_symbol()) 00309 return markSymbol(vmSymbols::first_argument_has_wrong_type()); 00310 00311 methodOop m = klassOop(receiver)->klass_part()->lookup(symbolOop(selector)); 00312 if (m) return m; 00313 return markSymbol(vmSymbols::not_found()); 00314 } 00315 00316 PRIM_DECL_1(behaviorPrimitives::format, oop behavior) { 00317 PROLOGUE_1("format", behavior); 00318 if (!behavior->is_klass()) 00319 return markSymbol(vmSymbols::first_argument_has_wrong_type()); 00320 00321 char* format_name = Klass::name_from_format(klassOop(behavior)->klass_part()->format()); 00322 return oopFactory::new_symbol(format_name); 00323 } 00324 00325 PRIM_DECL_1(behaviorPrimitives::vm_type, oop behavior) { 00326 PROLOGUE_1("format", behavior); 00327 if (!behavior->is_klass()) 00328 return markSymbol(vmSymbols::first_argument_has_wrong_type()); 00329 00330 Klass::Format f = klassOop(behavior)->klass_part()->format(); 00331 00332 switch (f) { 00333 case Klass::mem_klass: return vmSymbols::mem_klass(); 00334 case Klass::association_klass: return vmSymbols::association_klass(); 00335 case Klass::blockClosure_klass: return vmSymbols::blockClosure_klass(); 00336 case Klass::byteArray_klass: return vmSymbols::byteArray_klass(); 00337 case Klass::symbol_klass: return vmSymbols::symbol_klass(); 00338 case Klass::context_klass: return vmSymbols::context_klass(); 00339 case Klass::doubleByteArray_klass: return vmSymbols::doubleByteArray_klass(); 00340 case Klass::doubleValueArray_klass: return vmSymbols::doubleValueArray_klass(); 00341 case Klass::double_klass: return vmSymbols::double_klass(); 00342 case Klass::klass_klass: return vmSymbols::klass_klass(); 00343 case Klass::method_klass: return vmSymbols::method_klass(); 00344 case Klass::mixin_klass: return vmSymbols::mixin_klass(); 00345 case Klass::objArray_klass: return vmSymbols::objArray_klass(); 00346 case Klass::weakArray_klass: return vmSymbols::weakArray_klass(); 00347 case Klass::process_klass: return vmSymbols::process_klass(); 00348 case Klass::vframe_klass: return vmSymbols::vframe_klass(); 00349 case Klass::proxy_klass: return vmSymbols::proxy_klass(); 00350 case Klass::smi_klass: return vmSymbols::smi_klass(); 00351 default: 00352 fatal("wrong format for klass"); 00353 } 00354 return markSymbol(vmSymbols::first_argument_has_wrong_type()); 00355 } 00356 00357 00358 PRIM_DECL_2(behaviorPrimitives::is_class_of, oop receiver, oop obj) { 00359 PROLOGUE_2("is_class_of", receiver, obj); 00360 ASSERT_RECEIVER; 00361 return obj->klass() == receiver ? trueObj : falseObj; 00362 }