Create holder inner class for pushing context state.
Fix bug with rsForEach corrupting parent context state.
Remove workaround from rsBalls.

Change-Id: I43a948536e70d44645d1c2ef7b97e1c5906f6943
diff --git a/libs/rs/rsContext.cpp b/libs/rs/rsContext.cpp
index 18bf9fa..143c4dc 100644
--- a/libs/rs/rsContext.cpp
+++ b/libs/rs/rsContext.cpp
@@ -262,21 +262,27 @@
     }
 }
 
+Context::PushState::PushState(Context *con) {
+    mRsc = con;
+    mFragment.set(con->getProgramFragment());
+    mVertex.set(con->getProgramVertex());
+    mStore.set(con->getProgramStore());
+    mRaster.set(con->getProgramRaster());
+}
+
+Context::PushState::~PushState() {
+    mRsc->setProgramFragment(mFragment.get());
+    mRsc->setProgramVertex(mVertex.get());
+    mRsc->setProgramStore(mStore.get());
+    mRsc->setProgramRaster(mRaster.get());
+    mRsc->setFont(mFont.get());
+}
+
 
 uint32_t Context::runScript(Script *s) {
-    ObjectBaseRef<ProgramFragment> frag(mFragment);
-    ObjectBaseRef<ProgramVertex> vtx(mVertex);
-    ObjectBaseRef<ProgramStore> store(mFragmentStore);
-    ObjectBaseRef<ProgramRaster> raster(mRaster);
-    ObjectBaseRef<Font> font(mFont);
+    PushState(this);
 
     uint32_t ret = s->run(this);
-
-    mFragment.set(frag);
-    mVertex.set(vtx);
-    mFragmentStore.set(store);
-    mRaster.set(raster);
-    mFont.set(font);
     return ret;
 }
 
@@ -441,13 +447,13 @@
      rsc->mScriptC.init(rsc);
      if (rsc->mIsGraphicsContext) {
          rsc->mStateRaster.init(rsc);
-         rsc->setRaster(NULL);
+         rsc->setProgramRaster(NULL);
          rsc->mStateVertex.init(rsc);
-         rsc->setVertex(NULL);
+         rsc->setProgramVertex(NULL);
          rsc->mStateFragment.init(rsc);
-         rsc->setFragment(NULL);
+         rsc->setProgramFragment(NULL);
          rsc->mStateFragmentStore.init(rsc);
-         rsc->setFragmentStore(NULL);
+         rsc->setProgramStore(NULL);
          rsc->mStateFont.init(rsc);
          rsc->setFont(NULL);
          rsc->mStateVertexArray.init(rsc);
@@ -753,7 +759,7 @@
     mRootScript.set(s);
 }
 
-void Context::setFragmentStore(ProgramStore *pfs) {
+void Context::setProgramStore(ProgramStore *pfs) {
     rsAssert(mIsGraphicsContext);
     if (pfs == NULL) {
         mFragmentStore.set(mStateFragmentStore.mDefault);
@@ -762,7 +768,7 @@
     }
 }
 
-void Context::setFragment(ProgramFragment *pf) {
+void Context::setProgramFragment(ProgramFragment *pf) {
     rsAssert(mIsGraphicsContext);
     if (pf == NULL) {
         mFragment.set(mStateFragment.mDefault);
@@ -771,7 +777,7 @@
     }
 }
 
-void Context::setRaster(ProgramRaster *pr) {
+void Context::setProgramRaster(ProgramRaster *pr) {
     rsAssert(mIsGraphicsContext);
     if (pr == NULL) {
         mRaster.set(mStateRaster.mDefault);
@@ -780,7 +786,7 @@
     }
 }
 
-void Context::setVertex(ProgramVertex *pv) {
+void Context::setProgramVertex(ProgramVertex *pv) {
     rsAssert(mIsGraphicsContext);
     if (pv == NULL) {
         mVertex.set(mStateVertex.mDefault);
@@ -951,22 +957,22 @@
 
 void rsi_ContextBindProgramStore(Context *rsc, RsProgramStore vpfs) {
     ProgramStore *pfs = static_cast<ProgramStore *>(vpfs);
-    rsc->setFragmentStore(pfs);
+    rsc->setProgramStore(pfs);
 }
 
 void rsi_ContextBindProgramFragment(Context *rsc, RsProgramFragment vpf) {
     ProgramFragment *pf = static_cast<ProgramFragment *>(vpf);
-    rsc->setFragment(pf);
+    rsc->setProgramFragment(pf);
 }
 
 void rsi_ContextBindProgramRaster(Context *rsc, RsProgramRaster vpr) {
     ProgramRaster *pr = static_cast<ProgramRaster *>(vpr);
-    rsc->setRaster(pr);
+    rsc->setProgramRaster(pr);
 }
 
 void rsi_ContextBindProgramVertex(Context *rsc, RsProgramVertex vpv) {
     ProgramVertex *pv = static_cast<ProgramVertex *>(vpv);
-    rsc->setVertex(pv);
+    rsc->setProgramVertex(pv);
 }
 
 void rsi_ContextBindFont(Context *rsc, RsFont vfont) {