opu.lljvm-python.0.2.0-EXPERIMENTAL.source-code.Method Maven / Gradle / Ivy
The newest version!
/**
* This is used to encapsulate a CodeAttr so it can be added
* into a class.
* @see ClassEnv#addMethod
* @author $Author: jonmeyerny $
* @version $Revision: 1.1 $
*/
package jas;
import java.io.*;
import java.util.Vector;
import java.util.Enumeration;
public class Method
{
short acc;
CP name, desc;
CodeAttr code;
ExceptAttr excepts;
SignatureAttr sig;
DeprecatedAttr depr;
AnnotationAttr annVis, annInvis;
AnnotParamAttr annParamVis, annParamInvis;
AnnotDefAttr annDef;
Vector generic;
/**
* @param macc method access permissions. It is a combination
* of the constants provided from RuntimeConstants
* @param name CP item representing name of method.
* @param desc CP item representing descnature for object
*/
public Method (short macc, AsciiCP name, AsciiCP desc)
{
acc = macc;
this.name = name;
this.desc = desc;
sig = null;
code = null;
excepts = null;
depr = null;
annVis = annInvis = null;
annParamVis = annParamInvis = null;
annDef = null;
generic = new Vector();
}
public void setCode(CodeAttr cd, ExceptAttr ex)
{ code = cd; excepts = ex; }
public void setSignature(SignatureAttr sig)
{ this.sig = sig; }
public void setDeprecated(DeprecatedAttr depr)
{ this.depr = depr; }
/**
* Add a generic attribute to the method. A generic attribute
* contains a stream of uninterpreted bytes which is ignored by
* the VM (as long as its name doesn't conflict with other names
* for attributes that are understood by the VM)
*/
public void addGenericAttr(GenericAttr g)
{ generic.addElement(g); }
/*
* procedure group for annotation description
*/
public Annotation addAnnotation(boolean visible, String clsname)
{
Annotation ann = new Annotation(clsname);
AnnotationAttr aa = visible ? annVis : annInvis;
if(aa == null) {
aa = new AnnotationAttr(visible);
if(visible) annVis = aa;
else annInvis = aa;
}
aa.add(ann);
return(ann);
}
public Annotation addAnnotation(boolean visible, String clsname, int paramnum)
throws jasError
{
if(paramnum <= 0 || paramnum >= 256)
throw new jasError("annotation parameter number can be in range 1-256", true);
Annotation ann = new Annotation(clsname);
AnnotParamAttr aa = visible ? annParamVis : annParamInvis;
if(aa == null) {
aa = new AnnotParamAttr(visible);
if(visible) annParamVis = aa;
else annParamInvis = aa;
}
aa.add(ann, paramnum-1);
return(ann);
}
public Annotation addAnnotation() throws jasError
{
if(annDef != null) Annotation.ParserError();
annDef = new AnnotDefAttr();
return(annDef.get());
}
void resolve(ClassEnv e)
{
e.addCPItem(name);
e.addCPItem(desc);
if (code != null) code.resolve(e);
if (excepts != null) excepts.resolve(e);
if (sig != null) sig.resolve(e);
if (depr != null) depr.resolve(e);
if (annVis != null) annVis.resolve(e);
if (annInvis != null) annInvis.resolve(e);
if (annParamVis != null) annParamVis.resolve(e);
if (annParamInvis != null) annParamInvis.resolve(e);
if (annDef != null) annDef.resolve(e);
for (Enumeration gen = generic.elements(); gen.hasMoreElements();)
{
GenericAttr gattr = (GenericAttr)gen.nextElement();
gattr.resolve(e);
}
}
void write(ClassEnv e, DataOutputStream out)
throws IOException, jasError
{
short cnt = (short)generic.size();
out.writeShort(acc);
out.writeShort(e.getCPIndex(name));
out.writeShort(e.getCPIndex(desc));
if (code != null) cnt++;
if (excepts != null) cnt++;
if (sig != null) cnt++;
if (depr != null) cnt++;
if (annVis != null) cnt++;
if (annInvis != null) cnt++;
if (annParamVis != null) cnt++;
if (annParamInvis != null) cnt++;
if (annDef != null) cnt++;
out.writeShort(cnt);
if (code != null) code.write(e, out);
if (excepts != null) excepts.write(e, out);
if (sig != null) sig.write(e, out);
if (depr != null) depr.write(e, out);
if (annVis != null) annVis.write(e, out);
if (annInvis != null) annInvis.write(e, out);
if (annParamVis != null) annParamVis.write(e, out);
if (annParamInvis != null) annParamInvis.write(e, out);
if (annDef != null) annDef.write(e, out);
for (Enumeration gen = generic.elements(); gen.hasMoreElements();)
{
GenericAttr gattr = (GenericAttr)gen.nextElement();
gattr.write(e, out);
}
}
}