int CLispEng::ToForeignInt(CP arg) { BigInteger bi = ToBigInteger(arg); int64_t pv; if (!bi.AsInt64(pv)) E_Error(); return (int)pv; }
void CLispEng::F_MakePointer() { BigInteger bi = ToBigInteger(Pop()); int64_t pv; if (!bi.AsInt64(pv)) E_Error(); m_r = CreatePointer((void*)pv); }
void *CLispEng::OnCallback(CP name, void *pArgs) { CP prop = Get(name, S(L_CALLBACK)); if (prop == V_U) Throw(E_FAIL); CP fun = Car(prop), ret = Car(Cdr(prop)), sig = Cdr(Cdr(prop)); byte *pb = (byte*)pArgs; int nArg = 0; for (CP car; SplitPair(sig, car); ++nArg) { switch (car) { case S(L_K_INT): Push(CreateInteger(*(int*)pb)); pb += sizeof(int); break; default: Throw(E_NOTIMPL); } } Apply(fun, nArg); switch (ret) { case S(L_K_INT): { BigInteger bi = ToBigInteger(Pop()); int64_t pv; if (!bi.AsInt64(pv)) E_Error(); return (void*)pv; } case S(L_K_VOID): return 0; default: Throw(E_NOTIMPL); } }