    001/*
    002 *  Licensed to the Apache Software Foundation (ASF) under one or more
    003 *  contributor license agreements.  See the NOTICE file distributed with
    004 *  this work for additional information regarding copyright ownership.
    005 *  The ASF licenses this file to You under the Apache License, Version 2.0
    006 *  (the "License"); you may not use this file except in compliance with
    007 *  the License.  You may obtain a copy of the License at
    008 *
    009 *     http://www.apache.org/licenses/LICENSE-2.0
    010 *
    011 *  Unless required by applicable law or agreed to in writing, software
    012 *  distributed under the License is distributed on an "AS IS" BASIS,
    013 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    014 *  See the License for the specific language governing permissions and
    015 *  limitations under the License.
    016 */
    017package org.apache.commons.compress.harmony.unpack200.bytecode.forms;
    018
    019import org.apache.commons.compress.harmony.unpack200.bytecode.ByteCode;
    020import org.apache.commons.compress.harmony.unpack200.bytecode.CodeAttribute;
    021
    022public abstract class SwitchForm extends VariableInstructionForm {
    023
    024    public SwitchForm(final int opcode, final String name) {
    025        super(opcode, name);
    026    }
    027
    028    /*
    029     * (non-Javadoc)
    030     *
    031     * @see org.apache.commons.compress.harmony.unpack200.bytecode.forms.ByteCodeForm#fixUpByteCodeTargets(org.apache.commons
    032     * .compress.harmony.unpack200.bytecode.ByteCode, org.apache.commons.compress.harmony.unpack200.bytecode.CodeAttribute)
    033     */
    034    @Override
    035    public void fixUpByteCodeTargets(final ByteCode byteCode, final CodeAttribute codeAttribute) {
    036        // SwitchForms need to fix up the target of label operations
    037        final int[] originalTargets = byteCode.getByteCodeTargets();
    038        final int numberOfLabels = originalTargets.length;
    039        final int[] replacementTargets = new int[numberOfLabels];
    040
    041        final int sourceIndex = byteCode.getByteCodeIndex();
    042        final int sourceValue = codeAttribute.byteCodeOffsets.get(sourceIndex).intValue();
    043        for (int index = 0; index < numberOfLabels; index++) {
    044            final int absoluteInstructionTargetIndex = sourceIndex + originalTargets[index];
    045            final int targetValue = codeAttribute.byteCodeOffsets.get(absoluteInstructionTargetIndex).intValue();
    046            replacementTargets[index] = targetValue - sourceValue;
    047        }
    048        final int[] rewriteArray = byteCode.getRewrite();
    049        for (int index = 0; index < numberOfLabels; index++) {
    050            setRewrite4Bytes(replacementTargets[index], rewriteArray);
    051        }
    052    }
    053
    054}