Example usage for org.eclipse.jdt.internal.compiler.codegen CodeStream return_

List of usage examples for org.eclipse.jdt.internal.compiler.codegen CodeStream return_

Introduction

In this page you can find the example usage for org.eclipse.jdt.internal.compiler.codegen CodeStream return_.

Prototype

public void return_() 

Source Link

Usage

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;/*w  ww  .ja 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 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);/*from   w ww . j a va  2 s  .  c o m*/
    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_();
}