58 lines
1.3 KiB
C
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");
|
|
}
|