public inbox for frysk-cvs@sourceware.org
help / color / mirror / Atom feed
* [SCM]  master: Don't delete a local ref before it's last use.
@ 2008-06-07 16:51 cagney
  0 siblings, 0 replies; only message in thread
From: cagney @ 2008-06-07 16:51 UTC (permalink / raw)
  To: frysk-cvs

The branch, master has been updated
       via  4baf67699b3de5a88098a8eec820593ae4d153f2 (commit)
      from  7412e5a7e9e3256885448ede4d72c302ddbc469e (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email.

- Log -----------------------------------------------------------------
commit 4baf67699b3de5a88098a8eec820593ae4d153f2
Author: Andrew Cagney <cagney@redhat.com>
Date:   Sat Jun 7 12:50:22 2008 -0400

    Don't delete a local ref before it's last use.
    
    frysk-sys/lib/dwfl/ChangeLog
    2008-06-07  Andrew Cagney  <cagney@redhat.com>
    
    	* jni/ElfSymbol.cxx (ElfSymbol::elf_load_verneed): Don't delete a
    	local ref before you're finished with it.

-----------------------------------------------------------------------

Summary of changes:
 frysk-sys/lib/dwfl/ChangeLog         |    5 ++++
 frysk-sys/lib/dwfl/jni/ElfSymbol.cxx |   35 ++++++++++++++++++++-------------
 2 files changed, 26 insertions(+), 14 deletions(-)

First 500 lines of diff:
diff --git a/frysk-sys/lib/dwfl/ChangeLog b/frysk-sys/lib/dwfl/ChangeLog
index 101e9c2..762b92a 100644
--- a/frysk-sys/lib/dwfl/ChangeLog
+++ b/frysk-sys/lib/dwfl/ChangeLog
@@ -1,3 +1,8 @@
+2008-06-07  Andrew Cagney  <cagney@redhat.com>
+
+	* jni/ElfSymbol.cxx (ElfSymbol::elf_load_verneed): Don't delete a
+	local ref before you're finished with it.
+
 2008-06-06  Andrew Cagney  <cagney@redhat.com>
 
 	* TestDwarfDie.java (testGetModule()): Use LocalMemory
diff --git a/frysk-sys/lib/dwfl/jni/ElfSymbol.cxx b/frysk-sys/lib/dwfl/jni/ElfSymbol.cxx
index cff02d1..c00ea47 100644
--- a/frysk-sys/lib/dwfl/jni/ElfSymbol.cxx
+++ b/frysk-sys/lib/dwfl/jni/ElfSymbol.cxx
@@ -94,40 +94,44 @@ lib::dwfl::ElfSymbol::elf_load_verneed(jnixx::env env,
   int count = ret.GetArrayLength(env);
   int offset = 0;
   for (int i = 0; i < count; ++i) {
+    Need verneed;
+    jnixx::array<Aux> aux_elems;
     ::GElf_Verneed ver;
     if (::gelf_getverneed(data, offset, &ver) == NULL)
       return false;
 
-    Need verneed = Need::New(env);
+    verneed = Need::New(env);
     ret.SetObjectArrayElement(env, i, verneed);
     int auxcount = ver.vn_cnt;
 
     verneed.SetVersion(env, ver.vn_version);
     verneed.SetFilename(env, parent.getStringAtOffset(env, str_sect_index,
 						      ver.vn_file));
-    jnixx::array<Aux> aux_elems
-      = jnixx::array<Aux>::NewObjectArray(env, auxcount);
+    aux_elems = jnixx::array<Aux>::NewObjectArray(env, auxcount);
     verneed.SetAux(env, aux_elems);
 
     int aux_offset = offset + ver.vn_aux;
     offset += ver.vn_next;
     for (int j = 0; j < auxcount; ++j) {
+      String jname;
+      Aux vernaux;
       ::GElf_Vernaux aux;
       if (::gelf_getvernaux(data, aux_offset, &aux) == NULL)
 	return false;
 
-      Aux vernaux = Aux::New(env);
+      vernaux = Aux::New(env);
       vernaux.SetHash(env, (jint)aux.vna_hash);
       vernaux.SetWeak(env, (bool)((aux.vna_flags & VER_FLG_WEAK) == VER_FLG_WEAK));
-      String jname = parent.getStringAtOffset(env, str_sect_index,
-					      aux.vna_name);
+      jname = parent.getStringAtOffset(env, str_sect_index, aux.vna_name);
       vernaux.SetName(env, jname);
-      jname.DeleteLocalRef(env);
       vernaux.SetIndex(env, (jint)aux.vna_other);
-      vernaux.DeleteLocalRef(env);
       aux_elems.SetObjectArrayElement(env, j, vernaux);
       aux_offset += aux.vna_next;
+      vernaux.DeleteLocalRef(env);
+      jname.DeleteLocalRef(env);
     }
+    aux_elems.DeleteLocalRef(env);
+    verneed.DeleteLocalRef(env);
   }
   return true;
 }
@@ -145,11 +149,13 @@ lib::dwfl::ElfSymbol::elf_load_verdef(jnixx::env env,
   int count = ret.GetArrayLength(env);
   int offset = 0;
   for (int i = 0; i < count; ++i) {
+    jnixx::array<String> names_elems;
+    Def verdef;
     ::GElf_Verdef ver;
     if (::gelf_getverdef(data, offset, &ver) == NULL)
       return false;
 
-    Def verdef = Def::New(env);
+    verdef = Def::New(env);
     ret.SetObjectArrayElement(env, i, verdef);
     int auxcount = ver.vd_cnt;
 
@@ -157,23 +163,24 @@ lib::dwfl::ElfSymbol::elf_load_verdef(jnixx::env env,
     verdef.SetBase(env, (bool)((ver.vd_flags & VER_FLG_BASE) == VER_FLG_BASE));
     verdef.SetIndex(env, ver.vd_ndx);
     verdef.SetHash(env, ver.vd_hash);
-    jnixx::array<String> names_elems
-      = jnixx::array<String>::NewObjectArray(env, auxcount);
+    names_elems = jnixx::array<String>::NewObjectArray(env, auxcount);
     verdef.SetNames(env, names_elems);
     verdef.DeleteLocalRef(env);
 
     int aux_offset = offset + ver.vd_aux;
     offset += ver.vd_next;
     for (int j = 0; j < auxcount; ++j) {
+      String jname;
       ::GElf_Verdaux aux;
       if (::gelf_getverdaux(data, aux_offset, &aux) == NULL)
 	return false;
-      String jname = parent.getStringAtOffset(env, str_sect_index,
-					      aux.vda_name);
+      jname = parent.getStringAtOffset(env, str_sect_index, aux.vda_name);
       names_elems.SetObjectArrayElement(env, j, jname);
-      jname.DeleteLocalRef(env);
       aux_offset += aux.vda_next;
+      jname.DeleteLocalRef(env);
     }
+    verdef.DeleteLocalRef(env);
+    names_elems.DeleteLocalRef(env);
   }
   return true;
 }


hooks/post-receive
--
frysk system monitor/debugger


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2008-06-07 16:51 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2008-06-07 16:51 [SCM] master: Don't delete a local ref before it's last use cagney

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).