[Scummvm-cvs-logs] SF.net SVN: scummvm:[52592] scummvm/branches/gsoc2010-plugins

Bluddy at users.sourceforge.net Bluddy at users.sourceforge.net
Mon Sep 6 15:31:27 CEST 2010


Revision: 52592
          http://scummvm.svn.sourceforge.net/scummvm/?rev=52592&view=rev
Author:   Bluddy
Date:     2010-09-06 13:31:27 +0000 (Mon, 06 Sep 2010)

Log Message:
-----------
PLUGINS: used variation of ScopedPtr to clean up load() function

Modified Paths:
--------------
    scummvm/branches/gsoc2010-plugins/backends/plugins/elf/elf-loader.cpp
    scummvm/branches/gsoc2010-plugins/common/ptr.h

Modified: scummvm/branches/gsoc2010-plugins/backends/plugins/elf/elf-loader.cpp
===================================================================
--- scummvm/branches/gsoc2010-plugins/backends/plugins/elf/elf-loader.cpp	2010-09-06 12:16:21 UTC (rev 52591)
+++ scummvm/branches/gsoc2010-plugins/backends/plugins/elf/elf-loader.cpp	2010-09-06 13:31:27 UTC (rev 52592)
@@ -30,6 +30,7 @@
 #include "common/debug.h"
 #include "common/file.h"
 #include "common/fs.h"
+#include "common/ptr.h"
 
 DLObject::DLObject() :
 	_file(0),
@@ -303,8 +304,6 @@
 bool DLObject::load() {
 	Elf32_Ehdr ehdr;
 	Elf32_Phdr phdr;
-	Elf32_Shdr *shdr;
-	bool ret = true;
 
 	if (readElfHeader(&ehdr) == false)
 		return false;
@@ -319,29 +318,26 @@
 			return false;
 	}
 
-	shdr = loadSectionHeaders(&ehdr);
+	Common::ScopedPtrC<Elf32_Shdr> shdr(loadSectionHeaders(&ehdr));
 	if (!shdr)
 		return false;
 
-	if (ret && ((_symtab_sect = loadSymbolTable(&ehdr, shdr)) < 0))
-		ret = false;
+	_symtab_sect = loadSymbolTable(&ehdr, shdr);
+	if (_symtab_sect < 0)
+		return false;
+		
+	if (!loadStringTable(shdr))
+		return false;
+	
+	// Offset by our segment allocated address
+	// must use _segmentVMA here for multiple segments (MIPS)
+	_segmentOffset = ptrdiff_t(_segment) - _segmentVMA;
+	relocateSymbols(_segmentOffset);
 
-	if (ret && !loadStringTable(shdr))
-		ret = false;
+	if (!relocateRels(&ehdr, shdr))
+		return false;
 
-	if (ret) {
-		// Offset by our segment allocated address
-		// must use _segmentVMA here for multiple segments (MIPS)
-		_segmentOffset = ptrdiff_t(_segment) - _segmentVMA;
-		relocateSymbols(_segmentOffset);
-	}
-
-	if (ret && !relocateRels(&ehdr, shdr))
-		ret = false;
-
-	free(shdr);
-
-	return ret;
+	return true;
 }
 
 bool DLObject::open(const char *path) {

Modified: scummvm/branches/gsoc2010-plugins/common/ptr.h
===================================================================
--- scummvm/branches/gsoc2010-plugins/common/ptr.h	2010-09-06 12:16:21 UTC (rev 52591)
+++ scummvm/branches/gsoc2010-plugins/common/ptr.h	2010-09-06 13:31:27 UTC (rev 52592)
@@ -235,6 +235,7 @@
 	ReferenceType operator*() const { return *_pointer; }
 	PointerType operator->() const { return _pointer; }
 	operator PointerType() const { return _pointer; }
+	
 
 	/**
 	 * Implicit conversion operator to bool for convenience, to make
@@ -242,15 +243,17 @@
 	 */
 	operator bool() const { return _pointer != 0; }
 
+	void deletePointer() { delete _pointer; }
+	
 	~ScopedPtr() {
-		delete _pointer;
+		deletePointer();		
 	}
 
 	/**
 	 * Resets the pointer with the new value. Old object will be destroyed
 	 */
 	void reset(PointerType o = 0) {
-		delete _pointer;
+		deletePointer();
 		_pointer = o;
 	}
 
@@ -273,10 +276,19 @@
 		return r;
 	}
 
-private:
-	PointerType _pointer;
+protected:
+	PointerType _pointer;	
 };
 
+template<typename T>
+class ScopedPtrC : public ScopedPtr<T> {
+public:
+	typedef T *PointerType;
+	
+	explicit ScopedPtrC(PointerType o = 0) : ScopedPtr<T>(o) {}
+	
+	void deletePointer() { free(ScopedPtr<T>::_pointer); }
+};
 
 } // End of namespace Common
 


This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.




More information about the Scummvm-git-logs mailing list