Index: courgette/assembly_program.cc |
diff --git a/courgette/assembly_program.cc b/courgette/assembly_program.cc |
index 20eee96ff5e04b5e0d1e77642526b6d7c7698a4e..de843f1329050e46d10da2cbb4eef90a74d7711a 100644 |
--- a/courgette/assembly_program.cc |
+++ b/courgette/assembly_program.cc |
@@ -7,16 +7,12 @@ |
#include <memory.h> |
#include <stddef.h> |
#include <stdint.h> |
-#include <algorithm> |
-#include <map> |
-#include <set> |
-#include <sstream> |
+ |
+#include <utility> |
#include <vector> |
#include "base/logging.h" |
#include "base/macros.h" |
-#include "base/memory/scoped_ptr.h" |
- |
#include "courgette/courgette.h" |
#include "courgette/encoded_program.h" |
@@ -365,13 +361,13 @@ void AssemblyProgram::AssignRemainingIndexes(RVAToLabel* labels) { |
<< " infill " << fill_infill_count; |
} |
-EncodedProgram* AssemblyProgram::Encode() const { |
+scoped_ptr<EncodedProgram> AssemblyProgram::Encode() const { |
scoped_ptr<EncodedProgram> encoded(new EncodedProgram()); |
encoded->set_image_base(image_base_); |
if (!encoded->DefineLabels(abs32_labels_, rel32_labels_)) |
- return NULL; |
+ return nullptr; |
for (size_t i = 0; i < instructions_.size(); ++i) { |
Instruction* instruction = instructions_[i]; |
@@ -380,13 +376,13 @@ EncodedProgram* AssemblyProgram::Encode() const { |
case ORIGIN: { |
OriginInstruction* org = static_cast<OriginInstruction*>(instruction); |
if (!encoded->AddOrigin(org->origin_rva())) |
- return NULL; |
+ return nullptr; |
break; |
} |
case DEFBYTE: { |
uint8_t b = static_cast<ByteInstruction*>(instruction)->byte_value(); |
if (!encoded->AddCopy(1, &b)) |
- return NULL; |
+ return nullptr; |
break; |
} |
case DEFBYTES: { |
@@ -395,13 +391,13 @@ EncodedProgram* AssemblyProgram::Encode() const { |
size_t len = static_cast<BytesInstruction*>(instruction)->len(); |
if (!encoded->AddCopy(len, byte_values)) |
- return NULL; |
+ return nullptr; |
break; |
} |
case REL32: { |
Label* label = static_cast<InstructionWithLabel*>(instruction)->label(); |
if (!encoded->AddRel32(label->index_)) |
- return NULL; |
+ return nullptr; |
break; |
} |
case REL32ARM: { |
@@ -410,34 +406,34 @@ EncodedProgram* AssemblyProgram::Encode() const { |
uint16_t compressed_op = |
static_cast<InstructionWithLabelARM*>(instruction)->compressed_op(); |
if (!encoded->AddRel32ARM(compressed_op, label->index_)) |
- return NULL; |
+ return nullptr; |
break; |
} |
case ABS32: { |
Label* label = static_cast<InstructionWithLabel*>(instruction)->label(); |
if (!encoded->AddAbs32(label->index_)) |
- return NULL; |
+ return nullptr; |
break; |
} |
case ABS64: { |
Label* label = static_cast<InstructionWithLabel*>(instruction)->label(); |
if (!encoded->AddAbs64(label->index_)) |
- return NULL; |
+ return nullptr; |
break; |
} |
case MAKEPERELOCS: { |
if (!encoded->AddPeMakeRelocs(kind_)) |
- return NULL; |
+ return nullptr; |
break; |
} |
case MAKEELFRELOCS: { |
if (!encoded->AddElfMakeRelocs()) |
- return NULL; |
+ return nullptr; |
break; |
} |
case MAKEELFARMRELOCS: { |
if (!encoded->AddElfARMMakeRelocs()) |
- return NULL; |
+ return nullptr; |
break; |
} |
default: { |
@@ -446,7 +442,7 @@ EncodedProgram* AssemblyProgram::Encode() const { |
} |
} |
- return encoded.release(); |
+ return encoded; |
} |
Instruction* AssemblyProgram::GetByteInstruction(uint8_t byte) { |
@@ -530,15 +526,13 @@ CheckBool AssemblyProgram::TrimLabels() { |
//////////////////////////////////////////////////////////////////////////////// |
-Status Encode(AssemblyProgram* program, EncodedProgram** output) { |
- *output = NULL; |
- EncodedProgram *encoded = program->Encode(); |
- if (encoded) { |
- *output = encoded; |
- return C_OK; |
- } else { |
- return C_GENERAL_ERROR; |
- } |
+Status Encode(const AssemblyProgram& program, |
+ scoped_ptr<EncodedProgram>* output) { |
+ // Explicitly release any memory associated with the output before encoding. |
+ output->reset(); |
+ |
+ *output = program.Encode(); |
+ return (*output) ? C_OK : C_GENERAL_ERROR; |
} |
} // namespace courgette |