mixin_prims.cpp

Go to the documentation of this file.
00001 /* Copyright 1994, 1995 LongView Technologies L.L.C. $Revision: 1.14 $ */
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/_mixin_prims.cpp.incl"
00026 
00027 TRACE_FUNC(TraceMixinPrims, "mixin")
00028 
00029 int mixinOopPrimitives::number_of_calls;
00030 
00031 PRIM_DECL_1(mixinOopPrimitives::number_of_methods, oop mixin) {
00032   PROLOGUE_1("number_of_methods", mixin);
00033   // Check parameter
00034   if (!mixin->is_mixin())
00035     return markSymbol(vmSymbols::first_argument_has_wrong_type());
00036 
00037   return as_smiOop(mixinOop(mixin)->number_of_methods());
00038 }
00039 
00040 PRIM_DECL_2(mixinOopPrimitives::method_at, oop mixin, oop index) {
00041   PROLOGUE_2("method_at", mixin, index);
00042   // Check parameters
00043   if (!mixin->is_mixin())
00044     return markSymbol(vmSymbols::first_argument_has_wrong_type());
00045   if (!index->is_smi())
00046     return markSymbol(vmSymbols::second_argument_has_wrong_type());
00047 
00048   int i = smiOop(index)->value();  
00049   if (i > 0 && i <= mixinOop(mixin)->number_of_methods()) 
00050     return mixinOop(mixin)->method_at(i);
00051   return markSymbol(vmSymbols::out_of_bounds());
00052 }
00053 
00054 PRIM_DECL_2(mixinOopPrimitives::add_method, oop mixin, oop method) {
00055   PROLOGUE_2("add_method", mixin, method);
00056   // Check parameters
00057   if (!mixin->is_mixin())
00058     return markSymbol(vmSymbols::first_argument_has_wrong_type());
00059   if (!method->is_method())
00060     return markSymbol(vmSymbols::second_argument_has_wrong_type());
00061 
00062   // Check the mixin is not installed
00063   if (mixinOop(mixin)->is_installed())
00064     return markSymbol(vmSymbols::is_installed());
00065 
00066 
00067   BlockScavenge bs;
00068   mixinOop(mixin)->add_method(methodOop(method));
00069   return mixin;
00070 }
00071 
00072 PRIM_DECL_2(mixinOopPrimitives::remove_method_at, oop mixin, oop index) {
00073   PROLOGUE_2("remove_method_at", mixin, index);
00074   // Check parameters
00075   if (!mixin->is_mixin())
00076     return markSymbol(vmSymbols::first_argument_has_wrong_type());
00077   if (!index->is_smi())
00078     return markSymbol(vmSymbols::second_argument_has_wrong_type());
00079 
00080   // Check the mixin is not installed
00081   if (mixinOop(mixin)->is_installed())
00082     return markSymbol(vmSymbols::is_installed());
00083 
00084   BlockScavenge bs;
00085   int i = smiOop(index)->value(); 
00086   if (i > 0 && i <= mixinOop(mixin)->number_of_methods()) 
00087     return mixinOop(mixin)->remove_method_at(i);
00088   return markSymbol(vmSymbols::out_of_bounds());
00089 }
00090 
00091 PRIM_DECL_1(mixinOopPrimitives::methods, oop mixin) {
00092   PROLOGUE_1("methods", mixin);
00093   // Check parameters
00094   if (!mixin->is_mixin())
00095     return markSymbol(vmSymbols::first_argument_has_wrong_type());
00096   return mixinOop(mixin)->methods();
00097 }
00098 
00099 PRIM_DECL_1(mixinOopPrimitives::number_of_instance_variables, oop mixin) {
00100   PROLOGUE_1("number_of_instance_variables", mixin);
00101   // Check parameter
00102   if (!mixin->is_mixin())
00103     return markSymbol(vmSymbols::first_argument_has_wrong_type());
00104 
00105   return as_smiOop(mixinOop(mixin)->number_of_instVars());
00106 }
00107 
00108 PRIM_DECL_2(mixinOopPrimitives::instance_variable_at, oop mixin, oop index) {
00109   PROLOGUE_2("instance_variable_at", mixin, index);
00110   // Check parameters
00111   if (!mixin->is_mixin())
00112     return markSymbol(vmSymbols::first_argument_has_wrong_type());
00113   if (!index->is_smi())
00114     return markSymbol(vmSymbols::second_argument_has_wrong_type());
00115 
00116   int i = smiOop(index)->value();
00117   if (i > 0 && i <= mixinOop(mixin)->number_of_instVars()) 
00118     return mixinOop(mixin)->instVar_at(i);
00119   return markSymbol(vmSymbols::out_of_bounds());
00120 }
00121 
00122 PRIM_DECL_2(mixinOopPrimitives::add_instance_variable, oop mixin, oop name) {
00123   PROLOGUE_2("add_instance_variable", mixin, name);
00124   // Check parameters
00125   if (!mixin->is_mixin())
00126     return markSymbol(vmSymbols::first_argument_has_wrong_type());
00127   if (!name->is_symbol())
00128     return markSymbol(vmSymbols::second_argument_has_wrong_type());
00129 
00130   // Check the mixin is not installed
00131   if (mixinOop(mixin)->is_installed())
00132     return markSymbol(vmSymbols::is_installed());
00133 
00134   BlockScavenge bs;
00135   mixinOop(mixin)->add_instVar(symbolOop(name));
00136   return mixin;
00137 }
00138 
00139 PRIM_DECL_2(mixinOopPrimitives::remove_instance_variable_at, oop mixin, oop index) {
00140   PROLOGUE_2("remove_instance_variable_at", mixin, index);
00141   // Check parameters
00142   if (!mixin->is_mixin())
00143     return markSymbol(vmSymbols::first_argument_has_wrong_type());
00144   if (!index->is_smi())
00145     return markSymbol(vmSymbols::second_argument_has_wrong_type());
00146 
00147   // Check the mixin is not installed
00148   if (mixinOop(mixin)->is_installed())
00149     return markSymbol(vmSymbols::is_installed());
00150 
00151 
00152   BlockScavenge bs;
00153   int i = smiOop(index)->value();
00154   if (i > 0 && i <= mixinOop(mixin)->number_of_instVars()) 
00155     return mixinOop(mixin)->remove_instVar_at(i);
00156   return markSymbol(vmSymbols::out_of_bounds());
00157 }
00158 
00159 PRIM_DECL_1(mixinOopPrimitives::instance_variables, oop mixin) {
00160   PROLOGUE_1("instance_variables", mixin);
00161   // Check parameters
00162   if (!mixin->is_mixin())
00163     return markSymbol(vmSymbols::first_argument_has_wrong_type());
00164   return mixinOop(mixin)->instVars();
00165 }
00166 
00167 PRIM_DECL_1(mixinOopPrimitives::number_of_class_variables, oop mixin) {
00168   PROLOGUE_1("number_of_class_variables", mixin);
00169   // Check parameter
00170   if (!mixin->is_mixin())
00171     return markSymbol(vmSymbols::first_argument_has_wrong_type());
00172 
00173   return as_smiOop(mixinOop(mixin)->number_of_classVars());
00174 }
00175 
00176 PRIM_DECL_2(mixinOopPrimitives::class_variable_at, oop mixin, oop index) {
00177   PROLOGUE_2("class_variable_at", mixin, index);
00178   // Check parameters
00179   if (!mixin->is_mixin())
00180     return markSymbol(vmSymbols::first_argument_has_wrong_type());
00181   if (!index->is_smi())
00182     return markSymbol(vmSymbols::second_argument_has_wrong_type());
00183 
00184   int i = smiOop(index)->value();
00185   if (i > 0 && i <= mixinOop(mixin)->number_of_classVars()) 
00186     return mixinOop(mixin)->classVar_at(i);
00187   return markSymbol(vmSymbols::out_of_bounds());
00188 }
00189 
00190 PRIM_DECL_2(mixinOopPrimitives::add_class_variable, oop mixin, oop name) {
00191   PROLOGUE_2("add_class_variable", mixin, name);
00192   // Check parameters
00193   if (!mixin->is_mixin())
00194     return markSymbol(vmSymbols::first_argument_has_wrong_type());
00195   if (!name->is_symbol())
00196     return markSymbol(vmSymbols::second_argument_has_wrong_type());
00197 
00198   // Check the mixin is not installed
00199   if (mixinOop(mixin)->is_installed())
00200     return markSymbol(vmSymbols::is_installed());
00201 
00202   BlockScavenge bs;
00203   mixinOop(mixin)->add_classVar(symbolOop(name));
00204   return mixin;
00205 }
00206 
00207 PRIM_DECL_2(mixinOopPrimitives::remove_class_variable_at, oop mixin, oop index) {
00208   PROLOGUE_2("remove_class_variable_at", mixin, index);
00209   // Check parameters
00210   if (!mixin->is_mixin())
00211     return markSymbol(vmSymbols::first_argument_has_wrong_type());
00212   if (!index->is_smi())
00213     return markSymbol(vmSymbols::second_argument_has_wrong_type());
00214 
00215   // Check the mixin is not installed
00216   if (mixinOop(mixin)->is_installed())
00217     return markSymbol(vmSymbols::is_installed());
00218 
00219   BlockScavenge bs;
00220   int i = smiOop(index)->value();
00221   if (i > 0 && i <= mixinOop(mixin)->number_of_classVars()) 
00222     return mixinOop(mixin)->remove_classVar_at(i);
00223   return markSymbol(vmSymbols::out_of_bounds());
00224 }
00225 
00226 PRIM_DECL_1(mixinOopPrimitives::class_variables, oop mixin) {
00227   PROLOGUE_1("class_variables", mixin);
00228   // Check parameters
00229   if (!mixin->is_mixin())
00230     return markSymbol(vmSymbols::first_argument_has_wrong_type());
00231   return mixinOop(mixin)->classVars();
00232 }
00233 
00234 PRIM_DECL_1(mixinOopPrimitives::primary_invocation, oop mixin) {
00235   PROLOGUE_1("primary_invocation", mixin);
00236   // Check parameter
00237   if (!mixin->is_mixin())
00238     return markSymbol(vmSymbols::first_argument_has_wrong_type());
00239 
00240   return mixinOop(mixin)->primary_invocation();
00241 }
00242 
00243 PRIM_DECL_2(mixinOopPrimitives::set_primary_invocation, oop mixin, oop klass) {
00244   PROLOGUE_2("class_mixin", mixin, klass);
00245   // Check parameters
00246   if (!mixin->is_mixin())
00247     return markSymbol(vmSymbols::first_argument_has_wrong_type());
00248   if (!klass->is_klass())
00249     return markSymbol(vmSymbols::second_argument_has_wrong_type());
00250 
00251   // Check the mixin is not installed
00252   if (mixinOop(mixin)->is_installed())
00253     return markSymbol(vmSymbols::is_installed());
00254 
00255   mixinOop(mixin)->set_primary_invocation(klassOop(klass));
00256   return mixin;
00257 }
00258 
00259 PRIM_DECL_1(mixinOopPrimitives::class_mixin, oop mixin) {
00260   PROLOGUE_1("class_mixin", mixin);
00261   // Check parameter
00262   if (!mixin->is_mixin())
00263     return markSymbol(vmSymbols::first_argument_has_wrong_type());
00264 
00265   return mixinOop(mixin)->class_mixin();
00266 }
00267 
00268 PRIM_DECL_2(mixinOopPrimitives::set_class_mixin, oop mixin, oop class_mixin) {
00269   PROLOGUE_2("class_mixin", mixin, class_mixin);
00270   // Check parameters
00271   if (!mixin->is_mixin())
00272     return markSymbol(vmSymbols::first_argument_has_wrong_type());
00273   if (!class_mixin->is_mixin())
00274     return markSymbol(vmSymbols::second_argument_has_wrong_type());
00275 
00276   // Check the mixin is not installed
00277   if (mixinOop(mixin)->is_installed())
00278     return markSymbol(vmSymbols::is_installed());
00279 
00280   mixinOop(mixin)->set_class_mixin(mixinOop(class_mixin));
00281   return mixin;
00282 }
00283 
00284 PRIM_DECL_1(mixinOopPrimitives::is_installed, oop mixin) {
00285   PROLOGUE_1("is_installed", mixin);
00286   // Check parameter
00287   if (!mixin->is_mixin())
00288     return markSymbol(vmSymbols::first_argument_has_wrong_type());
00289 
00290   return mixinOop(mixin)->is_installed() ? trueObj : falseObj;
00291 }
00292 
00293 PRIM_DECL_1(mixinOopPrimitives::set_installed, oop mixin) {
00294   PROLOGUE_1("set_installed", mixin);
00295   // Check parameter
00296   if (!mixin->is_mixin())
00297     return markSymbol(vmSymbols::first_argument_has_wrong_type());
00298 
00299   mixinOop instance_mixin = mixinOop(mixin);
00300   mixinOop class_mixin    = instance_mixin->class_mixin();
00301 
00302   instance_mixin->set_installed(trueObj);
00303   if (class_mixin->is_mixin()) {
00304     class_mixin->set_installed(trueObj);
00305   }
00306   return mixin;
00307 }
00308 
00309 PRIM_DECL_1(mixinOopPrimitives::set_uninstalled, oop mixin) {
00310   PROLOGUE_1("set_uninstalled", mixin);
00311   // Check parameter
00312   if (!mixin->is_mixin())
00313     return markSymbol(vmSymbols::first_argument_has_wrong_type());
00314 
00315   mixinOop(mixin)->set_installed(falseObj);
00316   return mixin;
00317 }

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