am 6059c395: am 55f8f121: Merge "Correctly free resouces bound to scripts when the scripts are deleted." into honeycomb

* commit '6059c3955d739ab5fad15f9bf6bb6f743a9b5ac2':
  Correctly free resouces bound to scripts when the scripts are deleted.
diff --git a/rsContext.cpp b/rsContext.cpp
index 40cb5c7..1dfedb3 100644
--- a/rsContext.cpp
+++ b/rsContext.cpp
@@ -528,6 +528,7 @@
 
 void Context::destroyWorkerThreadResources() {
     //LOGV("destroyWorkerThreadResources 1");
+    ObjectBase::zeroAllUserRef(this);
     if (mIsGraphicsContext) {
          mRaster.clear();
          mFragment.clear();
@@ -542,7 +543,6 @@
          mStateFont.deinit(this);
          mShaderCache.cleanupAll();
     }
-    ObjectBase::zeroAllUserRef(this);
     //LOGV("destroyWorkerThreadResources 2");
     mExit = true;
 }
diff --git a/rsFont.cpp b/rsFont.cpp
index 8571c32..7fdfbe0 100644
--- a/rsFont.cpp
+++ b/rsFont.cpp
@@ -74,6 +74,15 @@
     return true;
 }
 
+void Font::preDestroy() const {
+    for (uint32_t ct = 0; ct < mRSC->mStateFont.mActiveFonts.size(); ct++) {
+        if (mRSC->mStateFont.mActiveFonts[ct] == this) {
+            mRSC->mStateFont.mActiveFonts.removeAt(ct);
+            break;
+        }
+    }
+}
+
 void Font::invalidateTextureCache() {
     for (uint32_t i = 0; i < mCachedGlyphs.size(); i ++) {
         mCachedGlyphs.valueAt(i)->mIsValid = false;
@@ -309,13 +318,6 @@
         FT_Done_Face(mFace);
     }
 
-    for (uint32_t ct = 0; ct < mRSC->mStateFont.mActiveFonts.size(); ct++) {
-        if (mRSC->mStateFont.mActiveFonts[ct] == this) {
-            mRSC->mStateFont.mActiveFonts.removeAt(ct);
-            break;
-        }
-    }
-
     for (uint32_t i = 0; i < mCachedGlyphs.size(); i ++) {
         CachedGlyphInfo *glyph = mCachedGlyphs.valueAt(i);
         delete glyph;
@@ -799,11 +801,6 @@
 
     mDefault.clear();
 
-    Vector<Font*> fontsToDereference = mActiveFonts;
-    for (uint32_t i = 0; i < fontsToDereference.size(); i ++) {
-        fontsToDereference[i]->zeroUserRef();
-    }
-
     if (mLibrary) {
         FT_Done_FreeType( mLibrary );
         mLibrary = NULL;
diff --git a/rsFont.h b/rsFont.h
index 00d77c8..4820999 100644
--- a/rsFont.h
+++ b/rsFont.h
@@ -119,6 +119,7 @@
     Font(Context *rsc);
     bool init(const char *name, float fontSize, uint32_t dpi, const void *data = NULL, uint32_t dataLen = 0);
 
+    virtual void preDestroy() const;
     FT_Face mFace;
     bool mInitialized;
     bool mHasKerning;
diff --git a/rsScript.cpp b/rsScript.cpp
index efdc626..9ada9c2 100644
--- a/rsScript.cpp
+++ b/rsScript.cpp
@@ -78,8 +78,6 @@
             (*destPtr)->decSysRef();
         }
         *destPtr = val;
-    } else {
-        LOGV("Calling setVarObj on slot = %i which is null.  This is dangerous because the script will not hold a ref count on the object.", slot);
     }
 }
 
diff --git a/rsScriptC.cpp b/rsScriptC.cpp
index 3858e1c..fc673a2 100644
--- a/rsScriptC.cpp
+++ b/rsScriptC.cpp
@@ -94,16 +94,24 @@
 }
 
 ScriptC::ScriptC(Context *rsc) : Script(rsc) {
-    LOGD(">>>> ScriptC ctor called, obj=%p", this);
     mBccScript = NULL;
     memset(&mProgram, 0, sizeof(mProgram));
 }
 
 ScriptC::~ScriptC() {
-    LOGD(">>>> ~ScriptC() mBccScript = %p", mBccScript);
     if (mBccScript) {
+        if (mProgram.mObjectSlotList) {
+            for (size_t ct=0; ct < mProgram.mObjectSlotCount; ct++) {
+                setVarObj(mProgram.mObjectSlotList[ct], NULL);
+            }
+            delete [] mProgram.mObjectSlotList;
+            mProgram.mObjectSlotList = NULL;
+            mProgram.mObjectSlotCount = 0;
+        }
+
+
+        LOGD(">>>> ~ScriptC  bccDisposeScript(%p)", mBccScript);
         bccDisposeScript(mBccScript);
-        LOGD(">>>> ~ScriptC(mBCCScript)");
     }
     free(mEnviroment.mScriptText);
     mEnviroment.mScriptText = NULL;
@@ -589,6 +597,16 @@
             return false;
         }
     }
+
+    size_t objectSlotCount = bccGetObjectSlotCount(s->mBccScript);
+    uint32_t *objectSlots = NULL;
+    if (objectSlotCount) {
+        objectSlots = new uint32_t[objectSlotCount];
+        bccGetObjectSlotList(s->mBccScript, objectSlotCount, objectSlots);
+        s->mProgram.mObjectSlotList = objectSlots;
+        s->mProgram.mObjectSlotCount = objectSlotCount;
+    }
+
     return true;
 }
 
diff --git a/rsScriptC.h b/rsScriptC.h
index 7143c67..e794feb 100644
--- a/rsScriptC.h
+++ b/rsScriptC.h
@@ -42,8 +42,12 @@
 
         RunScript_t mRoot;
         VoidFunc_t mInit;
+
+        uint32_t * mObjectSlotList;
+        uint32_t mObjectSlotCount;
     };
 
+
     Program_t mProgram;
 
     BCCScriptRef mBccScript;