blob: ef6bd3bbb8094401e6a5e10646d8b0f3e0fb555f [file] [log] [blame]
// Copyright (c) 2021, 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.graph;
import com.android.tools.r8.dex.CodeToKeep;
import com.android.tools.r8.dex.IndexedItemCollection;
import com.android.tools.r8.dex.MixedSectionCollection;
import com.android.tools.r8.errors.Unreachable;
import com.android.tools.r8.graph.DexCode.Try;
import com.android.tools.r8.graph.DexCode.TryHandler;
import com.android.tools.r8.ir.conversion.LensCodeRewriterUtils;
import com.android.tools.r8.utils.structural.CompareToVisitor;
import com.android.tools.r8.utils.structural.HashingVisitor;
import java.nio.ShortBuffer;
public interface DexWritableCode {
enum DexWritableCodeKind {
DEFAULT,
DEFAULT_INSTANCE_INITIALIZER,
THROW_NULL,
THROW_EXCEPTION
}
boolean isThrowExceptionCode();
ThrowExceptionCode asThrowExceptionCode();
default int acceptCompareTo(DexWritableCode code, CompareToVisitor visitor) {
DexWritableCodeKind kind = getDexWritableCodeKind();
DexWritableCodeKind otherKind = code.getDexWritableCodeKind();
if (kind != otherKind) {
return kind.compareTo(otherKind);
}
switch (kind) {
case DEFAULT:
return asDexCode().acceptCompareTo(code.asDexCode(), visitor);
case DEFAULT_INSTANCE_INITIALIZER:
return 0;
case THROW_NULL:
return 0;
case THROW_EXCEPTION:
assert isThrowExceptionCode();
return asThrowExceptionCode().acceptCompareTo(code.asThrowExceptionCode(), visitor);
default:
throw new Unreachable();
}
}
void acceptHashing(HashingVisitor visitor);
int codeSizeInBytes();
void collectIndexedItems(
IndexedItemCollection indexedItems,
ProgramMethod context,
GraphLens graphLens,
LensCodeRewriterUtils rewriter);
void collectMixedSectionItems(MixedSectionCollection mixedItems);
void writeKeepRulesForDesugaredLibrary(CodeToKeep codeToKeep);
DexDebugInfoForWriting getDebugInfoForWriting();
DexWritableCodeKind getDexWritableCodeKind();
DexString getHighestSortingString();
TryHandler[] getHandlers();
Try[] getTries();
int getRegisterSize(ProgramMethod method);
int getIncomingRegisterSize(ProgramMethod method);
int getOutgoingRegisterSize();
Code asCode();
default boolean isDexCode() {
return false;
}
default DexCode asDexCode() {
return null;
}
/** Rewrites the code to have JumboString bytecode if required by mapping. */
DexWritableCode rewriteCodeWithJumboStrings(
ProgramMethod method, ObjectToOffsetMapping mapping, DexItemFactory factory, boolean force);
void setCallSiteContexts(ProgramMethod method);
void writeDex(
ShortBuffer shortBuffer,
ProgramMethod context,
GraphLens graphLens,
LensCodeRewriterUtils lensCodeRewriter,
ObjectToOffsetMapping mapping);
}