Example usage for org.objectweb.asm Opcodes PUTSTATIC

List of usage examples for org.objectweb.asm Opcodes PUTSTATIC

Introduction

In this page you can find the example usage for org.objectweb.asm Opcodes PUTSTATIC.

Prototype

int PUTSTATIC

To view the source code for org.objectweb.asm Opcodes PUTSTATIC.

Click Source Link

Usage

From source file:com.android.ide.eclipse.apt.internal.analysis.ConstantFinalAnalyzer.java

License:Apache License

@Override
protected Collection<Problem> analyzeMethod(final MethodNode methodNode) {
    final LinkedList<Problem> problems = new LinkedList<Problem>();
    final InsnList instructions = methodNode.instructions;
    for (int i = 0; i < instructions.size(); i++) {
        final AbstractInsnNode insnNode = instructions.get(i);
        if (insnNode.getOpcode() == Opcodes.PUTSTATIC) {
            final FieldInsnNode field = (FieldInsnNode) insnNode;
            final String fieldName = field.name;
            if (!isFinal(fieldName)) {
                final Problem problem = new Problem(insnNode);
                problems.add(problem);/*w  w  w. jav a 2 s . c  o m*/
            }
        }
    }
    return problems;
}

From source file:com.android.ide.eclipse.apt.internal.analysis.InternalGetSetAnalyzer.java

License:Apache License

/**
 * Checks if a method is a setter/*from w  w w  . ja  v a2 s  . co m*/
 * @param methodTest The method to be checked
 * @return True if the method is a setter, false otherwise
 */
private boolean isSetter(final MethodNode methodTest) {
    boolean setter = false;
    final String desc = methodTest.desc;
    final Type[] arguments = Type.getArgumentTypes(desc);
    final Type returnType = Type.getReturnType(desc);
    if (arguments.length == 1 && returnType.getSort() == Type.VOID) {
        final InsnList instructions = methodTest.instructions;
        //skip label and line number instructions
        final AbstractInsnNode first = instructions.getFirst().getNext().getNext();
        final int loadOp = arguments[0].getOpcode(Opcodes.ILOAD);
        final int firstOp = first.getOpcode();
        //check for static setter
        if ((Opcodes.ACC_STATIC & methodTest.access) == 0) {
            if (firstOp == Opcodes.ALOAD) {
                final AbstractInsnNode second = first.getNext();
                if (second.getOpcode() == loadOp) {
                    final AbstractInsnNode third = second.getNext();
                    if (third.getOpcode() == Opcodes.PUTFIELD) {
                        //three next to skip label and line number instructions
                        final AbstractInsnNode fourth = third.getNext().getNext().getNext();
                        if (fourth.getOpcode() == Opcodes.RETURN) {
                            setter = true;
                        }
                    }
                }
            }
        } else {
            if (firstOp == loadOp) {
                final AbstractInsnNode second = first.getNext();
                if (second.getOpcode() == Opcodes.PUTSTATIC) {
                    final AbstractInsnNode third = second.getNext().getNext().getNext();
                    if (third.getOpcode() == Opcodes.RETURN) {
                        setter = true;
                    }
                }
            }
        }
    }
    return setter;
}

From source file:com.android.tools.lint.checks.CordovaVersionDetector.java

License:Apache License

private void checkInstructionInternal(ClassContext context, ClassNode classNode, AbstractInsnNode instruction) {

    FieldInsnNode node = (FieldInsnNode) instruction;
    if (node.getOpcode() == Opcodes.PUTSTATIC && node.owner.equals(FQN_CORDOVA_DEVICE)
            && node.name.equals(FIELD_NAME_CORDOVA_VERSION)) {
        AbstractInsnNode prevInstruction = LintUtils.getPrevInstruction(node);
        if (prevInstruction == null || prevInstruction.getOpcode() != Opcodes.LDC) {
            return;
        }/*from  w  w w. j ava 2s.co  m*/
        LdcInsnNode ldcInsnNode = (LdcInsnNode) prevInstruction;
        if (ldcInsnNode.cst instanceof String) {
            mCordovaVersion = createVersion((String) ldcInsnNode.cst);
            if (mCordovaVersion != null) {
                validateCordovaVersion(context, mCordovaVersion, context.getLocation(classNode));
            }
        }
    }
}

From source file:com.codename1.tools.translator.bytecodes.Field.java

License:Open Source License

@Override
public void appendInstruction(StringBuilder sbOut) {
    valueOpAppended = false;/*from   w w w .j av  a  2s.  co m*/
    targetOpAppended = false;
    StringBuilder b = new StringBuilder();
    b.append("    ");
    switch (opcode) {
    case Opcodes.GETSTATIC:
        switch (desc.charAt(0)) {
        case 'L':
        case '[':
            b.append("PUSH_POINTER");
            break;
        case 'D':
            b.append("PUSH_DOUBLE");
            break;
        case 'F':
            b.append("PUSH_FLOAT");
            break;
        case 'J':
            b.append("PUSH_LONG");
            break;
        default:
            b.append("PUSH_INT");
            break;
        }
        b.append("(get_static_");
        b.append(owner.replace('/', '_').replace('$', '_'));
        b.append("_");
        b.append(name.replace('/', '_').replace('$', '_'));
        b.append("(threadStateData));\n");
        break;
    case Opcodes.PUTSTATIC: {
        //b.append("SAFE_RETAIN(1);\n    ");
        b.append("set_static_");
        b.append(owner.replace('/', '_').replace('$', '_'));
        b.append("_");
        b.append(name.replace('/', '_').replace('$', '_'));
        b.append("(threadStateData, ");
        StringBuilder sb2 = new StringBuilder();
        StringBuilder sb3 = new StringBuilder();
        if (valueOp != null && valueOp instanceof AssignableExpression
                && ((AssignableExpression) valueOp).assignTo(null, sb2)) {
            b.append(sb2.toString().trim()).append(");\n");
            valueOpAppended = true;
        } else if (valueOp != null && valueOp instanceof CustomInvoke
                && ((CustomInvoke) valueOp).appendExpression(sb3)) {
            b.append(sb3.toString().trim()).append(");\n");
            valueOpAppended = true;
        } else {

            switch (desc.charAt(0)) {
            case 'L':
            case '[':
                b.append("PEEK_OBJ(1));\n    SP--;\n");
                sbOut.append(b);
                return;
            case 'D':
                b.append("POP_DOUBLE");
                break;
            case 'F':
                b.append("POP_FLOAT");
                break;
            case 'J':
                b.append("POP_LONG");
                break;
            default:
                b.append("POP_INT");
                break;
            }
            b.append("());\n");
        }

        break;
    }
    case Opcodes.GETFIELD: {
        StringBuilder sb3 = new StringBuilder();
        boolean targetProvided = (targetOp != null && targetOp instanceof AssignableExpression
                && ((AssignableExpression) targetOp).assignTo(null, sb3));

        switch (desc.charAt(0)) {
        case 'L':
        case '[':
            b.append("PUSH_POINTER");
            break;
        case 'D':
            b.append("PUSH_DOUBLE");
            break;
        case 'F':
            b.append("PUSH_FLOAT");
            break;
        case 'J':
            b.append("PUSH_LONG");
            break;
        default:
            b.append("PUSH_INT");
            break;
        }

        b.append("(get_field_");
        b.append(owner.replace('/', '_').replace('$', '_'));
        b.append("_");
        b.append(name);

        if (targetProvided) {
            b.append("(").append(sb3.toString().trim()).append("));\n");
            targetOpAppended = true;
            //} else if(useThis) {
            //    b.append("(__cn1ThisObject));\n");
        } else {
            b.append("(POP_OBJ()));\n");
        }
        break;
    }
    case Opcodes.PUTFIELD: {
        //b.append("SAFE_RETAIN(1);\n    ");
        b.append("set_field_");
        b.append(owner.replace('/', '_').replace('$', '_'));
        b.append("_");
        b.append(name);
        b.append("(threadStateData, ");

        StringBuilder sb2 = new StringBuilder();
        StringBuilder sb3 = new StringBuilder();

        String targetLiteral = null;
        String valueLiteral = null;
        if (valueOp != null && valueOp instanceof AssignableExpression
                && ((AssignableExpression) valueOp).assignTo(null, sb2)) {
            valueLiteral = sb2.toString().trim();
        } else if (valueOp != null && valueOp instanceof CustomInvoke
                && ((CustomInvoke) valueOp).appendExpression(sb3)) {
            valueLiteral = sb3.toString().trim();
        }
        sb3.setLength(0);
        if (targetOp != null && targetOp instanceof AssignableExpression
                && ((AssignableExpression) targetOp).assignTo(null, sb3)) {
            targetLiteral = sb3.toString().trim();
        }

        if (valueLiteral != null && targetLiteral != null) {
            b.append(valueLiteral).append(", ").append(targetLiteral).append(");\n");
            valueOpAppended = true;
            targetOpAppended = true;
        } else {
            switch (desc.charAt(0)) {
            case 'L':
            case '[':
                b.append("PEEK_OBJ");
                //if(useThis) {
                //    b.append("(1), __cn1ThisObject);\n    SP--;\n");
                //} else {
                b.append("(1), PEEK_OBJ(2));\n    POP_MANY(2);\n");
                //}
                sbOut.append(b);
                return;
            case 'D':
                b.append("POP_DOUBLE");
                break;
            case 'F':
                b.append("POP_FLOAT");
                break;
            case 'J':
                b.append("POP_LONG");
                break;
            default:
                b.append("POP_INT");
                break;
            }
            //if(useThis) {
            //    b.append("(), __cn1ThisObject);\n");
            //} else {
            b.append("(), POP_OBJ());\n");
            //}
        }
        break;
    }
    }
    if (valueOp != null && !valueOpAppended) {
        valueOp.appendInstruction(sbOut);
        valueOpAppended = true;
    }
    if (targetOp != null && !targetOpAppended) {
        targetOp.appendInstruction(sbOut);
        targetOpAppended = true;
    }
    sbOut.append(b);
}

From source file:com.codename1.tools.translator.bytecodes.Field.java

License:Open Source License

/**
 * @param useThis the useThis to set/*from   w  w w . j  a v  a  2 s  . c  o m*/
 */
//public void setUseThis(boolean useThis) {
//    this.useThis = useThis;
//}

public static int tryReduce(List<Instruction> instructions, int index) {
    Instruction instr = instructions.get(index);
    if (!(instr instanceof Field)) {
        return -1;
    }
    if (instr.getOpcode() == Opcodes.PUTFIELD) {
        if (index < 2) {
            return -1;
        }

        Field f = (Field) instr;
        if (f.targetOp != null || f.valueOp != null) {
            return -1;
        }
        Instruction targetInstr = instructions.get(index - 2);
        if (!(targetInstr instanceof AssignableExpression)) {
            return -1;
        }
        Instruction valueInstr = instructions.get(index - 1);
        if (!(valueInstr instanceof AssignableExpression)) {
            return -1;
        }

        StringBuilder sb = new StringBuilder();

        AssignableExpression targetExpr = (AssignableExpression) targetInstr;
        if (!targetExpr.assignTo(null, sb)) {
            return -1;
        }

        AssignableExpression valueExpr = (AssignableExpression) valueInstr;
        if (!valueExpr.assignTo(null, sb)) {
            return -1;
        }

        f.targetOp = targetInstr;
        f.valueOp = valueInstr;

        instructions.remove(index - 2);
        instructions.remove(index - 2);
        return index - 2;
    } else if (instr.getOpcode() == Opcodes.PUTSTATIC) {
        if (index < 1) {
            return -1;
        }

        Field f = (Field) instr;
        if (f.valueOp != null) {
            return -1;
        }

        Instruction valueInstr = instructions.get(index - 1);
        if (!(valueInstr instanceof AssignableExpression)) {
            return -1;
        }

        StringBuilder sb = new StringBuilder();

        AssignableExpression valueExpr = (AssignableExpression) valueInstr;
        if (!valueExpr.assignTo(null, sb)) {
            return -1;
        }

        f.valueOp = valueInstr;

        instructions.remove(index - 1);

        return index - 1;
    } else if (instr.getOpcode() == Opcodes.GETFIELD) {
        if (index < 1) {
            return -1;
        }

        Field f = (Field) instr;
        //if (f.useThis) {
        //    return -1;
        //}

        Instruction targetInstr = instructions.get(index - 1);
        if (!(targetInstr instanceof AssignableExpression)) {
            return -1;
        }

        StringBuilder sb = new StringBuilder();

        AssignableExpression targetExpr = (AssignableExpression) targetInstr;
        if (!targetExpr.assignTo(null, sb)) {
            return -1;
        }

        f.targetOp = targetInstr;

        instructions.remove(index - 1);

        return index - 1;
    }
    return -1;
}

From source file:com.github.anba.es6draft.compiler.assembler.InstructionAssembler.java

License:Open Source License

public void putstatic(Type owner, String name, Type desc) {
    methodVisitor.visitFieldInsn(Opcodes.PUTSTATIC, owner.internalName(), name, desc.descriptor());
    stack.putstatic(desc);
}

From source file:com.github.jasmo.obfuscate.InlineAccessors.java

License:Open Source License

private Query[] getPattern(boolean get, ClassNode owner, FieldNode field) {
    Type type = Type.getType(field.desc);
    List<Query> queries = new LinkedList<>();
    boolean local = local(field.access);
    if (local)/*w ww  .j  av a  2  s. c  om*/
        queries.add(new Query("opcode", Opcodes.ALOAD, "var", 0));
    if (get) {
        int opcode = local ? Opcodes.GETFIELD : Opcodes.GETSTATIC;
        queries.add(new Query("opcode", opcode, "owner", owner.name, "name", field.name, "desc", field.desc));
        queries.add(new Query("opcode", type.getOpcode(Opcodes.IRETURN)));
    } else {
        int opcode = local ? Opcodes.PUTFIELD : Opcodes.PUTSTATIC;
        queries.add(new Query("opcode", type.getOpcode(Opcodes.ILOAD), "var", 0));
        queries.add(new Query("opcode", opcode, "owner", owner.name, "name", field.name, "desc", field.desc));
        queries.add(new Query("opcode", Opcodes.RETURN));
    }
    return queries.toArray(new Query[queries.size()]);
}

From source file:com.github.megatronking.stringfog.plugin.StringFogClassVisitor.java

License:Apache License

@Override
public MethodVisitor visitMethod(int access, String name, String desc, String signature, String[] exceptions) {
    MethodVisitor mv = super.visitMethod(access, name, desc, signature, exceptions);
    if (mv != null && !mIgnoreClass) {
        if ("<clinit>".equals(name)) {
            isClInitExists = true;/*from w ww . jav  a 2s  . co  m*/
            // If clinit exists meaning the static fields (not final) would have be inited here.
            mv = new MethodVisitor(Opcodes.ASM5, mv) {

                private String lastStashCst;

                @Override
                public void visitCode() {
                    super.visitCode();
                    // Here init static final fields.
                    for (ClassStringField field : mStaticFinalFields) {
                        if (!canEncrypted(field.value)) {
                            continue;
                        }
                        String originValue = field.value;
                        String encryptValue = mStringFogImpl.encrypt(originValue, mKey);
                        mMappingPrinter.output(getJavaClassName(), originValue, encryptValue);
                        super.visitLdcInsn(encryptValue);
                        super.visitMethodInsn(Opcodes.INVOKESTATIC, mFogClassName, "decrypt",
                                "(Ljava/lang/String;)Ljava/lang/String;", false);
                        super.visitFieldInsn(Opcodes.PUTSTATIC, mClassName, field.name,
                                ClassStringField.STRING_DESC);
                    }
                }

                @Override
                public void visitLdcInsn(Object cst) {
                    // Here init static or static final fields, but we must check field name int 'visitFieldInsn'
                    if (cst != null && cst instanceof String && canEncrypted((String) cst)) {
                        lastStashCst = (String) cst;
                        String originValue = lastStashCst;
                        String encryptValue = mStringFogImpl.encrypt(originValue, mKey);
                        mMappingPrinter.output(getJavaClassName(), originValue, encryptValue);
                        super.visitLdcInsn(encryptValue);
                        super.visitMethodInsn(Opcodes.INVOKESTATIC, mFogClassName, "decrypt",
                                "(Ljava/lang/String;)Ljava/lang/String;", false);
                    } else {
                        lastStashCst = null;
                        super.visitLdcInsn(cst);
                    }
                }

                @Override
                public void visitFieldInsn(int opcode, String owner, String name, String desc) {
                    if (mClassName.equals(owner) && lastStashCst != null) {
                        boolean isContain = false;
                        for (ClassStringField field : mStaticFields) {
                            if (field.name.equals(name)) {
                                isContain = true;
                                break;
                            }
                        }
                        if (!isContain) {
                            for (ClassStringField field : mStaticFinalFields) {
                                if (field.name.equals(name) && field.value == null) {
                                    field.value = lastStashCst;
                                    break;
                                }
                            }
                        }
                    }
                    lastStashCst = null;
                    super.visitFieldInsn(opcode, owner, name, desc);
                }
            };

        } else if ("<init>".equals(name)) {
            // Here init final(not static) and normal fields
            mv = new MethodVisitor(Opcodes.ASM5, mv) {
                @Override
                public void visitLdcInsn(Object cst) {
                    // We don't care about whether the field is final or normal
                    if (cst != null && cst instanceof String && canEncrypted((String) cst)) {
                        String originValue = (String) cst;
                        String encryptValue = mStringFogImpl.encrypt(originValue, mKey);
                        mMappingPrinter.output(getJavaClassName(), originValue, encryptValue);
                        super.visitLdcInsn(encryptValue);
                        super.visitMethodInsn(Opcodes.INVOKESTATIC, mFogClassName, "decrypt",
                                "(Ljava/lang/String;)Ljava/lang/String;", false);
                    } else {
                        super.visitLdcInsn(cst);
                    }
                }
            };
        } else {
            mv = new MethodVisitor(Opcodes.ASM5, mv) {

                @Override
                public void visitLdcInsn(Object cst) {
                    if (cst != null && cst instanceof String && canEncrypted((String) cst)) {
                        // If the value is a static final field
                        for (ClassStringField field : mStaticFinalFields) {
                            if (cst.equals(field.value)) {
                                super.visitFieldInsn(Opcodes.GETSTATIC, mClassName, field.name,
                                        ClassStringField.STRING_DESC);
                                return;
                            }
                        }
                        // If the value is a final field (not static)
                        for (ClassStringField field : mFinalFields) {
                            // if the value of a final field is null, we ignore it
                            if (cst.equals(field.value)) {
                                super.visitVarInsn(Opcodes.ALOAD, 0);
                                super.visitFieldInsn(Opcodes.GETFIELD, mClassName, field.name,
                                        "Ljava/lang/String;");
                                return;
                            }
                        }
                        // local variables
                        String originValue = (String) cst;
                        String encryptValue = mStringFogImpl.encrypt(originValue, mKey);
                        mMappingPrinter.output(getJavaClassName(), originValue, encryptValue);
                        super.visitLdcInsn(encryptValue);
                        super.visitMethodInsn(Opcodes.INVOKESTATIC, mFogClassName, "decrypt",
                                "(Ljava/lang/String;)Ljava/lang/String;", false);
                        return;
                    }
                    super.visitLdcInsn(cst);
                }

            };
        }
    }
    return mv;
}

From source file:com.github.megatronking.stringfog.plugin.StringFogClassVisitor.java

License:Apache License

@Override
public void visitEnd() {
    if (!mIgnoreClass && !isClInitExists && !mStaticFinalFields.isEmpty()) {
        MethodVisitor mv = super.visitMethod(Opcodes.ACC_STATIC, "<clinit>", "()V", null, null);
        mv.visitCode();/*from w  w w .  j  a v a2  s . c om*/
        // Here init static final fields.
        for (ClassStringField field : mStaticFinalFields) {
            if (!canEncrypted(field.value)) {
                continue;
            }
            String originValue = field.value;
            String encryptValue = mStringFogImpl.encrypt(originValue, mKey);
            mMappingPrinter.output(getJavaClassName(), originValue, encryptValue);
            mv.visitLdcInsn(encryptValue);
            mv.visitMethodInsn(Opcodes.INVOKESTATIC, mFogClassName, "decrypt",
                    "(Ljava/lang/String;)Ljava/lang/String;", false);
            mv.visitFieldInsn(Opcodes.PUTSTATIC, mClassName, field.name, ClassStringField.STRING_DESC);
        }
        mv.visitInsn(Opcodes.RETURN);
        mv.visitMaxs(1, 0);
        mv.visitEnd();
    }
    super.visitEnd();
}

From source file:com.google.devtools.build.android.desugar.BytecodeTypeInference.java

License:Open Source License

@Override
public void visitFieldInsn(int opcode, String owner, String name, String desc) {
    switch (opcode) {
    case Opcodes.GETSTATIC:
        pushDescriptor(desc);//  w  ww  .  j ava2s .  c o  m
        break;
    case Opcodes.PUTSTATIC:
        popDescriptor(desc);
        break;
    case Opcodes.GETFIELD:
        pop();
        pushDescriptor(desc);
        break;
    case Opcodes.PUTFIELD:
        popDescriptor(desc);
        pop();
        break;
    default:
        throw new RuntimeException(
                "Unhandled opcode " + opcode + ", owner=" + owner + ", name=" + name + ", desc" + desc);
    }
    super.visitFieldInsn(opcode, owner, name, desc);
}