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/_callBack_prims.cpp.incl"
00026 
00027 TRACE_FUNC(TraceCallBackPrims, "callBack")
00028 
00029 int callBackPrimitives::number_of_calls;
00030 
00031 PRIM_DECL_2(callBackPrimitives::initialize, oop receiver, oop selector) {
00032   PROLOGUE_2("initialize", receiver, selector);
00033   if (!selector->is_symbol())
00034     return markSymbol(vmSymbols::second_argument_has_wrong_type());
00035   callBack::initialize(receiver, symbolOop(selector));
00036   return receiver;
00037 }
00038 
00039 PRIM_DECL_3(callBackPrimitives::registerPascalCall, oop index, oop nofArgs, oop result) {
00040   PROLOGUE_3("registerPascalCall", index, nofArgs, result);
00041   if (!index->is_smi())
00042     return markSymbol(vmSymbols::first_argument_has_wrong_type());
00043   if (!nofArgs->is_smi())
00044     return markSymbol(vmSymbols::second_argument_has_wrong_type());
00045   if (!result->is_proxy())
00046     return markSymbol(vmSymbols::third_argument_has_wrong_type());
00047   proxyOop(result)->set_pointer(callBack::registerPascalCall(smiOop(index)->value(), smiOop(nofArgs)->value()));
00048   return result;
00049 }
00050 
00051 PRIM_DECL_2(callBackPrimitives::registerCCall, oop index, oop result) {
00052   PROLOGUE_2("registerCCall", index, result);
00053   if (!index->is_smi())
00054     return markSymbol(vmSymbols::first_argument_has_wrong_type());
00055   if (!result->is_proxy())
00056     return markSymbol(vmSymbols::second_argument_has_wrong_type());
00057   proxyOop(result)->set_pointer(callBack::registerCCall(smiOop(index)->value()));
00058   return result;
00059 }
00060 
00061 PRIM_DECL_1(callBackPrimitives::unregister, oop proxy) {
00062   PROLOGUE_1("unregister", proxy);
00063   if (!proxy->is_proxy())
00064     return markSymbol(vmSymbols::first_argument_has_wrong_type());
00065   callBack::unregister(proxyOop(proxy)->get_pointer());
00066   proxyOop(proxy)->set_pointer(NULL);
00067   return proxy;
00068 }
00069 
00070 typedef int (__stdcall *mytype)(int a, int b);
00071 
00072 PRIM_DECL_1(callBackPrimitives::invokePascal, oop proxy) {
00073   PROLOGUE_1("invokePascal", proxy);
00074   if (!proxy->is_proxy())
00075     return markSymbol(vmSymbols::first_argument_has_wrong_type());
00076   mytype f = (mytype) proxyOop(proxy)->get_pointer();
00077   return as_smiOop((*f) (10, 5));
00078 }
00079 
00080 PRIM_DECL_1(callBackPrimitives::invokeC, oop proxy) {
00081   PROLOGUE_1("invokeC", proxy);
00082   if (!proxy->is_proxy())
00083     return markSymbol(vmSymbols::first_argument_has_wrong_type());
00084   fntype f = (fntype) proxyOop(proxy)->get_pointer();
00085   return as_smiOop( (int) (*f) (10, 5));
00086 }
00087