19531284b1b6a29371ae8d8e6cfe3e1f1bfe23296Ben Gruver/*
29531284b1b6a29371ae8d8e6cfe3e1f1bfe23296Ben Gruver * Copyright 2013, Google Inc.
39531284b1b6a29371ae8d8e6cfe3e1f1bfe23296Ben Gruver * All rights reserved.
49531284b1b6a29371ae8d8e6cfe3e1f1bfe23296Ben Gruver *
59531284b1b6a29371ae8d8e6cfe3e1f1bfe23296Ben Gruver * Redistribution and use in source and binary forms, with or without
69531284b1b6a29371ae8d8e6cfe3e1f1bfe23296Ben Gruver * modification, are permitted provided that the following conditions are
79531284b1b6a29371ae8d8e6cfe3e1f1bfe23296Ben Gruver * met:
89531284b1b6a29371ae8d8e6cfe3e1f1bfe23296Ben Gruver *
99531284b1b6a29371ae8d8e6cfe3e1f1bfe23296Ben Gruver *     * Redistributions of source code must retain the above copyright
109531284b1b6a29371ae8d8e6cfe3e1f1bfe23296Ben Gruver * notice, this list of conditions and the following disclaimer.
119531284b1b6a29371ae8d8e6cfe3e1f1bfe23296Ben Gruver *     * Redistributions in binary form must reproduce the above
129531284b1b6a29371ae8d8e6cfe3e1f1bfe23296Ben Gruver * copyright notice, this list of conditions and the following disclaimer
139531284b1b6a29371ae8d8e6cfe3e1f1bfe23296Ben Gruver * in the documentation and/or other materials provided with the
149531284b1b6a29371ae8d8e6cfe3e1f1bfe23296Ben Gruver * distribution.
159531284b1b6a29371ae8d8e6cfe3e1f1bfe23296Ben Gruver *     * Neither the name of Google Inc. nor the names of its
169531284b1b6a29371ae8d8e6cfe3e1f1bfe23296Ben Gruver * contributors may be used to endorse or promote products derived from
179531284b1b6a29371ae8d8e6cfe3e1f1bfe23296Ben Gruver * this software without specific prior written permission.
189531284b1b6a29371ae8d8e6cfe3e1f1bfe23296Ben Gruver *
199531284b1b6a29371ae8d8e6cfe3e1f1bfe23296Ben Gruver * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
209531284b1b6a29371ae8d8e6cfe3e1f1bfe23296Ben Gruver * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
219531284b1b6a29371ae8d8e6cfe3e1f1bfe23296Ben Gruver * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
229531284b1b6a29371ae8d8e6cfe3e1f1bfe23296Ben Gruver * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
239531284b1b6a29371ae8d8e6cfe3e1f1bfe23296Ben Gruver * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
249531284b1b6a29371ae8d8e6cfe3e1f1bfe23296Ben Gruver * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
259531284b1b6a29371ae8d8e6cfe3e1f1bfe23296Ben Gruver * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
269531284b1b6a29371ae8d8e6cfe3e1f1bfe23296Ben Gruver * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
279531284b1b6a29371ae8d8e6cfe3e1f1bfe23296Ben Gruver * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
289531284b1b6a29371ae8d8e6cfe3e1f1bfe23296Ben Gruver * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
299531284b1b6a29371ae8d8e6cfe3e1f1bfe23296Ben Gruver * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
309531284b1b6a29371ae8d8e6cfe3e1f1bfe23296Ben Gruver */
319531284b1b6a29371ae8d8e6cfe3e1f1bfe23296Ben Gruver
329531284b1b6a29371ae8d8e6cfe3e1f1bfe23296Ben Gruverpackage org.jf.dexlib2.analysis;
339531284b1b6a29371ae8d8e6cfe3e1f1bfe23296Ben Gruver
349531284b1b6a29371ae8d8e6cfe3e1f1bfe23296Ben Gruverimport org.jf.dexlib2.Opcode;
359531284b1b6a29371ae8d8e6cfe3e1f1bfe23296Ben Gruverimport org.jf.dexlib2.iface.instruction.Instruction;
369531284b1b6a29371ae8d8e6cfe3e1f1bfe23296Ben Gruver
379531284b1b6a29371ae8d8e6cfe3e1f1bfe23296Ben Gruver/**
389531284b1b6a29371ae8d8e6cfe3e1f1bfe23296Ben Gruver * This represents a "fixed" odexed instruction, where the object register is always null and so the correct type
399531284b1b6a29371ae8d8e6cfe3e1f1bfe23296Ben Gruver * can't be determined. Typically, these are replaced by an equivalent instruction that would have the same
409531284b1b6a29371ae8d8e6cfe3e1f1bfe23296Ben Gruver * effect (namely, an NPE)
419531284b1b6a29371ae8d8e6cfe3e1f1bfe23296Ben Gruver */
429531284b1b6a29371ae8d8e6cfe3e1f1bfe23296Ben Gruverpublic class UnresolvedOdexInstruction implements Instruction {
439531284b1b6a29371ae8d8e6cfe3e1f1bfe23296Ben Gruver    public final Instruction originalInstruction;
449531284b1b6a29371ae8d8e6cfe3e1f1bfe23296Ben Gruver    //the register number that holds the (null) reference type that the instruction operates on
459531284b1b6a29371ae8d8e6cfe3e1f1bfe23296Ben Gruver    public final int objectRegisterNum;
469531284b1b6a29371ae8d8e6cfe3e1f1bfe23296Ben Gruver
479531284b1b6a29371ae8d8e6cfe3e1f1bfe23296Ben Gruver    public UnresolvedOdexInstruction(Instruction originalInstruction, int objectRegisterNumber) {
489531284b1b6a29371ae8d8e6cfe3e1f1bfe23296Ben Gruver        this.originalInstruction = originalInstruction;
499531284b1b6a29371ae8d8e6cfe3e1f1bfe23296Ben Gruver        this.objectRegisterNum = objectRegisterNumber;
509531284b1b6a29371ae8d8e6cfe3e1f1bfe23296Ben Gruver    }
519531284b1b6a29371ae8d8e6cfe3e1f1bfe23296Ben Gruver
529531284b1b6a29371ae8d8e6cfe3e1f1bfe23296Ben Gruver    @Override public Opcode getOpcode() {
539531284b1b6a29371ae8d8e6cfe3e1f1bfe23296Ben Gruver        return originalInstruction.getOpcode();
549531284b1b6a29371ae8d8e6cfe3e1f1bfe23296Ben Gruver    }
559531284b1b6a29371ae8d8e6cfe3e1f1bfe23296Ben Gruver
569531284b1b6a29371ae8d8e6cfe3e1f1bfe23296Ben Gruver    @Override public int getCodeUnits() {
579531284b1b6a29371ae8d8e6cfe3e1f1bfe23296Ben Gruver        return originalInstruction.getCodeUnits();
589531284b1b6a29371ae8d8e6cfe3e1f1bfe23296Ben Gruver    }
599531284b1b6a29371ae8d8e6cfe3e1f1bfe23296Ben Gruver}
60