package railo.transformer.bytecode;
import java.util.List;
import java.util.Stack;
import org.objectweb.asm.ClassWriter;
import org.objectweb.asm.commons.GeneratorAdapter;
import org.objectweb.asm.commons.Method;
import railo.commons.lang.StringUtil;
import railo.runtime.PageSource;
import railo.transformer.Context;
import railo.transformer.bytecode.literal.LitString;
import railo.transformer.bytecode.visitor.OnFinally;
public class BytecodeContext implements Context {
private ClassWriter classWriter;
private GeneratorAdapter adapter;
private String className;
private List<LitString> keys;
private int count=0;
private Method method;
private boolean doSubFunctions=true;
private BytecodeContext staticConstr;
private BytecodeContext constr;
private final boolean supressWSbeforeArg;
private static long _id=0;
private synchronized static String id() {
if(_id<0)_id=0;
return StringUtil.addZeros(++_id,4);
}
private String id=id();
private Page page;
private PageSource source;
public BytecodeContext(PageSource source,BytecodeContext statConstr,BytecodeContext constr,Page page,List<LitString> keys,ClassWriter classWriter,String className, GeneratorAdapter adapter,
Method method,boolean writeLog, boolean supressWSbeforeArg) {
this.classWriter = classWriter;
this.className = className;
this.writeLog = writeLog;
this.adapter = adapter;
this.keys = keys;
this.method=method;
this.staticConstr=statConstr;
this.constr=constr;
this.page=page;
this.supressWSbeforeArg=supressWSbeforeArg;
if(source!=null)this.source=source;
else if(constr!=null)this.source=constr.source;
else if(statConstr!=null)this.source=statConstr.source;
}
public BytecodeContext(BytecodeContext statConstr,BytecodeContext constr,List<LitString> keys,BytecodeContext bc, GeneratorAdapter adapter,Method method) {
this.classWriter = bc.getClassWriter();
this.className = bc.getClassName();
this.writeLog = bc.writeLog();
this.adapter = adapter;
this.keys = keys;
this.method=method;
this.staticConstr=statConstr;
this.constr=constr;
this.page=bc.getPage();
this.supressWSbeforeArg=bc.supressWSbeforeArg;
this.source=bc.source;
}
/**
* @return the id
*/
public String getId() {
return id;
}
/**
* @return the count
*/
public int getCount() {
return count;
}
/**
* @param count the count to set
*/
public int incCount() {
return ++this.count;
}
public void resetCount() {
this.count=0;
}
/**
* @return the adapter
*/
public GeneratorAdapter getAdapter() {
return adapter;
}
/**
* @param adapter the adapter to set
*/
public void setAdapter(BytecodeContext bc) {
this.adapter = bc.getAdapter();
}
/**
* @return the classWriter
*/
public ClassWriter getClassWriter() {
return classWriter;
}
/**
* @param classWriter the classWriter to set
*/
public void setClassWriter(ClassWriter classWriter) {
this.classWriter = classWriter;
}
/**
* @return the className
*/
public String getClassName() {
return className;
}
/**
* @param className the className to set
*/
public void setClassName(String className) {
this.className = className;
}
public synchronized int registerKey(LitString lit) {
int index = keys.indexOf(lit);
if(index!=-1)return index;// calls the toString method of litString
keys.add(lit);
return keys.size()-1;
}
public List<LitString> getKeys() {
return keys;
}
Stack<OnFinally> tcf=new Stack<OnFinally>();
private int currentTag;
private int line;
private BytecodeContext root;
private boolean writeLog;
//private static BytecodeContext staticConstr;
public void pushOnFinally(OnFinally onFinally) {
tcf.push(onFinally);
}
public void popOnFinally() {
tcf.pop();
}
/*public void pushTryCatchFinallyData(TryCatchFinallyData data) {
tcf.push(data);
}
public void popTryCatchFinallyData() {
tcf.pop();
}*/
public Stack<OnFinally> getOnFinallyStack() {
return tcf;
}
/**
* @return the method
*/
public Method getMethod() {
return method;
}
/**
* @return the doSubFunctions
*/
public boolean doSubFunctions() {
return doSubFunctions;
}
/**
* @param doSubFunctions the doSubFunctions to set
* @return
*/
public boolean changeDoSubFunctions(boolean doSubFunctions) {
boolean old=this.doSubFunctions;
this.doSubFunctions = doSubFunctions;
return old;
}
/**
* @return the currentTag
*/
public int getCurrentTag() {
return currentTag;
}
/**
* @param currentTag the currentTag to set
*/
public void setCurrentTag(int currentTag) {
this.currentTag = currentTag;
}
public BytecodeContext getStaticConstructor() {
return staticConstr;
}
public BytecodeContext getConstructor() {
return constr;
}
public void visitLineNumber(int line) {
this.line=line;
getAdapter().visitLineNumber(line,getAdapter().mark());
}
public int getLine() {
return line;
}
public BytecodeContext getRoot() {
return root;
}
public void setRoot(BytecodeContext root) {
this.root= root;
}
public boolean writeLog() {
return this.writeLog;
}
public Page getPage() {
return page;
}
public boolean getSupressWSbeforeArg(){
return supressWSbeforeArg;
}
public PageSource getPageSource() {
return source;
}
}