| // Copyright (c) 2016, the R8 project authors. Please see the AUTHORS file |
| // for details. All rights reserved. Use of this source code is governed by a |
| // BSD-style license that can be found in the LICENSE file. |
| |
| package com.android.tools.r8.smali; |
| |
| import static org.junit.Assert.assertEquals; |
| |
| import com.android.tools.r8.smali.SmaliBuilder.MethodSignature; |
| import com.android.tools.r8.utils.AndroidApp; |
| import com.android.tools.r8.utils.StringUtils; |
| import com.google.common.collect.ImmutableList; |
| import org.junit.Test; |
| |
| public class JumboStringTest extends SmaliTestBase { |
| |
| @Test |
| public void test() throws Exception { |
| StringBuilder builder = new StringBuilder(); |
| StringBuilder expectedBuilder = new StringBuilder(); |
| builder.append(StringUtils.lines(" new-instance v0, Ljava/lang/StringBuilder;")); |
| builder.append(StringUtils.lines(" invoke-direct { v0 }, Ljava/lang/StringBuilder;" |
| + "-><init>()V")); |
| for (int i = 0; i <= 0xffff + 2; i++) { |
| String prefixed = StringUtils.zeroPrefix(i, 5); |
| expectedBuilder.append(prefixed); |
| expectedBuilder.append(StringUtils.lines("")); |
| builder.append(StringUtils.lines(" const-string v1, \"" + prefixed + "\\n\"")); |
| builder.append( |
| StringUtils.lines(" invoke-virtual { v0, v1 }, Ljava/lang/StringBuilder;" |
| + "->append(Ljava/lang/String;)Ljava/lang/StringBuilder;")); |
| } |
| builder.append( |
| StringUtils.lines(" invoke-virtual { v0 }, Ljava/lang/StringBuilder;" |
| + "->toString()Ljava/lang/String;")); |
| builder.append(StringUtils.lines(" move-result-object v0")); |
| builder.append(StringUtils.lines(" return-object v0")); |
| |
| SmaliBuilder smaliBuilder = new SmaliBuilder(DEFAULT_CLASS_NAME); |
| |
| MethodSignature signature = smaliBuilder.addStaticMethod( |
| "java.lang.String", |
| DEFAULT_METHOD_NAME, |
| ImmutableList.of(), |
| 2, |
| builder.toString() |
| ); |
| |
| smaliBuilder.addMainMethod( |
| 2, |
| " sget-object v0, Ljava/lang/System;->out:Ljava/io/PrintStream;", |
| " invoke-static {}, LTest;->method()Ljava/lang/String;", |
| " move-result-object v1", |
| " invoke-virtual { v0, v1 }, Ljava/io/PrintStream;->print(Ljava/lang/String;)V", |
| " return-void" |
| ); |
| |
| AndroidApp originalApplication = buildApplication(smaliBuilder); |
| AndroidApp processedApplication = processApplication(originalApplication); |
| String result = runArt(processedApplication); |
| |
| assertEquals(expectedBuilder.toString(), result); |
| } |
| } |