summaryrefslogtreecommitdiff
path: root/startop/view_compiler/dex_testcase_generator.cc
diff options
context:
space:
mode:
authorEric Holk <eholk@google.com>2019-07-30 14:47:06 -0700
committerEric Holk <eholk@google.com>2019-07-30 14:47:06 -0700
commitf3b9589e7b0ece086a2342a007850e7ef9b4ccde (patch)
tree598685ef3cf01265f6e73ee062402e71e17dc3f8 /startop/view_compiler/dex_testcase_generator.cc
parent8052fac1b134008efb33569d4523b8e06984a8fa (diff)
[view compiler] Add DexBuilder support for getting and setting instance fields
Bug: 111895153 Change-Id: I5fa2936501c79e30a66f3863b76229ec83433928
Diffstat (limited to 'startop/view_compiler/dex_testcase_generator.cc')
-rw-r--r--startop/view_compiler/dex_testcase_generator.cc39
1 files changed, 32 insertions, 7 deletions
diff --git a/startop/view_compiler/dex_testcase_generator.cc b/startop/view_compiler/dex_testcase_generator.cc
index fee5e722bc55..6dedf24e290d 100644
--- a/startop/view_compiler/dex_testcase_generator.cc
+++ b/startop/view_compiler/dex_testcase_generator.cc
@@ -282,15 +282,15 @@ void GenerateSimpleTestCases(const string& outdir) {
method.Encode();
}(castObjectToString);
+ TypeDescriptor test_class = TypeDescriptor::FromClassname("android.startop.test.TestClass");
+
// Read a static field
- // integer readStaticField() { return TestClass.staticInteger; }
+ // int readStaticField() { return TestClass.staticInteger; }
MethodBuilder readStaticField{
cbuilder.CreateMethod("readStaticField", Prototype{TypeDescriptor::Int()})};
[&](MethodBuilder& method) {
const ir::FieldDecl* field =
- dex_file.GetOrAddField(TypeDescriptor::FromClassname("android.startop.test.TestClass"),
- "staticInteger",
- TypeDescriptor::Int());
+ dex_file.GetOrAddField(test_class, "staticInteger", TypeDescriptor::Int());
Value result{method.MakeRegister()};
method.AddInstruction(Instruction::GetStaticField(field->orig_index, result));
method.BuildReturn(result, /*is_object=*/false);
@@ -303,9 +303,7 @@ void GenerateSimpleTestCases(const string& outdir) {
cbuilder.CreateMethod("setStaticField", Prototype{TypeDescriptor::Void()})};
[&](MethodBuilder& method) {
const ir::FieldDecl* field =
- dex_file.GetOrAddField(TypeDescriptor::FromClassname("android.startop.test.TestClass"),
- "staticInteger",
- TypeDescriptor::Int());
+ dex_file.GetOrAddField(test_class, "staticInteger", TypeDescriptor::Int());
Value number{method.MakeRegister()};
method.BuildConst4(number, 7);
method.AddInstruction(Instruction::SetStaticField(field->orig_index, number));
@@ -313,6 +311,33 @@ void GenerateSimpleTestCases(const string& outdir) {
method.Encode();
}(setStaticField);
+ // Read an instance field
+ // int readInstanceField(TestClass obj) { return obj.instanceField; }
+ MethodBuilder readInstanceField{
+ cbuilder.CreateMethod("readInstanceField", Prototype{TypeDescriptor::Int(), test_class})};
+ [&](MethodBuilder& method) {
+ const ir::FieldDecl* field =
+ dex_file.GetOrAddField(test_class, "instanceField", TypeDescriptor::Int());
+ Value result{method.MakeRegister()};
+ method.AddInstruction(Instruction::GetField(field->orig_index, result, Value::Parameter(0)));
+ method.BuildReturn(result, /*is_object=*/false);
+ method.Encode();
+ }(readInstanceField);
+
+ // Set an instance field
+ // void setInstanceField(TestClass obj) { obj.instanceField = 7; }
+ MethodBuilder setInstanceField{
+ cbuilder.CreateMethod("setInstanceField", Prototype{TypeDescriptor::Void(), test_class})};
+ [&](MethodBuilder& method) {
+ const ir::FieldDecl* field =
+ dex_file.GetOrAddField(test_class, "instanceField", TypeDescriptor::Int());
+ Value number{method.MakeRegister()};
+ method.BuildConst4(number, 7);
+ method.AddInstruction(Instruction::SetField(field->orig_index, Value::Parameter(0), number));
+ method.BuildReturn();
+ method.Encode();
+ }(setInstanceField);
+
slicer::MemView image{dex_file.CreateImage()};
std::ofstream out_file(outdir + "/simple.dex");
out_file.write(image.ptr<const char>(), image.size());