view src/main/gov/nasa/jpf/vm/DirectCallStackFrame.java @ 34:49be04cc6389 default tip java9-try

cyclic dependency ...
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Tue, 19 Dec 2017 11:21:23 +0900
parents 61d41facf527
children
line wrap: on
line source

/*
 * Copyright (C) 2014, United States Government, as represented by the
 * Administrator of the National Aeronautics and Space Administration.
 * All rights reserved.
 *
 * The Java Pathfinder core (jpf-core) platform is licensed under the
 * Apache License, Version 2.0 (the "License"); you may not use this file except
 * in compliance with the License. You may obtain a copy of the License at
 * 
 *        http://www.apache.org/licenses/LICENSE-2.0. 
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and 
 * limitations under the License.
 */
package gov.nasa.jpf.vm;

import gov.nasa.jpf.SystemAttribute;

/**
 * DirectCallStackFrames are only used for overlay calls (from native code), i.e.
 * there is no corresponding INVOKE instruction. The associated MethodInfos are
 * synthetic, their only code is (usually) a INVOKEx and a DIRECTCALLRETURN.
 * NOTE: such MethodInfos do not belong to any class
 * 
 * Arguments for the invoke insn have to be pushed explicitly by the caller
 * 
 * direct calls do not return any values themselves, but they do get the return values of the
 * called method pushed onto their own operand stack. If the DirectCallStackFrame user
 * needs such return values, it has to do so via ThreadInfo.getReturnedDirectCall()
 *
 */
public abstract class DirectCallStackFrame extends StackFrame implements SystemAttribute {
  
  MethodInfo callee;

  protected DirectCallStackFrame (MethodInfo miDirectCall, MethodInfo callee, int maxLocals, int maxStack){
    super( miDirectCall, maxLocals, maxStack);    
    this.callee = callee;
  }
  
  protected DirectCallStackFrame (MethodInfo miDirectCall, MethodInfo callee){
    super( miDirectCall, miDirectCall.getMaxLocals(), miDirectCall.getMaxStack());
    this.callee = callee;
  }
  
  public MethodInfo getCallee (){
    return callee;
  }
  
  @Override
  public String getStackTraceInfo () {
    StringBuilder sb = new StringBuilder(128);
    sb.append('[');
    sb.append( callee.getUniqueName());
    sb.append(']');
    return sb.toString();
  }
  
  public DirectCallStackFrame getPreviousDirectCallStackFrame(){
    StackFrame f = prev;
    while (f != null && !(f instanceof DirectCallStackFrame)){
      f = f.prev;
    }
    
    return (DirectCallStackFrame) f;
  }
  
  public void setFireWall(){
    mi.setFirewall(true);
  }

  @Override
  public boolean isDirectCallFrame () {
    return true;
  }
  
  @Override
  public boolean isSynthetic() {
    return true;
  }
  
  /*
   * those set the callee arguments for the invoke insn - the returned value is the slot index OFFSET (not the slot index
   * itself) for the next argument. This has to be used in a pattern like 
   *   int argOffset = frame.setArgument( 0, firstArg, a0);
   *   argOffset = frame.setLongArgument( argOffset, secondArg, a1);
   *   ...
   */
  
  public abstract int setArgument (int argOffset, int value, Object attr);
  public abstract int setLongArgument (int argOffset, long value, Object attr);
  public abstract int setReferenceArgument (int argOffset, int ref, Object attr);

  public int setFloatArgument (int argOffset, float value, Object attr){
    return setArgument( argOffset, Float.floatToIntBits(value), attr);
  }
  public int setDoubleArgument (int argOffset, double value, Object attr){
    return setLongArgument( argOffset, Double.doubleToLongBits(value), attr);
  }
  
}