Let me update the example implementation of ``defer''. I think this is
more readable:

function defer {
  local trap
  eval "trap=($(trap -p RETURN))"
  trap -- "
    if [[ \$FUNCNAME != defer ]]; then
      trap - RETURN
      $1
      ${trap[2]-}
    fi" RETURN
}
declare -ft defer

I also tested it with an example to demonstrate the behavior:

function f1 {
  echo allocA
  defer 'echo freeA'
  echo allocB
  defer 'echo freeB'
  f2
  f2
}
function f2 {
  echo f2
  echo allocC
  defer 'echo freeC'
  echo allocD
  defer 'echo freeD'
}
f1
---------- result ----------
allocA
allocB
f2
allocC
allocD
freeD
freeC
f2
allocC
allocD
freeD
freeC
freeB
freeA

--
Koichi

Reply via email to