protected void PopRecursiveValues(Value[] values, EmitContext context) { if (values.Length == 0) { return; } Value stack = context.RecursiveStackValue; Value stackAddr = context.RecursiveStackAddressValue; BoundAccessExpression stackAddrAccess = BoundAccessExpression.BindAccess(stackAddr); TypeSymbol intType = context.GetTypeSymbol(SpecialType.System_Int32); TypeSymbol objectType = context.GetTypeSymbol(SpecialType.System_Object); TypeSymbol objectArrayType = objectType.MakeArrayType(context); context.Module.AddCommentTag("Recursive stack pop"); BoundInvocationExpression decrementExpression = new BoundPrefixOperatorExpression(context, SyntaxNode, stackAddrAccess, new ExternSynthesizedOperatorSymbol(BuiltinOperatorType.Subtraction, intType, context)); foreach (var valueToPop in values.Reverse()) { context.Emit(decrementExpression); ExternSynthesizedMethodSymbol arrayGetMethod = new ExternSynthesizedMethodSymbol(context, "Get", objectArrayType, new [] { intType }, objectType, false); context.Module.AddPush(stack); context.Module.AddPush(stackAddr); context.Module.AddPush(valueToPop); context.Module.AddExtern(arrayGetMethod); } context.Module.AddCommentTag("Recursive stack pop end"); }
protected void PushRecursiveValues(Value[] values, EmitContext context) { if (values.Length == 0) { return; } Value stack = context.RecursiveStackValue; BoundAccessExpression stackAccess = BoundAccessExpression.BindAccess(stack); Value stackAddr = context.RecursiveStackAddressValue; BoundAccessExpression stackAddrAccess = BoundAccessExpression.BindAccess(stackAddr); context.Module.AddCommentTag("Recursive stack push"); // Now we start copying values over to the stack BoundInvocationExpression incrementExpression = new BoundPrefixOperatorExpression(context, SyntaxNode, stackAddrAccess, new ExternSynthesizedOperatorSymbol(BuiltinOperatorType.Addition, context.GetTypeSymbol(SpecialType.System_Int32), context)); foreach (var valueToPush in values) { BoundArrayAccessExpression arraySet = new BoundArrayAccessExpression(null, context, stackAccess, new BoundExpression[] { stackAddrAccess }); context.EmitSet(arraySet, BoundAccessExpression.BindAccess(valueToPush)); context.Emit(incrementExpression); } context.Module.AddCommentTag("Recursive stack push end"); }