racket/collects/tests/addrhack.c
2005-05-27 18:56:37 +00:00

58 lines
1.3 KiB
C

/*
Matthew writes:
This file, when loaded, defines:
object->address : value -> exact integer in [0,2^32-1]
address->object : exact integer in [0,2^32-1] -> value
Obviously, address->object is not safe.
To Compile:
mzc --cc addrhack.c
mzc --ld addrhack.so addrhack.o
*/
#include "escheme.h"
Scheme_Object *object_to_address(int c, Scheme_Object **a)
{
return scheme_make_integer_value_from_unsigned((unsigned long)a[0]);
}
Scheme_Object *address_to_object(int c, Scheme_Object **a)
{
unsigned long v;
if (!scheme_get_unsigned_int_val(a[0], &v))
scheme_signal_error("bad address");
return (Scheme_Object *)v;
}
Scheme_Object *scheme_reload(Scheme_Env *env)
{
scheme_add_global("object->address",
scheme_make_prim_w_arity(object_to_address,
"object->address",
1, 1),
env);
scheme_add_global("address->object",
scheme_make_prim_w_arity(address_to_object,
"address->object",
1, 1),
env);
return scheme_void;
}
Scheme_Object *scheme_initialize(Scheme_Env *env)
{
return scheme_reload(env);
}
Scheme_Object *scheme_module_name() {
return scheme_make_string("addrhack");
}