proxy_prims.cpp

Go to the documentation of this file.
00001 /* Copyright 1994 - 1996 LongView Technologies L.L.C. $Revision: 1.18 $ */
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/_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 ) 

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