static Any getExecuteObtain(Obtain obt) { Any receiver; Name selector; Any rval = FAIL; void *savedcontext; if ( notNil(obt->context) && TheCallbackFunctions.setHostContext ) { savedcontext = (*TheCallbackFunctions.setHostContext)(obt->context); } else savedcontext = NIL; if ( !(receiver = expandCodeArgument(obt->receiver)) ) goto out; if ( !(selector = checkSelector(obt->selector)) ) goto out; if ( isNil(obt->arguments) ) { rval = getv(receiver, selector, 0, NULL); } else { int n; int argc = valInt(obt->arguments->size); ArgVector(argv, argc); Any *elms = obt->arguments->elements; for(n = 0; n < argc; n++) { if ( !(argv[n] = expandCodeArgument(elms[n])) ) goto out; } rval = getv(receiver, selector, argc, argv); } out: if ( notNil(savedcontext) ) (*TheCallbackFunctions.setHostContext)(savedcontext); return rval; }
static status catchAllHostv(Host h, Name selector, int argc, Any *argv) { if ( h->callBack == ON ) { status rval; if ( !(rval = callHostv(h, selector, argc, argv)) && PCE->last_error == NAME_noBehaviour ) assign(PCE, last_error, NIL); return rval; } else { ArgVector(av, argc+2); int ac; av[0] = h; av[1] = (Any) selector; for(ac=0; ac < argc; ac++) av[ac+2] = argv[ac]; return appendChain(h->messages, newObjectv(ClassMessage, argc+2, av)); } }