Implement new unprotect strategy
authorjpritikin <jpritikin@df83fd30-4cca-4c36-ab9d-e8b5583ccbd1>
Thu, 31 Jul 2014 15:47:00 +0000 (15:47 +0000)
committerjpritikin <jpritikin@df83fd30-4cca-4c36-ab9d-e8b5583ccbd1>
Thu, 31 Jul 2014 15:47:00 +0000 (15:47 +0000)
commit23a02b7889fcf4a3e58e9547897e3f72535b7637
treead2e2524723e97505605ab69a6fef05aa777dec9
parent8f4285cf0d84315c9669c3c5393099455a362c90
Implement new unprotect strategy

The old idiom was

Rf_protect(foo);
// do stuff
Rf_unprotect(1);  //foo

The second line expresses the hope that we are unprotecting the same
thing that we protected. However, this can fail when "do stuff" involves
anything non-trivial. If there is a protect (or worse, an extra
unprotect) inside "do stuff" then the unprotect will not unprotect foo
but something else.

The new strategy is to check whether the protect stack is
at the same place where we protected, ensuring that our
protects are always balanced by unprotects. It is still
required to think about what is necessary to protect,
but now there is less chance of something going wrong
in the unprotect part.

git-svn-id: http://openmx.psyc.virginia.edu/svn/trunk@3705 df83fd30-4cca-4c36-ab9d-e8b5583ccbd1
24 files changed:
Makefile
R/MxExpectationBA81.R
src/Compute.cpp
src/ComputeGD.cpp
src/autodep
src/ba81quad.cpp
src/dmvnorm.cpp
src/glue.cpp
src/glue.h
src/omxAlgebra.cpp
src/omxData.cpp
src/omxExpectation.cpp
src/omxExpectationBA81.cpp
src/omxExportBackendState.cpp
src/omxFitFunction.cpp
src/omxImportFrontendState.cpp
src/omxLISRELExpectation.cpp
src/omxMatrix.cpp
src/omxNPSOLSpecific.cpp
src/omxNormalExpectation.cpp
src/omxRAMExpectation.cpp
src/omxRFitFunction.cpp
src/omxRowFitFunction.cpp
src/omxWLSFitFunction.cpp