    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
    032     * org.apache.commons.compress.harmony.unpack200.bytecode.forms.ByteCodeForm#fixUpByteCodeTargets(org.apache.commons
    033     * .compress.harmony.unpack200.bytecode.ByteCode,
    034     * org.apache.commons.compress.harmony.unpack200.bytecode.CodeAttribute)
    035     */
    036    @Override
    037    public void fixUpByteCodeTargets(final ByteCode byteCode, final CodeAttribute codeAttribute) {
    038        // SwitchForms need to fix up the target of label operations
    039        final int[] originalTargets = byteCode.getByteCodeTargets();
    040        final int numberOfLabels = originalTargets.length;
    041        final int[] replacementTargets = new int[numberOfLabels];
    042
    043        final int sourceIndex = byteCode.getByteCodeIndex();
    044        final int sourceValue = ((Integer) codeAttribute.byteCodeOffsets.get(sourceIndex)).intValue();
    045        for (int index = 0; index < numberOfLabels; index++) {
    046            final int absoluteInstructionTargetIndex = sourceIndex + originalTargets[index];
    047            final int targetValue = ((Integer) codeAttribute.byteCodeOffsets.get(absoluteInstructionTargetIndex))
    048                .intValue();
    049            replacementTargets[index] = targetValue - sourceValue;
    050        }
    051        final int[] rewriteArray = byteCode.getRewrite();
    052        for (int index = 0; index < numberOfLabels; index++) {
    053            setRewrite4Bytes(replacementTargets[index], rewriteArray);
    054        }
    055    }
    056
    057}