From 8d6ae524ed5d2fed1f9e789d6de9764d374afa43 Mon Sep 17 00:00:00 2001 From: Nicolas Geoffray Date: Thu, 23 Oct 2014 18:32:13 +0100 Subject: [PATCH] Fix wrong unsigned to signed conversions. The HIntConstant node takes an int32_t, so we have to keep things signed. Change-Id: Ib3fa50e87f99118d320cbb381f619d5be9287530 --- compiler/optimizing/builder.cc | 14 +++++++++----- compiler/optimizing/builder.h | 2 +- test/412-new-array/src/Main.java | 20 ++++++++++++++++++++ 3 files changed, 30 insertions(+), 6 deletions(-) diff --git a/compiler/optimizing/builder.cc b/compiler/optimizing/builder.cc index 0ab7782e2..e4dee46c3 100644 --- a/compiler/optimizing/builder.cc +++ b/compiler/optimizing/builder.cc @@ -550,7 +550,7 @@ void HGraphBuilder::BuildFillArrayData(HInstruction* object, } void HGraphBuilder::BuildFillWideArrayData(HInstruction* object, - const uint64_t* data, + const int64_t* data, uint32_t element_count, uint32_t dex_offset) { for (uint32_t i = 0; i < element_count; ++i) { @@ -964,25 +964,29 @@ bool HGraphBuilder::AnalyzeDexInstruction(const Instruction& instruction, uint32 switch (payload->element_width) { case 1: - BuildFillArrayData(null_check, data, element_count, Primitive::kPrimByte, dex_offset); + BuildFillArrayData(null_check, + reinterpret_cast(data), + element_count, + Primitive::kPrimByte, + dex_offset); break; case 2: BuildFillArrayData(null_check, - reinterpret_cast(data), + reinterpret_cast(data), element_count, Primitive::kPrimShort, dex_offset); break; case 4: BuildFillArrayData(null_check, - reinterpret_cast(data), + reinterpret_cast(data), element_count, Primitive::kPrimInt, dex_offset); break; case 8: BuildFillWideArrayData(null_check, - reinterpret_cast(data), + reinterpret_cast(data), element_count, dex_offset); break; diff --git a/compiler/optimizing/builder.h b/compiler/optimizing/builder.h index c5e02db88..b55ef0764 100644 --- a/compiler/optimizing/builder.h +++ b/compiler/optimizing/builder.h @@ -154,7 +154,7 @@ class HGraphBuilder : public ValueObject { // Fills the given object with data as specified in the fill-array-data // instruction. The data must be for long and double arrays. void BuildFillWideArrayData(HInstruction* object, - const uint64_t* data, + const int64_t* data, uint32_t element_count, uint32_t dex_offset); diff --git a/test/412-new-array/src/Main.java b/test/412-new-array/src/Main.java index 3c7427583..168420cf8 100644 --- a/test/412-new-array/src/Main.java +++ b/test/412-new-array/src/Main.java @@ -24,6 +24,8 @@ public class Main extends TestCase { public static void main(String[] args) throws Exception { $opt$TestAllocations(); $opt$TestWithInitializations(); + $opt$TestNegativeValueNewByteArray(); + $opt$TestNegativeValueNewCharArray(); testSmaliFilledNewArray(); testSmaliFillArrayData(); testSmaliVerifyError(); @@ -109,6 +111,24 @@ public class Main extends TestCase { assertEquals(obj2, i[1]); } + static void $opt$TestNegativeValueNewByteArray() { + // Use an array initializer to hint the use of filled-new-array. + byte[] a = { (byte)0xa0, (byte)0xa1, (byte)0xa2, (byte)0xa3, + (byte)0xa4, (byte)0xa5, (byte)0xa6, (byte)0xa7 }; + for (int i = 0; i < a.length; i++) { + assertEquals((byte)0xa0 + i, a[i]); + } + } + + static void $opt$TestNegativeValueNewCharArray() { + // Use an array initializer to hint the use of filled-new-array. + char[] a = { (char)0xa000, (char)0xa001, (char)0xa002, (char)0xa003, + (char)0xa004, (char)0xa005, (char)0xa006, (char)0xa007 }; + for (int i = 0; i < a.length; i++) { + assertEquals((char)0xa000 + i, a[i]); + } + } + public static void testSmaliFilledNewArray() throws Exception { Class c = Class.forName("FilledNewArray"); -- 2.11.0