use of org.candle.decompiler.intermediate.expression.Assignment in project candle-decompiler by bradsdavis.
the class ConstantArrayCompressor method extractConstantArrayAssignment.
public Assignment extractConstantArrayAssignment(Expression line) {
if (!(line instanceof Assignment)) {
return null;
}
Assignment assignment = (Assignment) line;
if (!(assignment.getLeftHandSide() instanceof ArrayAccess)) {
return null;
}
ArrayAccess apr = (ArrayAccess) assignment.getLeftHandSide();
if (!(apr.getArray() instanceof NewConstantArrayInstance)) {
return null;
}
return assignment;
}
use of org.candle.decompiler.intermediate.expression.Assignment in project candle-decompiler by bradsdavis.
the class MethodIntermediateVisitor method visitPUTFIELD.
public void visitPUTFIELD(PUTFIELD instruction) {
ConstantPoolGen cpg = context.getMethodGen().getConstantPool();
String fieldName = instruction.getFieldName(cpg);
Expression right = context.getExpressions().pop();
Expression left = context.getExpressions().pop();
FieldAccess fieldRef = new FieldAccess(context.getCurrentInstruction(), left, fieldName);
Assignment assignment = new Assignment(context.getCurrentInstruction(), fieldRef, right);
StatementIntermediate complete = new StatementIntermediate(context.getCurrentInstruction(), assignment);
context.pushIntermediateToInstruction(complete);
}
use of org.candle.decompiler.intermediate.expression.Assignment in project candle-decompiler by bradsdavis.
the class MethodIntermediateVisitor method visitPUTSTATIC.
public void visitPUTSTATIC(PUTSTATIC instruction) {
ConstantPoolGen cpg = context.getMethodGen().getConstantPool();
String fieldName = instruction.getFieldName(cpg);
Type fieldType = instruction.getFieldType(cpg);
Expression right = context.getExpressions().pop();
Variable variable = new Variable(context.getCurrentInstruction(), fieldType, fieldName);
Assignment assignment = new Assignment(context.getCurrentInstruction(), variable, right);
if (LOG.isDebugEnabled()) {
for (Field field : context.getJavaClass().getFields()) {
LOG.debug(field);
}
}
StatementIntermediate complete = new StatementIntermediate(context.getCurrentInstruction(), assignment);
context.pushIntermediateToInstruction(complete);
}
use of org.candle.decompiler.intermediate.expression.Assignment in project candle-decompiler by bradsdavis.
the class MethodIntermediateVisitor method visitStoreInstruction.
public void visitStoreInstruction(StoreInstruction instruction) {
Expression right = this.context.getExpressions().pop();
Type type = instruction.getType(context.getMethodGen().getConstantPool());
// first, check to see whether the variable currently has been declared.
// this would be the case if we don't get null when looking up the local variable.
int pc = context.getCurrentInstruction().getPosition();
int lvtIndex = instruction.getIndex();
IntermediateVariable iv = context.getVariableResolver().getLocalVariable(lvtIndex, pc);
// if the variable is not null, it is declared.
boolean declared = (iv != null);
Variable variable = null;
if (!declared) {
// look it up from the next phase code.
pc = this.context.getCurrentInstruction().getNext().getPosition();
iv = context.getVariableResolver().getLocalVariable(lvtIndex, pc);
if (iv == null) {
// probably need to create a variable for enhanced loops...
LOG.debug("Adding index: " + instruction.getIndex() + " as: " + type);
// try and resolve the type for the variable from the right hand side.
if (type == Type.OBJECT) {
if (right instanceof TypedExpression) {
type = ((TypedExpression) right).getType();
}
}
// generate variable name...
iv = context.getVariableResolver().addLocalVariable(instruction.getIndex(), context.getCurrentInstruction(), type);
variable = new GeneratedVariable(context.getCurrentInstruction(), iv.getType(), iv.getName());
}
}
// create the variable.
if (variable == null) {
variable = new Variable(context.getCurrentInstruction(), iv.getType(), iv.getName());
}
// create the assignment.
Assignment assignment = new Assignment(context.getCurrentInstruction(), variable, right);
Expression left = null;
if (declared) {
left = assignment;
} else {
// if it is currently not declared... create the declaration.
left = new Declaration(context.getCurrentInstruction(), variable, assignment);
}
StatementIntermediate cl = new StatementIntermediate(context.getCurrentInstruction(), left);
context.pushIntermediateToInstruction(cl);
LOG.debug("Stored.");
}
use of org.candle.decompiler.intermediate.expression.Assignment in project candle-decompiler by bradsdavis.
the class MethodIntermediateVisitor method processArrayStore.
protected void processArrayStore() {
Expression value = context.getExpressions().pop();
Expression arrayPosition = context.getExpressions().pop();
Expression arrayReference = context.getExpressions().pop();
ArrayAccess arrayPositionReference = new ArrayAccess(context.getCurrentInstruction(), arrayReference, arrayPosition);
Assignment assignment = new Assignment(context.getCurrentInstruction(), arrayPositionReference, value);
StatementIntermediate si = new StatementIntermediate(context.getCurrentInstruction(), assignment);
// add it to the intermediate lines.
context.pushIntermediateToInstruction(si);
}
Aggregations