@@ -516,7 +516,7 @@ object Transformer {
516
516
loadEnvironmentAt(nextStackPointer, freshEnvironment);
517
517
518
518
eraseValues(freshEnvironment, Set ());
519
- val next = if (kind == StackEraser ) free else eraseFrames // TODO: improve this (in RTS?)
519
+ val next = if (kind == StackEraser ) freeStack else eraseFrames // TODO: improve this (in RTS?)
520
520
emit(Call (" _" , Ccc (), VoidType (), next, List (nextStackPointer)));
521
521
RetVoid ()
522
522
};
@@ -580,19 +580,26 @@ object Transformer {
580
580
}
581
581
582
582
def pushFrameOnto (stack : Operand , environment : machine.Environment , returnAddressName : String , sharer : Operand , eraser : Operand )(using ModuleContext , FunctionContext , BlockContext ) = {
583
- val stackPointer = LocalReference (stackPointerType, freshName(" stackPointer" ));
584
- val size = ConstantInt (environmentSize(environment) + 24 );
585
- emit(Call (stackPointer.name, Ccc (), stackPointer.tpe, stackAllocate, List (stack, size)));
583
+ val size = environmentSize(environment);
584
+
585
+ val newStack = LocalReference (stackType, freshName(" stack" ))
586
+ emit(Call (newStack.name, Ccc (), stackType, checkLimit, List (stack, ConstantInt (size + 24 ))));
587
+ setStack(newStack);
588
+
589
+ val environmentPointer = LocalReference (stackPointerType, freshName(" environmentPointer" ));
590
+ emit(Call (environmentPointer.name, Ccc (), stackPointerType, stackAllocate, List (newStack, ConstantInt (size))));
586
591
587
- val frameType = StructureType (List (environmentType(environment), frameHeaderType));
588
- storeEnvironmentAt(stackPointer, environment);
592
+ storeEnvironmentAt(environmentPointer, environment);
593
+
594
+ val headerPointer = LocalReference (stackPointerType, freshName(" headerPointer" ));
595
+ emit(Call (headerPointer.name, Ccc (), stackPointerType, stackAllocate, List (newStack, ConstantInt (24 ))));
589
596
590
597
val returnAddressPointer = LocalReference (PointerType (), freshName(" returnAddress_pointer" ));
591
- emit(GetElementPtr (returnAddressPointer.name, frameType, stackPointer , List (0 , 1 , 0 )));
598
+ emit(GetElementPtr (returnAddressPointer.name, frameHeaderType, headerPointer , List (0 , 0 )));
592
599
val sharerPointer = LocalReference (PointerType (), freshName(" sharer_pointer" ));
593
- emit(GetElementPtr (sharerPointer.name, frameType, stackPointer , List (0 , 1 , 1 )));
600
+ emit(GetElementPtr (sharerPointer.name, frameHeaderType, headerPointer , List (0 , 1 )));
594
601
val eraserPointer = LocalReference (PointerType (), freshName(" eraser_pointer" ));
595
- emit(GetElementPtr (eraserPointer.name, frameType, stackPointer , List (0 , 1 , 2 )));
602
+ emit(GetElementPtr (eraserPointer.name, frameHeaderType, headerPointer , List (0 , 2 )));
596
603
597
604
emit(Store (returnAddressPointer, ConstantGlobal (returnAddressName)));
598
605
emit(Store (sharerPointer, sharer));
@@ -706,6 +713,8 @@ object Transformer {
706
713
val eraseResumption = ConstantGlobal (" eraseResumption" );
707
714
val eraseFrames = ConstantGlobal (" eraseFrames" );
708
715
716
+ val freeStack = ConstantGlobal (" freeStack" )
717
+
709
718
val alloc = ConstantGlobal (" alloc" )
710
719
val getPointer = ConstantGlobal (" getPointer" )
711
720
@@ -719,6 +728,7 @@ object Transformer {
719
728
val underflowStack = ConstantGlobal (" underflowStack" );
720
729
val uniqueStack = ConstantGlobal (" uniqueStack" );
721
730
val withEmptyStack = ConstantGlobal (" withEmptyStack" );
731
+ val checkLimit = ConstantGlobal (" checkLimit" )
722
732
val stackAllocate = ConstantGlobal (" stackAllocate" );
723
733
val stackDeallocate = ConstantGlobal (" stackDeallocate" );
724
734
0 commit comments