Index: courgette/patch_generator_x86_32.h |
diff --git a/courgette/patch_generator_x86_32.h b/courgette/patch_generator_x86_32.h |
index 1c56712a963ad45bb7bd77c1008e1f880ff94119..fa52f87aa79691bd7c702c48423e4f52b5dae61a 100644 |
--- a/courgette/patch_generator_x86_32.h |
+++ b/courgette/patch_generator_x86_32.h |
@@ -13,6 +13,7 @@ |
#include "base/memory/scoped_ptr.h" |
#include "courgette/assembly_program.h" |
#include "courgette/ensemble.h" |
+#include "courgette/program_detector.h" |
namespace courgette { |
@@ -61,7 +62,7 @@ class PatchGeneratorX86_32 : public TransformationPatchGenerator { |
// Generate old version of program using |corrected_parameters|. |
// TODO(sra): refactor to use same code from patcher_. |
- AssemblyProgram* old_program = NULL; |
+ scoped_ptr<AssemblyProgram> old_program; |
Status old_parse_status = |
ParseDetectedExecutable(old_element_->region().start(), |
old_element_->region().length(), |
@@ -71,52 +72,46 @@ class PatchGeneratorX86_32 : public TransformationPatchGenerator { |
return old_parse_status; |
} |
- AssemblyProgram* new_program = NULL; |
+ // TODO(huangs): Move the block below to right before |new_program| gets |
+ // used, so we can reduce Courgette-gen peak memory. |
+ scoped_ptr<AssemblyProgram> new_program; |
Status new_parse_status = |
ParseDetectedExecutable(new_element_->region().start(), |
new_element_->region().length(), |
&new_program); |
if (new_parse_status != C_OK) { |
- DeleteAssemblyProgram(old_program); |
LOG(ERROR) << "Cannot parse an executable " << new_element_->Name(); |
return new_parse_status; |
} |
- EncodedProgram* old_encoded = NULL; |
- Status old_encode_status = Encode(old_program, &old_encoded); |
- if (old_encode_status != C_OK) { |
- DeleteAssemblyProgram(old_program); |
+ scoped_ptr<EncodedProgram> old_encoded; |
+ Status old_encode_status = Encode(*old_program, &old_encoded); |
+ if (old_encode_status != C_OK) |
return old_encode_status; |
- } |
Status old_write_status = |
- WriteEncodedProgram(old_encoded, old_transformed_element); |
- DeleteEncodedProgram(old_encoded); |
- if (old_write_status != C_OK) { |
- DeleteAssemblyProgram(old_program); |
+ WriteEncodedProgram(old_encoded.get(), old_transformed_element); |
+ |
+ old_encoded.reset(nullptr); |
+ |
+ if (old_write_status != C_OK) |
return old_write_status; |
- } |
- Status adjust_status = Adjust(*old_program, new_program); |
- DeleteAssemblyProgram(old_program); |
- if (adjust_status != C_OK) { |
- DeleteAssemblyProgram(new_program); |
+ Status adjust_status = Adjust(*old_program, new_program.get()); |
+ old_program.reset(nullptr); |
+ if (adjust_status != C_OK) |
return adjust_status; |
- } |
- EncodedProgram* new_encoded = NULL; |
- Status new_encode_status = Encode(new_program, &new_encoded); |
- DeleteAssemblyProgram(new_program); |
+ scoped_ptr<EncodedProgram> new_encoded; |
+ Status new_encode_status = Encode(*new_program, &new_encoded); |
if (new_encode_status != C_OK) |
return new_encode_status; |
- Status new_write_status = |
- WriteEncodedProgram(new_encoded, new_transformed_element); |
- DeleteEncodedProgram(new_encoded); |
- if (new_write_status != C_OK) |
- return new_write_status; |
+ new_program.reset(nullptr); |
- return C_OK; |
+ Status new_write_status = |
+ WriteEncodedProgram(new_encoded.get(), new_transformed_element); |
+ return new_write_status; |
} |
Status Reform(SourceStreamSet* transformed_element, |