List of usage examples for org.eclipse.jdt.internal.compiler.codegen CodeStream aload_0
public void aload_0()
From source file:org.eclipse.objectteams.otdt.internal.core.compiler.ast.PrivateRoleMethodCall.java
License:Open Source License
@Override public void generateCode(BlockScope currentScope, CodeStream codeStream, boolean valueRequired) { // manually redirect to synth bridge: Expression receiverReference; boolean isCallinAccess = false; if (RoleTypeBinding.isRoleWithExplicitAnchor(this.actualReceiverType)) { // new receiver is the anchor denoting the base role's enclosing team instance: ITeamAnchor teamAnchor = ((RoleTypeBinding) this.actualReceiverType)._teamAnchor; TypeAnchorReference syntheticReceiver = this.gen.typeAnchorReference(teamAnchor); syntheticReceiver.isExpression = true; receiverReference = syntheticReceiver; } else {/* w w w.ja va 2s .co m*/ isCallinAccess = true; // call from inside a otre-dyn callin wrapper: receiver is the current team: receiverReference = this.gen.thisReference(); } receiverReference.resolve(currentScope); if (this.isCalloutToField) // for c-t-f this receiver *replaces* the original receiver, // role instance additionally exists as a visible method argument this.receiver = receiverReference; else // for method callout or callin to private *add* the team instance to the front of pushes // original role instance receiver will become the first implicit argument receiverReference.generateCode(currentScope, codeStream, true/*valueRequired*/); if (isCallinAccess) { // might need more synthetic args: if (this.binding.isStatic()) { codeStream.aconst_null(); // first arg in role bridge: (null) role codeStream.iconst_0(); // enclosingTeamInstance: dummy value codeStream.aload_0(); // enclosingTeamInstance: team instance } } // directly use the accessor and its declaring class for the invoke instruction: this.binding = this.syntheticAccessor; this.actualReceiverType = this.syntheticAccessor.declaringClass; this.syntheticAccessor = null; super.generateCode(currentScope, codeStream, valueRequired); }
From source file:org.eclipse.objectteams.otdt.internal.core.compiler.lifting.Lifting.java
License:Open Source License
/** * API for AbstractMethodDeclaration://from w ww.ja v a 2s . c o m * * Create a byte code sequence for a runtime check in a creation method: * R _OT$create_OT$R(B b) { * if (this._OT$cache_OT$R.contains(b)) * throw new DuplicateRoleException("R"); * // continue regular code. * } * * Note, the need for this runtime check is detected quite late. * At this point it is easier to create the byte code sequence directly, * rather the creating AST first. */ public static void createDuplicateRoleCheck(CodeStream codeStream, AbstractMethodDeclaration method) { MethodBinding binding = method.binding; Scope scope = method.scope; ReferenceBinding roleType = (ReferenceBinding) binding.returnType; String roleName = new String(roleType.readableName()); // TODO(SH): check why roleType.getRoleModel().getClassPartBinding().roleModel may yield a different result. // I think it occured in haeder/stopwatch from smile-CVS. //RoleModel role = roleType.getRealClass().roleModel; char[] cacheName = LiftingEnvironment.getCacheName(roleType.roleModel.getBoundRootRole()); ReferenceBinding teamBinding = roleType.enclosingType();//role.getTeamModel().getBinding(); FieldBinding cache = TypeAnalyzer.findField(teamBinding, cacheName, /*static*/false, /*outer*/false, ITranslationStates.STATE_FULL_LIFTING); // generated by this state if (cache == null) throw new InternalCompilerError("generated cache field not found: " + new String(cacheName)); //$NON-NLS-1$ ReferenceBinding map = (ReferenceBinding) scope.getType(IOTConstants.WEAK_HASH_MAP, 3); MethodBinding contains = map.getMethod(scope, IOTConstants.CONTAINS_KEY); ReferenceBinding exc = (ReferenceBinding) scope.getType(IOTConstants.ORG_OBJECTTEAMS_DUPLICATE_ROLE, 3); TypeBinding[] types = new TypeBinding[] { scope.getJavaLangString() }; MethodBinding excInit = exc.getExactConstructor(types); BranchLabel normalCase = new BranchLabel(codeStream); codeStream.aload_0(); // this codeStream.fieldAccess(Opcodes.OPC_getfield, cache, teamBinding); // getfield MyTeam._OT$cache_OT$R Ljava/util/WeakHashMap; codeStream.aload_1(); // arg0 codeStream.invoke(Opcodes.OPC_invokevirtual, contains, map); // invokevirtual java.util.WeakHashMap.containsKey (Ljava/lang/Object;)Z codeStream.ifeq(normalCase); // false -> #endif codeStream.new_(exc); // new <org.objectteams.DuplicateRoleException> codeStream.dup(); // dup codeStream.ldc(roleName); // ldc "R" codeStream.invoke(Opcodes.OPC_invokespecial, excInit, exc); // invokespecial org.objectteams.DuplicateRoleException.<init> (Ljava/lang/String;)V codeStream.athrow(); // athrow normalCase.place(); // #endif }
From source file:org.eclipse.objectteams.otdt.internal.core.compiler.lookup.SyntheticRoleBridgeMethodBinding.java
License:Open Source License
@Override public void generateInstructions(CodeStream codeStream) { TypeBinding[] arguments = this.parameters; int argLen = arguments.length; TypeBinding[] targetParameters = this.targetMethod.parameters; int resolvedPosition = 0; int argIdx = 0; int targetIdx = 0; switch (this.purpose) { case RoleMethodBridgeInner: codeStream.aload_0(); // synthetic first arg is the receiver role codeStream.checkcast(this.targetMethod.declaringClass); resolvedPosition = 1; // first arg is processed argIdx = 1;/*from ww w. j a va 2s. c om*/ if (this.targetMethod.isStatic()) { codeStream.iconst_0(); // dummy int codeStream.aload_2(); // pass synth. team arg argIdx += 2; resolvedPosition += 2; } break; case RoleMethodBridgeOuter: resolvedPosition = 1; // ignore team instance at 0 argIdx = 0; // pass all args unchanged break; } while (argIdx < argLen) { TypeBinding parameter = targetParameters[targetIdx++]; TypeBinding argument = arguments[argIdx++]; codeStream.load(argument, resolvedPosition); if (TypeBinding.notEquals(argument, parameter)) codeStream.checkcast(parameter); switch (parameter.id) { case TypeIds.T_long: case TypeIds.T_double: resolvedPosition += 2; break; default: resolvedPosition++; break; } } if (this.targetMethod.isStatic()) codeStream.invoke(Opcodes.OPC_invokestatic, this.targetMethod, null); else codeStream.invoke(Opcodes.OPC_invokespecial, this.targetMethod, null); // non-static private role method switch (this.targetMethod.returnType.id) { case TypeIds.T_void: codeStream.return_(); break; case TypeIds.T_boolean: case TypeIds.T_byte: case TypeIds.T_char: case TypeIds.T_short: case TypeIds.T_int: codeStream.ireturn(); break; case TypeIds.T_long: codeStream.lreturn(); break; case TypeIds.T_float: codeStream.freturn(); break; case TypeIds.T_double: codeStream.dreturn(); break; default: codeStream.areturn(); } }
From source file:org.eclipse.objectteams.otdt.internal.core.compiler.statemachine.transformer.RoleMigrationImplementor.java
License:Open Source License
static void genMigrateToTeamInstructions(CodeStream codeStream, SourceTypeBinding roleBinding) { // this.this$n = (MyTeam)otherTeam codeStream.aload_0(); // this codeStream.aload_1(); // otherTeam codeStream.checkcast(roleBinding.enclosingType()); codeStream.fieldAccess(Opcodes.OPC_putfield, enclosingInstanceField(roleBinding), roleBinding); codeStream.aload_0();// w ww. j a v a2 s . c om codeStream.areturn(); // not handling caches here, cf. IProblem.MigrateBoundRole }
From source file:org.eclipse.objectteams.otdt.internal.core.compiler.statemachine.transformer.RoleMigrationImplementor.java
License:Open Source License
static void genMigrateToBaseInstructions(CodeStream codeStream, SourceTypeBinding roleBinding, Scope scope, char[] cacheName) { FieldBinding baseField = roleBinding.getField(IOTConstants._OT_BASE, true); // accessing the cache (using remove() and put()): ReferenceBinding cacheTypeBinding = (ReferenceBinding) scope.getType(IOTConstants.WEAK_HASH_MAP, 3); MethodBinding remove = getMethod(cacheTypeBinding, "remove".toCharArray(), 1); //$NON-NLS-1$ MethodBinding put = cacheTypeBinding.getMethod(scope, "put".toCharArray()); //$NON-NLS-1$ // accessing the base object (using _OT$removeRole() and _OT$addRole()): WeavingScheme weavingScheme = scope.compilerOptions().weavingScheme; ReferenceBinding iboundBase = (ReferenceBinding) scope .getType(weavingScheme == WeavingScheme.OTDRE ? IOTConstants.ORG_OBJECTTEAMS_IBOUNDBASE2 : IOTConstants.ORG_OBJECTTEAMS_IBOUNDBASE, 3); // remove old from cache codeStream.aload_0(); // this codeStream.fieldAccess(Opcodes.OPC_getfield, enclosingInstanceField(roleBinding), // this.this$n roleBinding);// ww w.j a v a2s. c om codeStream.fieldAccess(Opcodes.OPC_getfield, roleBinding.enclosingType().getField(cacheName, true), // this.this$n._OT$cache$R roleBinding.enclosingType()); codeStream.dup(); // for use in put() below codeStream.aload_0(); // this codeStream.fieldAccess(Opcodes.OPC_getfield, baseField, // this._OT$base roleBinding); codeStream.dup(); // share for nested method call // this._OT$base // remove role from this (old) base genAddOrRemoveRole(codeStream, scope, iboundBase, false);// -> void // -> base._OT$removeRole(this) codeStream.invoke(Opcodes.OPC_invokevirtual, remove, // -> cache.remove(base) cacheTypeBinding); codeStream.pop(); // discard result // this._OT$base = (MyBase)otherBase codeStream.aload_0(); // this codeStream.aload_1(); // otherBase codeStream.checkcast(roleBinding.baseclass()); codeStream.fieldAccess(Opcodes.OPC_putfield, baseField, roleBinding); // add new to cache (cache is still on the stack) codeStream.aload_1(); // otherBase codeStream.aload_0(); // this (role) codeStream.invoke(Opcodes.OPC_invokevirtual, put, cacheTypeBinding); // add to new base: codeStream.aload_1(); // otherBase genAddOrRemoveRole(codeStream, scope, iboundBase, true); // -> void // -> base._OT$addRemoveRole(this, false) codeStream.return_(); }
From source file:org.eclipse.objectteams.otdt.internal.core.compiler.statemachine.transformer.RoleMigrationImplementor.java
License:Open Source License
static void genAddOrRemoveRole(CodeStream codeStream, Scope scope, ReferenceBinding iboundBase, boolean isAdding) { codeStream.aload_0(); // this // OTDYN: Slightly different methods depending on the weaving strategy: switch (scope.compilerOptions().weavingScheme) { case OTDRE:/*from w ww .j a v a 2s . c om*/ // _OT$addOrRemoveRole(role, isAdding) if (isAdding) codeStream.iconst_1(); // isAdding=true else codeStream.iconst_0(); // isAdding=false codeStream.invoke(Opcodes.OPC_invokeinterface, iboundBase.getMethod(scope, IOTConstants.ADD_REMOVE_ROLE), iboundBase); break; case OTRE: // _OT$addRole(role) or _OT$removeRole(role): codeStream.invoke(Opcodes.OPC_invokeinterface, isAdding ? iboundBase.getMethod(scope, IOTConstants.ADD_ROLE) : iboundBase.getMethod(scope, IOTConstants.REMOVE_ROLE), iboundBase); } }