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 )