| Index: courgette/courgette_flow.cc
|
| diff --git a/courgette/courgette_flow.cc b/courgette/courgette_flow.cc
|
| index 2fa9810379aeab323f05f33b03a576cf5ffdee44..4a1f7f39a9976073790f69858324cbd8e2f1919d 100644
|
| --- a/courgette/courgette_flow.cc
|
| +++ b/courgette/courgette_flow.cc
|
| @@ -11,6 +11,7 @@
|
| #include "base/memory/ptr_util.h"
|
| #include "base/strings/stringprintf.h"
|
| #include "courgette/assembly_program.h"
|
| +#include "courgette/disassembler.h"
|
| #include "courgette/encoded_program.h"
|
| #include "courgette/program_detector.h"
|
|
|
| @@ -86,16 +87,14 @@ void CourgetteFlow::ReadSourceStreamSetFromBuffer(Group group,
|
| }
|
| }
|
|
|
| -void CourgetteFlow::ReadAssemblyProgramFromBuffer(Group group,
|
| - const BasicBuffer& buffer,
|
| - bool annotate) {
|
| +void CourgetteFlow::ReadDisassemblerFromBuffer(Group group,
|
| + const BasicBuffer& buffer) {
|
| if (failed())
|
| return;
|
| Data* d = data(group);
|
| - auto parser = annotate ? ParseDetectedExecutableWithAnnotation
|
| - : ParseDetectedExecutable;
|
| - if (!check(parser(buffer.data(), buffer.length(), &d->program)))
|
| - setMessage("Cannot parse %s (code = %d).", name(group), status_);
|
| + d->disassembler = DetectDisassembler(buffer.data(), buffer.length());
|
| + if (!check(d->disassembler.get() != nullptr, C_INPUT_NOT_RECOGNIZED))
|
| + setMessage("Cannot detect program for %s.", name(group));
|
| }
|
|
|
| void CourgetteFlow::ReadEncodedProgramFromSourceStreamSet(
|
| @@ -109,12 +108,27 @@ void CourgetteFlow::ReadEncodedProgramFromSourceStreamSet(
|
| setMessage("Cannot read %s as encoded program.", name(group));
|
| }
|
|
|
| -void CourgetteFlow::CreateEncodedProgramFromAssemblyProgram(Group group) {
|
| +void CourgetteFlow::CreateAssemblyProgramFromDisassembler(Group group,
|
| + bool annotate) {
|
| if (failed())
|
| return;
|
| Data* d = data(group);
|
| - if (!check(Encode(*d->program, &d->encoded)))
|
| - setMessage("Cannot encode %s (code = %d).", name(group), status_);
|
| + d->program = d->disassembler->CreateProgram(annotate);
|
| + if (!check(d->program.get() != nullptr, C_DISASSEMBLY_FAILED))
|
| + setMessage("Cannot create AssemblyProgram for %s.", name(group));
|
| +}
|
| +
|
| +void CourgetteFlow::CreateEncodedProgramFromDisassemblerAndAssemblyProgram(
|
| + Group group) {
|
| + if (failed())
|
| + return;
|
| + Data* d = data(group);
|
| + d->encoded.reset(new EncodedProgram());
|
| + if (!check(d->disassembler->DisassembleAndEncode(d->program.get(),
|
| + d->encoded.get()))) {
|
| + setMessage("Cannot disassemble to form EncodedProgram for %s.",
|
| + name(group));
|
| + }
|
| }
|
|
|
| void CourgetteFlow::WriteSinkStreamFromSinkStreamSet(Group group,
|
| @@ -153,6 +167,12 @@ void CourgetteFlow::AdjustNewAssemblyProgramToMatchOld() {
|
| setMessage("Cannot adjust %s to match %s.", name(OLD), name(NEW));
|
| }
|
|
|
| +void CourgetteFlow::DestroyDisassembler(Group group) {
|
| + if (failed())
|
| + return;
|
| + data(group)->disassembler.reset();
|
| +}
|
| +
|
| void CourgetteFlow::DestroyAssemblyProgram(Group group) {
|
| if (failed())
|
| return;
|
|
|