89 lines
1.6 KiB
C
89 lines
1.6 KiB
C
/* $Header$ */
|
|
|
|
#include <assert.h>
|
|
#include <alloc.h>
|
|
|
|
#include "operator.h"
|
|
#include "position.h"
|
|
#include "tree.h"
|
|
#include "message.h"
|
|
#include "type.h"
|
|
#include "expr.h"
|
|
|
|
extern long pointer_size;
|
|
extern p_tree get_from_item_list();
|
|
|
|
struct dump {
|
|
char *globals, *stack;
|
|
struct message_hdr mglobal, mstack;
|
|
struct dump *next;
|
|
};
|
|
|
|
static struct dump *last_dump;
|
|
|
|
/* dumping and restoring of child process.
|
|
*/
|
|
do_dump(p)
|
|
p_tree p;
|
|
{
|
|
struct dump *d = (struct dump *) malloc(sizeof(struct dump));
|
|
|
|
if (! d) {
|
|
error("could not allocate enough memory");
|
|
return;
|
|
}
|
|
if (! get_dump(&d->mglobal, &d->globals, &d->mstack, &d->stack)) {
|
|
free((char *) d);
|
|
return;
|
|
}
|
|
p->t_args[0] = (struct tree *) d;
|
|
p->t_address = (t_addr) get_int(d->mglobal.m_buf+PC_OFF*pointer_size, pointer_size, T_UNSIGNED);
|
|
add_to_item_list(p);
|
|
d->next = last_dump;
|
|
last_dump = d;
|
|
}
|
|
|
|
/* dumping and restoring of child process.
|
|
*/
|
|
do_restore(p)
|
|
p_tree p;
|
|
{
|
|
struct dump *d;
|
|
|
|
if (p->t_args[0]) {
|
|
p = get_from_item_list((int) p->t_args[0]->t_ival);
|
|
if (!p || p->t_oper != OP_DUMP) {
|
|
error("no such dump");
|
|
return;
|
|
}
|
|
d = (struct dump *) p->t_args[0];
|
|
}
|
|
else d = last_dump;
|
|
|
|
if (! d) {
|
|
error("no dumps");
|
|
return;
|
|
}
|
|
|
|
if (! put_dump(&d->mglobal, d->globals, &d->mstack, d->stack)) {
|
|
}
|
|
do_items();
|
|
}
|
|
|
|
free_dump(p)
|
|
p_tree p;
|
|
{
|
|
struct dump *d = (struct dump *) p->t_args[0];
|
|
|
|
free(d->globals);
|
|
free(d->stack);
|
|
if (d == last_dump) last_dump = d->next;
|
|
else {
|
|
register struct dump *d1 = last_dump;
|
|
|
|
while (d1->next != d) d1 = d1->next;
|
|
d1->next = d->next;
|
|
}
|
|
free((char *) d);
|
|
}
|