[M108 Migration][HBBTV] Implement ewk_context_register_jsplugin_mime_types API
[platform/framework/web/chromium-efl.git] / courgette / patcher_x86_32.h
1 // Copyright 2012 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef COURGETTE_PATCHER_X86_32_H_
6 #define COURGETTE_PATCHER_X86_32_H_
7
8 #include <stdint.h>
9
10 #include "base/logging.h"
11 #include "courgette/courgette_flow.h"
12 #include "courgette/ensemble.h"
13 #include "courgette/region.h"
14 #include "courgette/streams.h"
15
16 namespace courgette {
17
18 // PatcherX86_32 is the universal patcher for all executables. The executable
19 // type is determined by the program detector.
20 class PatcherX86_32 : public TransformationPatcher {
21  public:
22   explicit PatcherX86_32(const Region& region)
23       : ensemble_region_(region),
24         base_offset_(0),
25         base_length_(0) {
26   }
27
28   PatcherX86_32(const PatcherX86_32&) = delete;
29   PatcherX86_32& operator=(const PatcherX86_32&) = delete;
30
31   Status Init(SourceStream* parameter_stream) {
32     if (!parameter_stream->ReadVarint32(&base_offset_))
33       return C_BAD_TRANSFORM;
34     if (!parameter_stream->ReadVarint32(&base_length_))
35       return C_BAD_TRANSFORM;
36
37     if (base_offset_ > ensemble_region_.length())
38       return C_BAD_TRANSFORM;
39     if (base_length_ > ensemble_region_.length() - base_offset_)
40       return C_BAD_TRANSFORM;
41
42     return C_OK;
43   }
44
45   Status PredictTransformParameters(SinkStreamSet* predicted_parameters) {
46     // No code needed to write an 'empty' predicted parameter set.
47     return C_OK;
48   }
49
50   Status Transform(SourceStreamSet* corrected_parameters,
51                    SinkStreamSet* transformed_element) {
52     if (!corrected_parameters->Empty())
53       return C_GENERAL_ERROR;  // Don't expect any corrected parameters.
54
55     CourgetteFlow flow;
56     RegionBuffer only_buffer(
57         Region(ensemble_region_.start() + base_offset_, base_length_));
58     flow.ReadDisassemblerFromBuffer(flow.ONLY, only_buffer);
59     flow.CreateAssemblyProgramFromDisassembler(flow.ONLY, false);
60     flow.CreateEncodedProgramFromDisassemblerAndAssemblyProgram(flow.ONLY);
61     flow.DestroyAssemblyProgram(flow.ONLY);
62     flow.DestroyDisassembler(flow.ONLY);
63     flow.WriteSinkStreamSetFromEncodedProgram(flow.ONLY, transformed_element);
64     if (flow.failed())
65       LOG(ERROR) << flow.message();
66     return flow.status();
67   }
68
69   Status Reform(SourceStreamSet* transformed_element,
70                 SinkStream* reformed_element) {
71     CourgetteFlow flow;
72     flow.ReadEncodedProgramFromSourceStreamSet(flow.ONLY, transformed_element);
73     flow.WriteExecutableFromEncodedProgram(flow.ONLY, reformed_element);
74     if (flow.failed())
75       LOG(ERROR) << flow.message();
76     return flow.status();
77   }
78
79  private:
80   Region ensemble_region_;
81
82   uint32_t base_offset_;
83   uint32_t base_length_;
84 };
85
86 }  // namespace courgette
87
88 #endif  // COURGETTE_PATCHER_X86_32_H_