cvsuser 03/12/15 07:42:31
Modified: include/parrot interpreter.h
src events.c interpreter.c
Log:
event-handling-5
* preserve registers when running event handler sub
Revision Changes Path
1.108 +2 -1 parrot/include/parrot/interpreter.h
Index: interpreter.h
===================================================================
RCS file: /cvs/public/parrot/include/parrot/interpreter.h,v
retrieving revision 1.107
retrieving revision 1.108
diff -u -w -r1.107 -r1.108
--- interpreter.h 15 Dec 2003 15:12:57 -0000 1.107
+++ interpreter.h 15 Dec 2003 15:42:28 -0000 1.108
@@ -1,7 +1,7 @@
/* interpreter.h
* Copyright: 2001-2003 The Perl Foundation. All Rights Reserved.
* CVS Info
- * $Id: interpreter.h,v 1.107 2003/12/15 15:12:57 leo Exp $
+ * $Id: interpreter.h,v 1.108 2003/12/15 15:42:28 leo Exp $
* Overview:
* The interpreter api handles running the operations
* Data Structure and Algorithms:
@@ -298,6 +298,7 @@
void runops(struct Parrot_Interp *, size_t offset);
void runops_int(struct Parrot_Interp *, size_t offset);
void Parrot_runops_fromc(Parrot_Interp, PMC *sub);
+void Parrot_runops_fromc_save(Parrot_Interp, PMC *sub);
void* Parrot_runops_fromc_args(Parrot_Interp, PMC *sub, const char *sig, ...);
typedef opcode_t *(*native_func_t)(struct Parrot_Interp * interpreter,
1.9 +3 -3 parrot/src/events.c
Index: events.c
===================================================================
RCS file: /cvs/public/parrot/src/events.c,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -w -r1.8 -r1.9
--- events.c 15 Dec 2003 15:13:05 -0000 1.8
+++ events.c 15 Dec 2003 15:42:31 -0000 1.9
@@ -1,7 +1,7 @@
/* events.c
* Copyright: 2001-2003 The Perl Foundation. All Rights Reserved.
* CVS Info
- * $Id: events.c,v 1.8 2003/12/15 15:13:05 leo Exp $
+ * $Id: events.c,v 1.9 2003/12/15 15:42:31 leo Exp $
* Overview:
* Event handling stuff
* Data Structure and Algorithms:
@@ -296,8 +296,8 @@
switch (event->type) {
case EVENT_TYPE_TIMER:
- /* TODO run a variant that saves registers */
- Parrot_runops_fromc(interpreter, event->u.timer_event.sub);
+ /* run ops, save registers */
+ Parrot_runops_fromc_save(interpreter, event->u.timer_event.sub);
break;
default:
fprintf(stderr, "Unhandled event type %d\n", event->type);
1.239 +38 -1 parrot/src/interpreter.c
Index: interpreter.c
===================================================================
RCS file: /cvs/public/parrot/src/interpreter.c,v
retrieving revision 1.238
retrieving revision 1.239
diff -u -w -r1.238 -r1.239
--- interpreter.c 15 Dec 2003 15:13:05 -0000 1.238
+++ interpreter.c 15 Dec 2003 15:42:31 -0000 1.239
@@ -1,7 +1,7 @@
/* interpreter.c
* Copyright: 2001-2003 The Perl Foundation. All Rights Reserved.
* CVS Info
- * $Id: interpreter.c,v 1.238 2003/12/15 15:13:05 leo Exp $
+ * $Id: interpreter.c,v 1.239 2003/12/15 15:42:31 leo Exp $
* Overview:
* The interpreter api handles running the operations
* Data Structure and Algorithms:
@@ -673,6 +673,43 @@
offset = dest - interpreter->code->byte_code;
runops(interpreter, offset);
+}
+
+/*
+ * duplicated from delegates.pmc
+ */
+struct regsave {
+ struct IReg int_reg;
+ struct NReg num_reg;
+ struct SReg string_reg;
+ struct PReg pmc_reg;
+} regsave;
+
+PARROT_INLINE static struct regsave *
+save_regs(Parrot_Interp interp) {
+ struct regsave *save;
+ save = mem_sys_allocate(sizeof(struct regsave));
+ if (!save) {
+ internal_exception(ALLOCATION_ERROR, "No memory for save struct");
+ }
+ mem_sys_memcopy(save, interp, sizeof(struct regsave));
+ return save;
+}
+
+PARROT_INLINE static void
+restore_regs(Parrot_Interp interp, struct regsave *data) {
+ mem_sys_memcopy(interp, data, sizeof(struct regsave));
+ mem_sys_free(data);
+}
+/*=for api interpreter Parrot_runops_fromc_save
+ * like above but preserve registers
+ */
+void
+Parrot_runops_fromc_save(Parrot_Interp interpreter, PMC *sub)
+{
+ struct regsave *data = save_regs(interpreter);
+ Parrot_runops_fromc(interpreter, sub);
+ restore_regs(interpreter, data);
}
/*=for api interpreter Parrot_runops_fromc_args