File: ml-state.h

package info (click to toggle)
smlnj-runtime 110.44-2
  • links: PTS
  • area: main
  • in suites: sarge
  • size: 2,968 kB
  • ctags: 5,368
  • sloc: ansic: 24,674; asm: 4,195; makefile: 1,353; sh: 91
file content (82 lines) | stat: -rw-r--r-- 2,216 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
/* ml-state.h
 *
 * COPYRIGHT (c) 1992 by AT&T Bell Laboratories.
 *
 * This is the C view of the state of a ML computation.
 */

#ifndef _ML_STATE_
#define _ML_STATE_

#ifndef _ML_BASE_
#include "ml-base.h"
#endif

#ifndef _ML_ROOTS_
#include "ml-roots.h"
#endif

#if (!defined(_CNTR_) && defined(ICOUNT))
#include "cntr.h"
#endif

#define CALLEESAVE	3


/** The ML state vector **
 */
/* typedef struct ml_state ml_state_t; */  /* defined in ml-base.h */
struct ml_state {
				/* ML task info */
    heap_t	*ml_heap;	    /* The heap for this ML task */
#   define      ml_allocArena	  ml_heap->allocBase
#   define	ml_allocArenaSzB  ml_heap->allocSzB
    vproc_state_t *ml_vproc;	    /* the VProc that this is running on */

				/* ML registers */
    ml_val_t	*ml_allocPtr;
    ml_val_t	*ml_limitPtr;
    ml_val_t	ml_arg;
    ml_val_t	ml_cont;
    ml_val_t	ml_closure;
    ml_val_t	ml_linkReg;
    ml_val_t	ml_pc;		    /* Address of ML code to execute; when */
				    /* calling an ML frunction from C, this */
				    /* holds the same value as the linkReg. */
    ml_val_t	ml_exnCont;
    ml_val_t	ml_varReg;
    ml_val_t	ml_calleeSave[CALLEESAVE];

    ml_val_t	ml_storePtr;	    /* the list of store operations */

				  /* Linkage information */
    ml_val_t	ml_faultExn;		/* The exception packet for a hardware fault. */
    Word_t	ml_faultPC;		/* the PC of the faulting instruction */
#ifdef SOFT_POLL
    ml_val_t    *ml_realLimit;          /* real heap limit */
    bool_t      ml_pollPending;         /* poll event pending? */
    bool_t      ml_inPollHandler;       /* handling a poll event? */
#endif
}; /* struct ml_state */


/* set up the return linkage and continuation throwing in the ML state vector. */
#define SETUP_RETURN(msp)	{					\
	ml_state_t	*__msp = (msp);					\
	__msp->ml_closure	= ML_unit;				\
	__msp->ml_pc		= __msp->ml_cont;			\
    }

#define SETUP_THROW(msp, cont, val)	{				\
	ml_state_t	*__msp = (msp);					\
	ml_val_t	__cont = (cont);				\
	__msp->ml_closure	= __cont;				\
	__msp->ml_cont		= ML_unit;				\
	__msp->ml_pc		=					\
	__msp->ml_linkReg	= GET_CODE_ADDR(__cont);		\
	__msp->ml_exnCont	= ML_unit;				\
	__msp->ml_arg		= (val);				\
    }

#endif /* !_ML_STATE_ */