List of usage examples for org.eclipse.jdt.internal.compiler.lookup LocalVariableBinding recordInitializationEndPC
public void recordInitializationEndPC(int pc)
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 }