[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