public override void Do(ICommandContext context) { BaseType valueToPush = null; switch (AccessMode) { case ValueAccessModes.Constant: valueToPush = value; break; case ValueAccessModes.LocalVariable: case ValueAccessModes.LocalVariableReference: valueToPush = context.GetVariable(name); break; case ValueAccessModes.Register: case ValueAccessModes.RegisterByReference: if (registryIndex >= 0) { valueToPush = context.Registry[registryIndex]; } else { valueToPush = context.Registry[registerName]; } break; } if (AccessMode == ValueAccessModes.Constant || AccessMode == ValueAccessModes.Register) { valueToPush = valueToPush.Dereference().Clone(); //valueToPush.Delete(); } // To revise: this code snippet has no effect on the tests. else if (AccessMode == ValueAccessModes.LocalVariableReference || AccessMode == ValueAccessModes.RegisterByReference) { valueToPush = valueToPush.ToReference(); } //else //{ // valueToPush = valueToPush.Clone(); //} if (valueToPush == null) { throw new Exceptions.InvalidOperationException("Cannot push a null."); } context.RunStack.Push(valueToPush); }