package org.develnext.jphp.core.compiler.jvm.misc; import org.objectweb.asm.tree.LabelNode; import php.runtime.Memory; import java.util.ArrayList; import java.util.List; public class LocalVariable { public final String name; public final int index; public final LabelNode label; private LabelNode endLabel; private Class clazz; private boolean isImmutable; private boolean isReference; private int level; private List<Memory> values; private List<StackFrame> frames; public LocalVariable(String name, int index, LabelNode label, Class clazz){ this.name = name; this.index = index; this.label = label; this.clazz = clazz; this.level = 0; this.isImmutable = true; this.values = new ArrayList<Memory>(); this.frames = new ArrayList<StackFrame>(); } public void addStackFrame(StackFrame frame){ this.frames.add(frame); } public List<StackFrame> getStackFrames() { return frames; } public Class getClazz() { return clazz; } public boolean isReference() { return isReference; } public void setReference(boolean reference) { isReference = reference; } public void pushLevel(){ level += 1; } public int popLevel(){ if (values.size() >= level + 1) // if we set var inside, delete value of it values.remove(values.size() - 1); level -= 1; setValue(null); // fix for break value return level + 1; } public int getLevel(){ return level; } public void setValue(Memory value){ /*if (isReference) value = null;*/ if (values.size() < level){ values.add(value); } else if (values.size() > 0) { values.set(values.size() - 1, value); } } public Memory getValue(){ return values.isEmpty() ? null : values.get(values.size() - 1); } public boolean isImmutable() { return isImmutable; } public void setImmutable(boolean immutable) { isImmutable = immutable; } public LabelNode getEndLabel() { return endLabel; } public void setEndLabel(LabelNode endLabel) { this.endLabel = endLabel; } }