6 for(unsigned int i
=0;i
<X_COUNT
;++i
){
11 void read(ptrdiff_t i
){
17 void write(ptrdiff_t i
){
21 for(unsigned int i
=0;i
<s
;++i
)read(i
);
25 for(int i
=0;i
<-s
;++i
)read(i
);
38 stackTable
[S_CONT
]=&&stackCont
;
39 stackTable
[S_GC_CONT
]=&&stackGCCont
;
40 stackTable
[S_X
]=&&stackX
;
42 instrTable
[I_«»PP_INSTR_NAME
]=&&lbl_«»PP_INSTR_NAME
;
49 UnstableNode curThread
;
51 threads
.get(vm
, curThread
);
57 StackFrameHeader
* stackTop
=deref(curThread
).vt
->stackTop(deref(curThread
));
64 s_«»PP_INSTR_NAME
&i
__attribute__((unused
)) =*(s_«»PP_INSTR_NAME
*)IP
;
65 IP
+=sizeof(s_«»PP_INSTR_NAME
)/sizeof(Instr
);
75 GCContStackFrame
&f
=*(GCContStackFrame
*)stackTop
;
79 Node
&n
=deref(f
.abstr
);
82 n
.vt
->call(n
, nIP
, nG
, -1);
87 if(scheduleNext())goto nextThread
;
92 ContStackFrame
&f
=*(ContStackFrame
*)stackTop
;
100 if(scheduleNext())goto nextThread
;
105 XStackFrame
&f
=*(XStackFrame
*)stackTop
;
107 for(unsigned int i
=0;i
<f
.count
;++i
){
120 ContStackFrame
*fc
=alloc
<ContStackFrame
>(1);
121 fc
->kind
=&&stackCont
;
130 //PP_FOR_EACH_INSTR(«
131 if(*IP
==&&lbl_«»PP_INSTR_NAME
)
133 s_«»PP_INSTR_NAME
&i
__attribute__((unused
)) =*(s_«»PP_INSTR_NAME
*)IP
;
134 IP
+=sizeof(s_«»PP_INSTR_NAME
)/sizeof(Instr
);
136 PP_FOR_EACH_INSTR_PARAM(«
137 m4_ifelse(m4_defn(«PP_INSTR_PARAM_TYPE»),«WX»,«live.write(i.»PP_INSTR_PARAM_NAME«-X);»,
138 m4_defn(«PP_INSTR_PARAM_TYPE»),«RX»,«live.read(i.»PP_INSTR_PARAM_NAME«-X);»,
139 m4_defn(«PP_INSTR_PARAM_TYPE»),«PA»,«live.arity(i.»PP_INSTR_PARAM_NAME«);break;»,
140 m4_defn(«PP_INSTR_PARAM_TYPE»),«LX»,«live.finish(i.»PP_INSTR_PARAM_NAME«);break;»)»
146 {/*should never be reached*/}
148 XStackFrame
*fx
=alloc
<XStackFrame
>(1);
151 fx
->count
=live
.count
;
152 fx
->ptr
=alloc
<SavedX
>(live
.count
);
154 for(unsigned int i
=0;i
<live
.count
;++i
){
155 while(!live
.set
[j
])++j
;
156 SavedX
&s
=(fx
->ptr
)[i
];
161 deref(curThread
).vt
->stackTop(deref(curThread
))=fx
;
162 threads
.schedule(vm
, curThread
);
164 }while(!interrupted());
167 void VM::pushCall(Node
&thread
, Node
&proc
){
168 Node
&t
=deref(thread
);
169 StackFrameHeader
* &stackTop
=t
.vt
->stackTop(t
);
170 ContStackFrame
*f
=alloc
<ContStackFrame
>(1);
172 f
->kind
=stackTable
[S_CONT
];
176 n
.vt
->call(n
,f
->IP
,f
->G
,0);
181 exchange(active
,shadow
);
182 exchange(bigEmulAlloc
,bigEmulAllocShadow
);
183 exchange(smallEmulAlloc
,smallEmulAllocShadow
);
185 GC
* gc
=allocShadow
<GC
>(1);
186 new((void*)gc
)GC(*this);
189 bigEmulAllocShadow
.clear();
190 smallEmulAllocShadow
.clear();
193 void VM::gcStack(GC
&gc
, StackFrameHeader
* &from
, StackFrameHeader
* &to
){
194 StackFrameHeader
* f
=from
;
195 StackFrameHeader
** t
=&to
;
199 if(f
->kind
==stackTable
[S_CONT
]){
200 *t
=alloc
<GCContStackFrame
>(1);
201 GCContStackFrame
&tt
=*(GCContStackFrame
*)*t
;
202 ContStackFrame
&ff
=*(ContStackFrame
*)f
;
203 tt
.kind
=stackTable
[S_GC_CONT
];
204 tt
.offset
=ff
.IP
-ff
.startIP
;
206 new((void*)&(tt
.abstr
)) UnstableNode(gc
,ff
.G
[-1]);
207 tt
.Y
=alloc
<UnstableNode
>(ff
.numY
);
208 for(unsigned int i
=0;i
<ff
.numY
;++i
){
209 new((void*)&(tt
.Y
[i
])) UnstableNode(gc
,ff
.Y
[i
]);
214 }else if(f
->kind
==stackTable
[S_GC_CONT
]){
215 *t
=alloc
<GCContStackFrame
>(1);
216 GCContStackFrame
&tt
=*(GCContStackFrame
*)*t
;
217 GCContStackFrame
&ff
=*(GCContStackFrame
*)f
;
221 new((void*)&(tt
.abstr
)) UnstableNode(gc
,ff
.abstr
);
222 tt
.Y
=alloc
<UnstableNode
>(ff
.numY
);
223 for(unsigned int i
=0;i
<ff
.numY
;++i
){
224 new((void*)&(tt
.Y
[i
])) UnstableNode(gc
,ff
.Y
[i
]);
228 }else if(f
->kind
==stackTable
[S_X
]){
229 *t
=alloc
<XStackFrame
>(1);
230 XStackFrame
&tt
=*(XStackFrame
*)*t
;
231 XStackFrame
&ff
=*(XStackFrame
*)f
;
234 tt
.ptr
=alloc
<SavedX
>(ff
.count
);
235 for(unsigned int i
=0;i
<ff
.count
;++i
){
236 tt
.ptr
[i
].x
=ff
.ptr
[i
].x
;
237 new((void*)&(tt
.ptr
[i
].r
)) UnstableNode(gc
,ff
.ptr
[i
].r
);
242 }else{/*never reached*/}