Refactor DexViewBuilder
The code was previously pretty messy and hard to follow. This reworks some
things to make it more manageable. Among the changes:
* Pull out fragments of code into their own method, so the high level steps are
more apparent in methods like DexViewBuilder::Start.
* Pull frequently used types into global constants in dex_layout_compiler.cc.
* Rework register handling to track liveness so a strict stack discipline is no
longer needed.
Change-Id: Idb4b41f88c96a1ac4efb2c7b9bed05c2de0da999
diff --git a/startop/view_compiler/dex_layout_compiler.h b/startop/view_compiler/dex_layout_compiler.h
index 170a1a6..a34ed1f 100644
--- a/startop/view_compiler/dex_layout_compiler.h
+++ b/startop/view_compiler/dex_layout_compiler.h
@@ -79,36 +79,41 @@
private:
// Accessors for the stack of views that are under construction.
- dex::Value AcquireRegister();
- void ReleaseRegister();
+ dex::LiveRegister AcquireRegister();
dex::Value GetCurrentView() const;
dex::Value GetCurrentLayoutParams() const;
dex::Value GetParentView() const;
void PopViewStack();
+ // Methods to simplify building different code fragments.
+ void BuildGetLayoutInflater(dex::Value dest);
+ void BuildGetResources(dex::Value dest);
+ void BuildGetLayoutResource(dex::Value dest, dex::Value resources, dex::Value resid);
+ void BuildLayoutResourceToAttributeSet(dex::Value dest, dex::Value layout_resource);
+ void BuildXmlNext();
+ void BuildTryCreateView(dex::Value dest, dex::Value parent, dex::Value classname);
+
dex::MethodBuilder* method_;
- // Registers used for code generation
+ // Parameters to the generated method
dex::Value const context_;
dex::Value const resid_;
- const dex::Value inflater_;
- const dex::Value xml_;
- const dex::Value attrs_;
- const dex::Value classname_tmp_;
+
+ // Registers used for code generation
+ const dex::LiveRegister inflater_;
+ const dex::LiveRegister xml_;
+ const dex::LiveRegister attrs_;
+ const dex::LiveRegister classname_tmp_;
const dex::MethodDeclData xml_next_;
const dex::MethodDeclData try_create_view_;
const dex::MethodDeclData generate_layout_params_;
const dex::MethodDeclData add_view_;
- // used for keeping track of which registers are in use
- size_t top_register_{0};
- std::vector<dex::Value> register_stack_;
-
// Keep track of the views currently in progress.
struct ViewEntry {
- dex::Value view;
- std::optional<dex::Value> layout_params;
+ dex::LiveRegister view;
+ std::optional<dex::LiveRegister> layout_params;
};
std::vector<ViewEntry> view_stack_;
};