00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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 }