001    /*
002     *  This file is part of the Jikes RVM project (http://jikesrvm.org).
003     *
004     *  This file is licensed to You under the Eclipse Public License (EPL);
005     *  You may not use this file except in compliance with the License. You
006     *  may obtain a copy of the License at
007     *
008     *      http://www.opensource.org/licenses/eclipse-1.0.php
009     *
010     *  See the COPYRIGHT.txt file distributed with this work for information
011     *  regarding copyright ownership.
012     */
013    package org.jikesrvm.compilers.baseline;
014    
015    import org.jikesrvm.VM;
016    
017    /**
018     * This class is used during the processing of reference maps for a method.
019     * <p>
020     * When a JSR has been processed the processing of a RET is pending.
021     * Need to track which JSR was processed, and where the "return address" value
022     * is being held (i.e. is it on the operand stack, or in a local variable).
023     * The value starts on the top of the stack, but is usually quickly moved to
024     * a local variable.
025     */
026    final class PendingRETInfo {
027    
028      // --------------------- Instance Data -------------------
029    
030      public final int JSRSubStartByteIndex;
031      public final int JSRBBNum;
032      /**
033       * index into map - represents either a local variable or a stack
034       * position
035       */
036      public int returnAddressLocation;
037      /** Sanity check the return address location is only updated once */
038      private boolean updatedOnce;
039      /** Block number of block after JSR */
040      public final short JSRNextBBNum;
041    
042      // --------------------- Constructors ----------------------------
043    
044      public PendingRETInfo(int JSRSubStartByteIndex, int JSRBBNum, int returnAddressLocation, short JSRNextBBNum) {
045        this.JSRSubStartByteIndex = JSRSubStartByteIndex;
046        this.JSRBBNum = JSRBBNum;
047        this.returnAddressLocation = returnAddressLocation;
048        this.JSRNextBBNum = JSRNextBBNum;
049        updatedOnce = false;
050      }
051    
052      public PendingRETInfo(PendingRETInfo copyfrom) {
053        this.JSRSubStartByteIndex = copyfrom.JSRSubStartByteIndex;
054        this.JSRBBNum = copyfrom.JSRBBNum;
055        this.returnAddressLocation = copyfrom.returnAddressLocation;
056        this.JSRNextBBNum = copyfrom.JSRNextBBNum;
057        this.updatedOnce = copyfrom.updatedOnce;
058      }
059    
060      // ------------------ Instance Method ---------------------------
061    
062      public void updateReturnAddressLocation(int newLocation) {
063        if (VM.VerifyAssertions) VM._assert(!updatedOnce);
064        updatedOnce = true;
065        returnAddressLocation = newLocation;
066      }
067    
068    }