⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 localvarsattr.java

📁 linux下建立JAVA虚拟机的源码KAFFE
💻 JAVA
字号:
// Copyright (c) 1997, 2004  Per M.A. Bothner.// This is free software;  for terms and warranty disclaimer see ./COPYING.package gnu.bytecodecvssnap;import java.io.*;/* Represents the contents of a standard "LocalVariableTable" attribute. * @author      Per Bothner */public class LocalVarsAttr extends Attribute{  private Method method;  /* Map local slot index to the local variable that is there. */  Variable[] used;  public Scope current_scope;  Scope parameter_scope;  /** Add a new LocalVarsAttr to a CodeAttr. */  public LocalVarsAttr(CodeAttr code)  {    super("LocalVariableTable");    addToFrontOf(code);    method = (Method) code.getContainer();    code.locals = this;  }  /** Create, but don't link into method.code's attributes list (yet). */  public LocalVarsAttr(Method method)  {    super("LocalVariableTable");    CodeAttr code = method.code;    this.method = method;    code.locals = this;  }  public final Method getMethod() { return method; }  public VarEnumerator allVars ()  {    return new VarEnumerator (parameter_scope);  }  public void enterScope (Scope scope) {    scope.linkChild (current_scope);    current_scope = scope;    CodeAttr code = method.getCode();    for (Variable var = scope.firstVar ();  var != null;  var = var.nextVar ())      {	if (var.isSimple ())	  {	    if (! var.isAssigned ())	      var.allocateLocal(code);	    else if (used[var.offset] == null)	      used[var.offset] = var;	    else if (used[var.offset] != var)	      throw new Error ("inconsistent local variable assignments for "+var+" != "+used[var.offset]);	  }      }  }  /** Mark scopes upto specified scope as 'preserved'.   * This means that the local variable slots are not available for reuse   * when the scope exits.  The effected scopes are all ancestor scopes from   * the current scope (inclusive) upto the specified scope (exclusive). */  public void preserveVariablesUpto(Scope scope)  {    for (Scope cur = current_scope;  cur != scope;  cur = cur.parent)      cur.preserved = true;  }  public final boolean isEmpty ()  {    VarEnumerator vars = allVars();    Variable var;    while ((var = vars.nextVar ()) != null)      {	if (var.isSimple () && var.name != null)          return false;      }    return true;  }  public final int getCount ()  {    int local_variable_count = 0;    VarEnumerator vars = allVars();    Variable var;    while ((var = vars.nextVar ()) != null)      {	if (var.shouldEmit())	  local_variable_count++;      }    return local_variable_count;  }  public final int getLength()  {    return 2 + 10 * getCount();  }  public void assignConstants (ClassType cl)  {    super.assignConstants(cl);    VarEnumerator vars = allVars ();    Variable var;    while ((var = vars.nextVar ()) != null)      {	if (var.isSimple () && var.name != null)	  {	    if (var.name_index == 0)	      var.name_index = cl.getConstants().addUtf8(var.getName()).index;	    if (var.signature_index == 0)	      var.signature_index		= cl.getConstants().addUtf8(var.getType().signature).index;	  }      }  }  public void write (DataOutputStream dstr) throws java.io.IOException  {    VarEnumerator vars = allVars ();    Variable var;    dstr.writeShort (getCount());	        for (vars.reset (); (var = vars.nextVar ()) != null; )      {	if (var.shouldEmit())	  {	    Scope scope = var.scope;	    int start_pc = scope.start.position;	    int end_pc = scope.end.position;	    dstr.writeShort(start_pc);	    dstr.writeShort(end_pc - start_pc);	    dstr.writeShort(var.name_index);	    dstr.writeShort(var.signature_index);	    dstr.writeShort(var.offset);	  }      }  }  public void print (ClassTypeWriter dst)   {    VarEnumerator vars = allVars ();    dst.print("Attribute \"");    dst.print(getName());    dst.print("\", length:");    dst.print(getLength());    dst.print(", count: ");    dst.println(getCount());	        Variable var;    for (vars.reset (); (var = vars.nextVar ()) != null; )      {	if (var.isSimple () && var.name != null)	  {	    dst.print("  slot#");	    dst.print(var.offset);	    dst.print(": name: ");	    dst.printOptionalIndex(var.name_index);	    dst.print(var.getName());	    dst.print(", type: ");	    dst.printOptionalIndex(var.signature_index);	    dst.printSignature(var.getType());	    dst.print(" (pc: ");	    Scope scope = var.scope;	    int start_pc, end_pc;	    if (scope == null || scope.start == null || scope.end == null		|| (start_pc = scope.start.position) < 0		|| (end_pc = scope.end.position) < 0)	      dst.print("unknown");	    else	      {		dst.print(start_pc);		dst.print(" length: ");		dst.print(end_pc - start_pc);	      }	    dst.println(')');	  }      }  }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -