Warning: session_start(): open(/var/lib/php/sessions/sess_rdcab9q8judbv328d53l8mles8, O_RDWR) failed: No space left on device (28) in /var/www/tb-usercake/models/config.php on line 51
Warning: session_start(): Failed to read session data: files (path: /var/lib/php/sessions) in /var/www/tb-usercake/models/config.php on line 51
!7
cprint FreezeStackDemo {
transient bool shouldFreeze;
start-thread {
print(myFunc(5));
print(myFunc_hibernatable(5));
set shouldFreeze;
try {
myFunc_hibernatable(5);
} catch Hib e {
print("Frozen stack:");
pnlStruct(e.stack);
VStack stack = e.asVStack();
stepAllWith(stack, r {
print(jreplace(struct(stack), "FreezeStackDemo$myFunc_vstack", "myFunc"));
});
print(stack.latestResult);
}
}
S myFunc(int n) {
if (n >= 100) n = 100;
if (n <= 0) ret "base";
ret n + " " + myFunc(n-1);
}
// Hibernation event
sclass Hib extends Exception {
L stack = new L;
void add(VStack.Computable entry) { stack.add(entry); }
VStack asVStack() { ret new VStack(reversed(stack)); }
}
srecord myFunc_vstack(int n) implements VStack.Computable {
public void step(VStack stack, O subResult) {
if (stack.hasSubResult())
stack._return(n + " " + subResult);
else {
if (n >= 100) n = 100;
if (n <= 0) ret with stack._return("base");
stack.push(new myFunc_vstack(n-1));
}
}
}
S myFunc_hibernatable(int n) throws Hib {
try {
if (n >= 100) n = 100;
if (n <= 0) if (shouldFreeze) hibernate(); else ret "base";
ret n + " " + myFunc_hibernatable(n-1);
} on fail Hib e {
e.add(new myFunc_vstack(n));
}
}
Hib hibernate() throws Hib {
throw new Hib;
}
}