Exemplo n.º 1
0
Arquivo: ffi.cpp Projeto: ufasoft/lisp
int CLispEng::ToForeignInt(CP arg) {
	BigInteger bi = ToBigInteger(arg);
	int64_t pv;
	if (!bi.AsInt64(pv))
		E_Error();
	return (int)pv;
}
Exemplo n.º 2
0
Arquivo: ffi.cpp Projeto: ufasoft/lisp
void CLispEng::F_MakePointer() {
	BigInteger bi = ToBigInteger(Pop());
	int64_t pv;
	if (!bi.AsInt64(pv))
		E_Error();
	m_r = CreatePointer((void*)pv);
}
Exemplo n.º 3
0
Arquivo: ffi.cpp Projeto: ufasoft/lisp
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);
	}
}