Example usage for org.eclipse.jdt.internal.compiler.lookup LocalVariableBinding recordInitializationEndPC

List of usage examples for org.eclipse.jdt.internal.compiler.lookup LocalVariableBinding recordInitializationEndPC

Introduction

In this page you can find the example usage for org.eclipse.jdt.internal.compiler.lookup LocalVariableBinding recordInitializationEndPC.

Prototype

public void recordInitializationEndPC(int pc) 

Source Link

Usage

From source file:org.eclipse.objectteams.otdt.internal.core.compiler.bytecode.BytecodeTransformer.java

License:Open Source License

/**
 * Add a byte code sequence that is a placeholder for chaining the
 * marker arg if the current method is copied lateron.
 * (See class comment in class ExplicitConstructorCall).
 *
 * @param scope/*from   w ww.java  2s .c  o m*/
 * @param codeStream
 * @param chainTSuperMarkArgPos position that a marker arg will get when added.
 */
public static void addChainingPlaceholder(BlockScope scope, CodeStream codeStream, int chainTSuperMarkArgPos) {
    // create local variable "Object _OT$chainArg"
    // at the very position that will be taken by an added
    // marker argument:
    LocalVariableBinding nullVar = new LocalVariableBinding("_OT$chainArg".toCharArray(), //$NON-NLS-1$
            scope.getJavaLangObject(), 0, false);
    nullVar.resolvedPosition = chainTSuperMarkArgPos;
    nullVar.useFlag = LocalVariableBinding.USED;
    nullVar.declaringScope = scope.methodScope();
    codeStream.record(nullVar);
    codeStream.addVisibleLocalVariable(nullVar);
    // add dummy code sequence "aconst_null; astore <i>"
    // which will be changed by BytecodeTransformer.replaceChainArg
    // to "nop; aload <i>" with the same <i>.
    codeStream.aconst_null();
    codeStream.astore(chainTSuperMarkArgPos); // optimize small indices?
    // record positions for local varaible table.
    nullVar.recordInitializationStartPC(0);
    if (nullVar.initializationPCs != null)
        nullVar.recordInitializationEndPC(codeStream.position);
}

From source file:org.eclipse.objectteams.otdt.internal.core.compiler.lookup.SyntheticRoleFieldAccess.java

License:Open Source License

public void generateBodyForRead(FieldBinding fieldBinding, CodeStream codeStream) {
    if (fieldBinding.isStatic()) {
        fieldBinding = checkAdjustRoleFieldAccess(fieldBinding, codeStream); // may insert cast, too.
        codeStream.fieldAccess(Opcodes.OPC_getstatic, fieldBinding, fieldBinding.declaringClass);
        // FIXME(SH): throw new InternalCompilerError("accessor for static field not applicable.");
    } else {//  w w w  .j a va2  s .co  m
        // prepare "this" and role args:
        LocalVariableBinding thisArg = createArgumentBinding(codeStream, "this".toCharArray(), //$NON-NLS-1$
                fieldBinding.declaringClass.enclosingType(), 0);
        char[] argName = typeNameToLower(this.parameters[0].sourceName());
        LocalVariableBinding arg1 = createArgumentBinding(codeStream, argName, this.parameters[0], 1);

        // generate code:
        codeStream.aload_1(); // not a static accessor, positions shifted by 1.
        fieldBinding = checkAdjustRoleFieldAccess(fieldBinding, codeStream); // may insert cast, too.
        codeStream.fieldAccess(Opcodes.OPC_getfield, fieldBinding, fieldBinding.declaringClass);

        // finish args:
        if ((codeStream.generateAttributes & (ClassFileConstants.ATTR_VARS
                | ClassFileConstants.ATTR_STACK_MAP_TABLE | ClassFileConstants.ATTR_STACK_MAP)) == 0)
            return; // avoid NPE below
        thisArg.recordInitializationEndPC(codeStream.position);
        arg1.recordInitializationEndPC(codeStream.position);
    }
}

From source file:org.eclipse.objectteams.otdt.internal.core.compiler.lookup.SyntheticRoleFieldAccess.java

License:Open Source License

public void generateBodyForWrite(FieldBinding fieldBinding, CodeStream codeStream) {
    if (fieldBinding.isStatic()) {
        fieldBinding = checkAdjustRoleFieldAccess(fieldBinding, codeStream);
        codeStream.load(fieldBinding.type, 1);
        codeStream.fieldAccess(Opcodes.OPC_putstatic, fieldBinding, fieldBinding.declaringClass);
    } else {//from w  w w.  j a  v  a2s.c o  m
        // prepare "this" and role args:
        LocalVariableBinding thisArg = createArgumentBinding(codeStream, "this".toCharArray(), //$NON-NLS-1$
                fieldBinding.declaringClass.enclosingType(), 0);
        char[] argName = typeNameToLower(this.parameters[0].sourceName());
        LocalVariableBinding arg1 = createArgumentBinding(codeStream, argName, this.parameters[0], 1);
        LocalVariableBinding arg2 = createArgumentBinding(codeStream, "value".toCharArray(), this.parameters[1], //$NON-NLS-1$
                2);

        codeStream.aload_1(); // not a static accessor, positions shifted by 1.
        fieldBinding = checkAdjustRoleFieldAccess(fieldBinding, codeStream);
        codeStream.load(fieldBinding.type, 2);
        codeStream.fieldAccess(Opcodes.OPC_putfield, fieldBinding, fieldBinding.declaringClass);

        // finish args:
        if ((codeStream.generateAttributes & (ClassFileConstants.ATTR_VARS
                | ClassFileConstants.ATTR_STACK_MAP_TABLE | ClassFileConstants.ATTR_STACK_MAP)) == 0)
            return; // avoid NPE below
        thisArg.recordInitializationEndPC(codeStream.position);
        arg1.recordInitializationEndPC(codeStream.position);
        arg2.recordInitializationEndPC(codeStream.position);
    }
}

From source file:org.eclipse.objectteams.otdt.internal.core.compiler.lookup.SyntheticRoleFieldAccess.java

License:Open Source License

/**
 * Generate the sequence for invoking this accessor.
 *
 * PRE: the role instance is on the stack, for write access also the new value
 * POST: values from PRE have been consumed, for read access the value is on the stack
 *
 * @param codeStream/*w w  w. ja v  a2s.c om*/
 */
public byte prepareOrGenerateInvocation(CodeStream codeStream, byte opcode) {
    ReferenceBinding roleType = (ReferenceBinding) this.parameters[0];
    if (roleType instanceof UnresolvedReferenceBinding) {
        try {
            roleType = ((UnresolvedReferenceBinding) roleType).resolve(Config.getLookupEnvironment(), false);
        } catch (NotConfiguredException e) {
            e.logWarning("Failed to generate accessor"); //$NON-NLS-1$
            return opcode;
        }
        this.parameters[0] = roleType;
    }
    if (this.purpose == FieldReadAccess || this.purpose == SuperFieldReadAccess) {
        insertOuterAccess(codeStream, roleType); // role -> role,team
        codeStream.swap(); // role,team -> team,role
        codeStream.invoke(Opcodes.OPC_invokevirtual, this, // team,role -> result
                this.declaringClass);
    } else {
        TypeBinding targetType = this.targetWriteField.type;
        LocalVariableBinding arg = new LocalVariableBinding("<tmp>".toCharArray(), //$NON-NLS-1$
                targetType, 0, false);
        arg.resolvedPosition = codeStream.maxLocals;
        arg.useFlag = LocalVariableBinding.USED;
        codeStream.record(arg);
        arg.recordInitializationStartPC(codeStream.position);
        codeStream.store(arg, false/*valueRequired*/); // role, arg -> role
        insertOuterAccess(codeStream, roleType); // role -> role,team
        codeStream.swap(); // role,team -> team,role
        codeStream.load(arg); //            -> team,role,arg
        codeStream.invoke(Opcodes.OPC_invokevirtual, this, //           -> <empty>
                this.declaringClass);
        if (arg.initializationPCs != null) // null checking is asymmetric in LocalVariableBinding.
            arg.recordInitializationEndPC(codeStream.position);
    }
    return 0; // done
}