GUARD is available since version 2.9.0.
GUARD function executes a macro, like EVAL, while ensuring sensitive information is protected. This is achieved by clearing part or all the stack, symbols and registers.
SAVE '.context' STORE
'should_fail' STORE // Parameter of the functon
'this is secret' 'secret' STORE
'this is also secret' POPR0
'this is another secret'
$should_fail <% FAIL %> IFT // May fail leaving the above secret
DROP // Drop the secret left on the stack
'result of the macro'
$.context // Context to restore
-1 // Hide all but 1 level. This is because this macro accepts one parameter.
// Object left on the stack, should be left untouched.
'should stay visible'
// Macro is failing, no result should be on the stack
<% T @macro %>
// Check internal symbols and regs are undefined
PUSHR0 ISNULL 'Register is protected after a failure' STORE
'secret' DEFINED F == 'Internal variable is protected after a failure' STORE
// Macro is not failing
// The result should be on the stack
'result of the macro' == 'Result is on the stack after a success' STORE
// Check internal symbols and regs are still undefined
PUSHR0 ISNULL 'Register is protected after a success' STORE
'secret' DEFINED F == 'Internal variable is protected after a success' STORE
// Because of the -1, GUARD leaves what's on the stack alone.
'should stay visible' == 'Initial object on the stack is left untouched after a failure and a success' STORE
// Check the stack is empty
DEPTH 0 == 'Nothing is left on the stack after a failure and a success' STORE
// Output checks
<% DUP LOAD SWAP PUT %>