behavior_prims.cpp

Go to the documentation of this file.
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 }

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