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