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/_proxy_prims.cpp.incl"
00026 
00027 TRACE_FUNC(TraceProxyPrims, "proxy")
00028 
00029 int proxyOopPrimitives::number_of_calls;
00030 
00031 #define ASSERT_RECEIVER assert(receiver->is_proxy(), "receiver must be proxy")
00032 
00033 PRIM_DECL_1(proxyOopPrimitives::getSmi, oop receiver) {
00034   PROLOGUE_1("getSmi", receiver);
00035   ASSERT_RECEIVER;
00036   unsigned int value   = (unsigned int) proxyOop(receiver)->get_pointer();
00037   unsigned int topBits = value >> (BitsPerWord - Tag_Size);
00038   if ((topBits != 0) && (topBits != 3))
00039     return markSymbol(vmSymbols::smi_conversion_failed());
00040   return as_smiOop((int) value);
00041 }
00042 
00043 PRIM_DECL_2(proxyOopPrimitives::set, oop receiver, oop value) {
00044   PROLOGUE_2("getSmi", receiver, value);
00045   ASSERT_RECEIVER;
00046   if (value->is_smi()) {
00047     proxyOop(receiver)->set_pointer((void*) smiOop(value)->value());
00048   } else if (value->is_proxy()) {
00049     proxyOop(receiver)->set_pointer(proxyOop(value)->get_pointer());
00050   } else 
00051     return markSymbol(vmSymbols::first_argument_has_wrong_type());
00052   return receiver;
00053 }
00054 
00055 PRIM_DECL_3(proxyOopPrimitives::setHighLow, oop receiver, oop high, oop low) {
00056   PROLOGUE_3("setHighLow", receiver, high, low);
00057   ASSERT_RECEIVER;
00058   if (!high->is_smi())
00059     return markSymbol(vmSymbols::first_argument_has_wrong_type());
00060   if (!low->is_smi())
00061     return markSymbol(vmSymbols::second_argument_has_wrong_type());
00062   unsigned int h     = (unsigned int) smiOop(high)->value();
00063   unsigned int l     = (unsigned int) smiOop(low)->value();
00064   unsigned int value = (h << 16) | l;
00065   proxyOop(receiver)->set_pointer((void*) value);
00066   return receiver;
00067 }
00068 
00069 PRIM_DECL_1(proxyOopPrimitives::getHigh, oop receiver) {
00070   PROLOGUE_1("getHigh", receiver);
00071   ASSERT_RECEIVER;
00072   unsigned int value = (int) proxyOop(receiver)->get_pointer();
00073   value = value >> 16;
00074   return as_smiOop(value);
00075 }
00076 
00077 PRIM_DECL_1(proxyOopPrimitives::getLow, oop receiver) {
00078   PROLOGUE_1("getLow", receiver);
00079   ASSERT_RECEIVER;
00080   unsigned int value = (int) proxyOop(receiver)->get_pointer();
00081   value &= 0x0000ffff;
00082   return as_smiOop(value);
00083 }
00084 
00085 PRIM_DECL_1(proxyOopPrimitives::isNull, oop receiver) {
00086   PROLOGUE_1("isNull", receiver);
00087   ASSERT_RECEIVER;
00088   return proxyOop(receiver)->is_null() ? trueObj : falseObj;
00089 }
00090 
00091 PRIM_DECL_1(proxyOopPrimitives::isAllOnes, oop receiver) {
00092   PROLOGUE_1("isAllOnes", receiver);
00093   ASSERT_RECEIVER;
00094   return proxyOop(receiver)->is_allOnes() ? trueObj : falseObj;
00095 }
00096 
00097 PRIM_DECL_2(proxyOopPrimitives::malloc, oop receiver, oop size) {
00098   PROLOGUE_2("malloc", receiver, size);
00099   ASSERT_RECEIVER;
00100   if (!size->is_smi()) return markSymbol(vmSymbols::first_argument_has_wrong_type());
00101   proxyOop(receiver)->set_pointer(::malloc(smiOop(size)->value()));
00102   return receiver;
00103 }
00104 
00105 PRIM_DECL_2(proxyOopPrimitives::calloc, oop receiver, oop size) {
00106   PROLOGUE_2("calloc", receiver, size);
00107   ASSERT_RECEIVER;
00108   if (!size->is_smi()) return markSymbol(vmSymbols::first_argument_has_wrong_type());
00109   proxyOop(receiver)->set_pointer(::calloc(smiOop(size)->value(), 1));
00110   return receiver;
00111 }
00112 
00113 PRIM_DECL_1(proxyOopPrimitives::free, oop receiver) {
00114   PROLOGUE_1("free", receiver);
00115   ASSERT_RECEIVER;
00116   ::free(proxyOop(receiver)->get_pointer());
00117   proxyOop(receiver)->null_pointer();
00118   return receiver;
00119 }
00120 
00121 
00122 PRIM_DECL_2(proxyOopPrimitives::byteAt, oop receiver, oop offset) {
00123   PROLOGUE_2("byteAt", receiver, offset);
00124   ASSERT_RECEIVER;
00125   if (!offset->is_smi())
00126     return markSymbol(vmSymbols::first_argument_has_wrong_type());
00127   return as_smiOop(proxyOop(receiver)->byte_at(smiOop(offset)->value()));
00128 }
00129 
00130 PRIM_DECL_2(proxyOopPrimitives::doubleByteAt, oop receiver, oop offset) {
00131   PROLOGUE_2("doubleByteAt", receiver, offset);
00132   ASSERT_RECEIVER;
00133   if (!offset->is_smi())
00134     return markSymbol(vmSymbols::first_argument_has_wrong_type());
00135   return as_smiOop(proxyOop(receiver)->doubleByte_at(smiOop(offset)->value()));
00136 }
00137 
00138 PRIM_DECL_3(proxyOopPrimitives::doubleByteAtPut, oop receiver, oop offset, oop value) {
00139   PROLOGUE_3("doubleByteAtPut", receiver, offset, value);
00140   ASSERT_RECEIVER;
00141   if (!offset->is_smi())
00142     return markSymbol(vmSymbols::first_argument_has_wrong_type());
00143   if (!value->is_smi()) return markSymbol(vmSymbols::second_argument_has_wrong_type());
00144   proxyOop(receiver)->doubleByte_at_put(smiOop(offset)->value(), smiOop(value)->value());
00145   return receiver;
00146 }
00147 
00148 PRIM_DECL_2(proxyOopPrimitives::smiAt, oop receiver, oop offset) {
00149   PROLOGUE_2("smiAt", receiver, offset);
00150   ASSERT_RECEIVER;
00151   if (!offset->is_smi())
00152     return markSymbol(vmSymbols::first_argument_has_wrong_type());
00153   unsigned int value   = (unsigned int) proxyOop(receiver)->long_at(smiOop(offset)->value());
00154   unsigned int topBits = value >> (BitsPerWord - Tag_Size);
00155   if ((topBits != 0) && (topBits != 3))
00156     return markSymbol(vmSymbols::smi_conversion_failed());
00157   return as_smiOop((int) value);
00158 }
00159 
00160 PRIM_DECL_3(proxyOopPrimitives::smiAtPut, oop receiver, oop offset, oop value) {
00161   PROLOGUE_3("smiAtPut", receiver, offset, value);
00162   ASSERT_RECEIVER;
00163   if (!offset->is_smi())
00164     return markSymbol(vmSymbols::first_argument_has_wrong_type());
00165   if (!value->is_smi())
00166     return markSymbol(vmSymbols::second_argument_has_wrong_type());
00167   proxyOop(receiver)->long_at_put(smiOop(offset)->value(), smiOop(value)->value());
00168   return receiver;
00169 }
00170 
00171 PRIM_DECL_3(proxyOopPrimitives::subProxyAt, oop receiver, oop offset, oop result) {
00172   PROLOGUE_3("subProxyAt", receiver, offset, result);
00173   ASSERT_RECEIVER;
00174   if (!offset->is_smi())
00175     return markSymbol(vmSymbols::first_argument_has_wrong_type());
00176   if (!result->is_proxy())
00177     return markSymbol(vmSymbols::second_argument_has_wrong_type());
00178   proxyOop(result)->set_pointer((void*) ((char*) proxyOop(receiver)->get_pointer() + smiOop(offset)->value()));
00179   return result;
00180 }
00181 
00182 PRIM_DECL_3(proxyOopPrimitives::proxyAt, oop receiver, oop offset, oop result) {
00183   PROLOGUE_3("proxyAt", receiver, offset, result);
00184   ASSERT_RECEIVER;
00185   if (!offset->is_smi())
00186     return markSymbol(vmSymbols::first_argument_has_wrong_type());
00187   if (!result->is_proxy())
00188     return markSymbol(vmSymbols::second_argument_has_wrong_type());
00189   proxyOop(result)->set_pointer((void*)proxyOop(receiver)->long_at(smiOop(offset)->value()));
00190   return result;
00191 }
00192 
00193 PRIM_DECL_3(proxyOopPrimitives::proxyAtPut, oop receiver, oop offset, oop value) {
00194   PROLOGUE_3("proxyAtPut", receiver, offset, value);
00195   ASSERT_RECEIVER;
00196   if (!offset->is_smi())
00197     return markSymbol(vmSymbols::first_argument_has_wrong_type());
00198   if (!value->is_proxy())
00199     return markSymbol(vmSymbols::second_argument_has_wrong_type());
00200   proxyOop(receiver)->long_at_put(smiOop(offset)->value(), (long)proxyOop(value)->get_pointer());
00201   return receiver;
00202 }
00203 
00204 PRIM_DECL_2(proxyOopPrimitives::singlePrecisionFloatAt, oop receiver, oop offset) {
00205   PROLOGUE_2("singlePrecisionFloatAt", receiver, offset);
00206   ASSERT_RECEIVER;
00207   if (!offset->is_smi())
00208     return markSymbol(vmSymbols::first_argument_has_wrong_type());
00209   return oopFactory::new_double((double) proxyOop(receiver)->float_at(smiOop(offset)->value()));
00210 }
00211 
00212 PRIM_DECL_3(proxyOopPrimitives::singlePrecisionFloatAtPut, oop receiver, oop offset, oop value) {
00213   PROLOGUE_3("singlePrecisionFloatAtPut", receiver, offset, value);
00214   ASSERT_RECEIVER;
00215   if (!offset->is_smi())
00216     return markSymbol(vmSymbols::first_argument_has_wrong_type());
00217   if (!value->is_double())
00218     return markSymbol(vmSymbols::second_argument_has_wrong_type());
00219   proxyOop(receiver)->float_at_put(smiOop(offset)->value(), (float) doubleOop(value)->value());
00220   return receiver;
00221 }
00222 
00223 PRIM_DECL_2(proxyOopPrimitives::doublePrecisionFloatAt, oop receiver, oop offset) {
00224   PROLOGUE_2("doublePrecisionFloatAt", receiver, offset);
00225   ASSERT_RECEIVER;
00226   if (!offset->is_smi())
00227     return markSymbol(vmSymbols::first_argument_has_wrong_type());
00228   return oopFactory::new_double(proxyOop(receiver)->double_at(smiOop(offset)->value()));
00229 }
00230 
00231 PRIM_DECL_3(proxyOopPrimitives::doublePrecisionFloatAtPut, oop receiver, oop offset, oop value) {
00232   PROLOGUE_3("doublePrecisionFloatAtPut", receiver, offset, value);
00233   ASSERT_RECEIVER;
00234   if (!offset->is_smi())
00235     return markSymbol(vmSymbols::first_argument_has_wrong_type());
00236   if (!value->is_double())
00237     return markSymbol(vmSymbols::second_argument_has_wrong_type());
00238   proxyOop(receiver)->double_at_put(smiOop(offset)->value(), doubleOop(value)->value());
00239   return receiver;
00240 }
00241 
00242 static bool convert_to_arg(oop arg, int* addr) {
00243   if (arg->is_smi()) {
00244     *addr = smiOop(arg)->value();
00245     return true;
00246   }
00247   if (arg->is_proxy()) {
00248     *addr = (int) proxyOop(arg)->get_pointer();
00249     return true;
00250   }
00251   return false;
00252 }
00253 
00254 typedef void* (__stdcall *call_out_func_0)();
00255 PRIM_DECL_2(proxyOopPrimitives::callOut0, oop receiver, oop result) {
00256   PROLOGUE_2("callOut0", receiver, result);
00257   ASSERT_RECEIVER;
00258 
00259   if (!result->is_proxy())
00260     return markSymbol(vmSymbols::first_argument_has_wrong_type());
00261   call_out_func_0 f = (call_out_func_0) proxyOop(receiver)->get_pointer();
00262   proxyOop(result)->set_pointer((*f)());
00263   return result;
00264 }
00265 
00266 typedef void* (__stdcall *call_out_func_1)(int a);
00267 PRIM_DECL_3(proxyOopPrimitives::callOut1, oop receiver, oop arg1, oop result) {
00268   PROLOGUE_3("callOut1", receiver, arg1, result);
00269   ASSERT_RECEIVER;
00270 
00271   int a1;
00272   if (!convert_to_arg(arg1, &a1)) 
00273     return markSymbol(vmSymbols::first_argument_has_wrong_type());
00274 
00275   if (!result->is_proxy())
00276     return markSymbol(vmSymbols::second_argument_has_wrong_type());
00277 
00278   call_out_func_1 f = (call_out_func_1) proxyOop(receiver)->get_pointer();
00279   proxyOop(result)->set_pointer((*f)(a1));
00280   return result;
00281 }
00282 
00283 typedef void* (__stdcall *call_out_func_2)(int a, int b);
00284 PRIM_DECL_4(proxyOopPrimitives::callOut2, oop receiver, oop arg1, oop arg2, oop result) {
00285   PROLOGUE_4("callOut2", receiver, arg1, arg2, result);
00286   ASSERT_RECEIVER;
00287 
00288   int a1;
00289   if (!convert_to_arg(arg1, &a1)) 
00290     return markSymbol(vmSymbols::first_argument_has_wrong_type());
00291 
00292   int a2;
00293   if (!convert_to_arg(arg2, &a2)) 
00294     return markSymbol(vmSymbols::second_argument_has_wrong_type());
00295 
00296   if (!result->is_proxy())
00297     return markSymbol(vmSymbols::third_argument_has_wrong_type());
00298 
00299   call_out_func_2 f = (call_out_func_2) proxyOop(receiver)->get_pointer();
00300   proxyOop(result)->set_pointer((*f)(a1, a2));
00301   return result;
00302 }
00303 
00304 typedef void* (__stdcall *call_out_func_3)(int a, int b, int c);
00305 PRIM_DECL_5(proxyOopPrimitives::callOut3, oop receiver, oop arg1, oop arg2, oop arg3, oop result) {
00306   PROLOGUE_5("callOut3", receiver, arg1, arg2, arg3, result);
00307   ASSERT_RECEIVER;
00308 
00309   int a1;
00310   if (!convert_to_arg(arg1, &a1)) 
00311     return markSymbol(vmSymbols::first_argument_has_wrong_type());
00312 
00313   int a2;
00314   if (!convert_to_arg(arg2, &a2)) 
00315     return markSymbol(vmSymbols::second_argument_has_wrong_type());
00316 
00317   int a3;
00318   if (!convert_to_arg(arg3, &a3)) 
00319     return markSymbol(vmSymbols::third_argument_has_wrong_type());
00320 
00321   if (!result->is_proxy())
00322     return markSymbol(vmSymbols::fourth_argument_has_wrong_type());
00323 
00324   call_out_func_3 f = (call_out_func_3) proxyOop(receiver)->get_pointer();
00325   proxyOop(result)->set_pointer((*f)(a1, a2, a3));
00326   return result;
00327 }
00328 
00329 typedef void* (__stdcall *call_out_func_4)(int a, int b, int c, int d);
00330 PRIM_DECL_6(proxyOopPrimitives::callOut4, oop receiver, oop arg1, oop arg2, oop arg3, oop arg4, oop result) {
00331   PROLOGUE_6("callOut4", receiver, arg1, arg2, arg3, arg4, result);
00332   ASSERT_RECEIVER;
00333 
00334   int a1;
00335   if (!convert_to_arg(arg1, &a1)) 
00336     return markSymbol(vmSymbols::first_argument_has_wrong_type());
00337 
00338   int a2;
00339   if (!convert_to_arg(arg2, &a2)) 
00340     return markSymbol(vmSymbols::second_argument_has_wrong_type());
00341 
00342   int a3;
00343   if (!convert_to_arg(arg3, &a3)) 
00344     return markSymbol(vmSymbols::third_argument_has_wrong_type());
00345 
00346   int a4;
00347   if (!convert_to_arg(arg4, &a4)) 
00348     return markSymbol(vmSymbols::fourth_argument_has_wrong_type());
00349 
00350   if (!result->is_proxy())
00351     return markSymbol(vmSymbols::fifth_argument_has_wrong_type());
00352 
00353   call_out_func_4 f = (call_out_func_4) proxyOop(receiver)->get_pointer();
00354   proxyOop(result)->set_pointer((*f)(a1, a2, a3, a4));
00355   return result;
00356 }
00357 
00358 typedef void* (__stdcall *call_out_func_5)(int a, int b, int c, int d, int e);
00359 
00360 PRIM_DECL_7(proxyOopPrimitives::callOut5, oop receiver, oop arg1, oop arg2, oop arg3, oop arg4, oop arg5, oop result) {
00361   PROLOGUE_7("callOut5", receiver, arg1, arg2, arg3, arg4, arg5, result);
00362   ASSERT_RECEIVER;
00363 
00364   int a1;
00365   if (!convert_to_arg(arg1, &a1)) 
00366     return markSymbol(vmSymbols::first_argument_has_wrong_type());
00367 
00368   int a2;
00369   if (!convert_to_arg(arg2, &a2)) 
00370     return markSymbol(vmSymbols::second_argument_has_wrong_type());
00371 
00372   int a3;
00373   if (!convert_to_arg(arg3, &a3)) 
00374     return markSymbol(vmSymbols::third_argument_has_wrong_type());
00375 
00376   int a4;
00377   if (!convert_to_arg(arg4, &a4)) 
00378     return markSymbol(vmSymbols::fourth_argument_has_wrong_type());
00379 
00380   int a5;
00381   if (!convert_to_arg(arg5, &a5)) 
00382     return markSymbol(vmSymbols::fifth_argument_has_wrong_type());
00383 
00384   if (!result->is_proxy())
00385     return markSymbol(vmSymbols::sixth_argument_has_wrong_type());
00386 
00387   call_out_func_5 f = (call_out_func_5) proxyOop(receiver)->get_pointer();
00388   proxyOop(result)->set_pointer((*f)(a1, a2, a3, a4, a5));
00389   return result;
00390 }
00391 
00392 #pragma optimize( "gtp", on )
00393 PRIM_DECL_3(proxyOopPrimitives::byteAtPut, oop receiver, oop offset, oop value) {
00394   PROLOGUE_3("byteAtPut", receiver, offset, value);
00395   ASSERT_RECEIVER;
00396   if (!offset->is_smi())
00397     return markSymbol(vmSymbols::first_argument_has_wrong_type());
00398   if (!value->is_smi()) return markSymbol(vmSymbols::second_argument_has_wrong_type());
00399   proxyOop(receiver)->byte_at_put(smiOop(offset)->value(), smiOop(value)->value());
00400   return receiver;
00401 }
00402 #pragma optimize( "", on )