/* Sun-$Revision: 23.4 $ */ /* Copyright 1992-9 Sun Microsystems, Inc. and Stanford University. See the LICENSE file for license information. */ # pragma interface // A fctProxy represents a foreign function in the Self world. It contains an // entry point (just an address), and understands a number of primitive // messages that calls the function at this address. A fctProxy also contains // a smiOop: noOfArgs. It says how many arguments this fctProxy expects. // Like any foreignOop, a fctProxy can be dead or live. It can only be called // if it is live. // fctProxies are (typically) produced by calling fctLookup (in dynLink.[ch]). typedef oop (*fctType)(...); const smi unknownNoOfArgs = -1; /* For use with set_noOfArgs. If this value is used, the function can be */ /* called with any number of arguments. Warning: foreign.self has a comment that reveals the value of this constant (_NoOfArgs:), so don't change it! */ class fctProxyOopClass: public proxyOopClass { private: smiOop noOfArgs; /* How many args to give, when calling this fct. */ protected: fctProxyOopClass* addr() { return (fctProxyOopClass*)proxyOopClass::addr(); } void kill_fctProxy() { // Don't call this function. Call kill() instead. set_pointer(NULL); /* Just a precaution. */ set_type_seal(deadProxyObject); set_noOfArgs(0); // to init the word during universe::genesis } public: fctType get_pointer() { return fctType(proxyOopClass::get_pointer()); } void set_pointer(fctType entryPt) { proxyOopClass::set_pointer((void *)entryPt); } smi get_noOfArgs() { return addr()->noOfArgs->value(); } void set_noOfArgs(smi nargs) { addr()->noOfArgs = as_smiOop(nargs); } smi get_noOfArgs_prim(void *FH); oop set_noOfArgs_prim(smi n, void *FH); oop call0_prim (); oop call1_prim (oop a1); oop call2_prim (oop a1, oop a2); oop call3_prim (oop a1, oop a2, oop a3); oop call4_prim (oop a1, oop a2, oop a3, oop a4); oop call5_prim (oop a1, oop a2, oop a3, oop a4, oop a5); oop call6_prim (oop a1, oop a2, oop a3, oop a4, oop a5, oop a6); oop call7_prim (oop a1, oop a2, oop a3, oop a4, oop a5, oop a6, oop a7); oop call8_prim (oop a1, oop a2, oop a3, oop a4, oop a5, oop a6, oop a7, oop a8); oop call9_prim (oop a1, oop a2, oop a3, oop a4, oop a5, oop a6, oop a7, oop a8, oop a9); oop call10_prim(oop a1, oop a2, oop a3, oop a4, oop a5, oop a6, oop a7, oop a8, oop a9, oop a10); oop call_and_convert0 (); oop call_and_convert1 (void *a1); oop call_and_convert2 (void *a1, void *a2); oop call_and_convert3 (void *a1, void *a2, void *a3); oop call_and_convert4 (void *a1, void *a2, void *a3, void *a4); oop call_and_convert5 (void *a1, void *a2, void *a3, void *a4, void *a5); oop call_and_convert6 (void *a1, void *a2, void *a3, void *a4, void *a5, void *a6); oop call_and_convert7 (void *a1, void *a2, void *a3, void *a4, void *a5, void *a6, void *a7); oop call_and_convert8 (void *a1, void *a2, void *a3, void *a4, void *a5, void *a6, void *a7, void *a8); oop call_and_convert9 (void *a1, void *a2, void *a3, void *a4, void *a5, void *a6, void *a7, void *a8, void *a9); oop call_and_convert10(void *a1, void *a2, void *a3, void *a4, void *a5, void *a6, void *a7, void *a8, void *a9, void *a10); # ifdef UNUSED fctProxyOop clone(bool mustAllocate= true) { return (fctProxyOop) proxyOopClass::clone(mustAllocate); } # endif friend class fctProxyMap; # ifdef DEBUG bool verify(); # endif }; oop call0_prim (oop rcvr); oop call1_prim (oop rcvr, oop a1); oop call2_prim (oop rcvr, oop a1, oop a2); oop call3_prim (oop rcvr, oop a1, oop a2, oop a3); oop call4_prim (oop rcvr, oop a1, oop a2, oop a3, oop a4); oop call5_prim (oop rcvr, oop a1, oop a2, oop a3, oop a4, oop a5); oop call6_prim (oop rcvr, oop a1, oop a2, oop a3, oop a4, oop a5, oop a6); oop call7_prim (oop rcvr, oop a1, oop a2, oop a3, oop a4, oop a5, oop a6, oop a7); oop call8_prim (oop rcvr, oop a1, oop a2, oop a3, oop a4, oop a5, oop a6, oop a7, oop a8); oop call9_prim (oop rcvr, oop a1, oop a2, oop a3, oop a4, oop a5, oop a6, oop a7, oop a8, oop a9); oop call10_prim(oop rcvr, oop a1, oop a2, oop a3, oop a4, oop a5, oop a6, oop a7, oop a8, oop a9, oop a10);