return (0);
}
+insn_t *
+fasl_cc_return (SCHEME_OBJECT o, fasl_header_t * h)
+{
+ if ((FASLHDR_MEMORY_BASE (h)) != 0)
+ return (((insn_t *) (FASLHDR_MEMORY_BASE (h))) + (OBJECT_DATUM (o)));
+ if ((FASLHDR_ARCH (h)) == CURRENT_FASL_ARCH)
+ return (CC_RETURN_ADDRESS (o));
+ abort ();
+ return (0);
+}
+
SCHEME_OBJECT
fasl_raw_address_to_object (unsigned int type,
SCHEME_OBJECT * address,
extern bool read_from_fasl_file (void *, size_t, fasl_file_handle_t);
extern SCHEME_OBJECT * fasl_object_address (SCHEME_OBJECT, fasl_header_t *);
extern insn_t * fasl_cc_address (SCHEME_OBJECT, fasl_header_t *);
+extern insn_t * fasl_cc_return (SCHEME_OBJECT, fasl_header_t *);
extern SCHEME_OBJECT fasl_raw_address_to_object
(unsigned int, SCHEME_OBJECT *, fasl_header_t *);
extern SCHEME_OBJECT fasl_raw_address_to_cc_entry (insn_t *, fasl_header_t *);
static gc_tuple_handler_t fasload_tuple;
static gc_vector_handler_t fasload_vector;
static gc_object_handler_t fasload_cc_entry;
+static gc_object_handler_t fasload_cc_return;
static gc_raw_address_to_object_t fasload_raw_address_to_object;
static gc_raw_address_to_cc_entry_t fasload_raw_address_to_cc_entry;
static void * relocate_address (void *);
(GCT_TUPLE (&table)) = fasload_tuple;
(GCT_VECTOR (&table)) = fasload_vector;
(GCT_CC_ENTRY (&table)) = fasload_cc_entry;
+ (GCT_CC_RETURN (&table)) = fasload_cc_return;
(GCT_RAW_ADDRESS_TO_OBJECT (&table)) = fasload_raw_address_to_object;
(GCT_RAW_ADDRESS_TO_CC_ENTRY (&table)) = fasload_raw_address_to_cc_entry;
#define OLD_ADDRESS(object) (fasl_object_address ((object), (fh)))
#define OLD_CC_ADDRESS(object) (fasl_cc_address ((object), (fh)))
+#define OLD_CC_RETURN(object) (fasl_cc_return ((object), (fh)))
static SCHEME_OBJECT
fasload_raw_address_to_object (unsigned int type, SCHEME_OBJECT * address)
#endif
}
+static
+DEFINE_GC_OBJECT_HANDLER (fasload_cc_return)
+{
+#ifdef CC_SUPPORT_P
+ return
+ (CC_RETURN_NEW_ADDRESS (object,
+ (relocate_address (OLD_CC_RETURN (object)))));
+#else
+ return (object);
+#endif
+}
+
/* Relocate an address as read in from the file. The address is
examined to see what region of memory it belongs in. */