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
  
  
  

Reply via email to