public void generateStoreSaveValueIfNecessary(CodeStream codeStream) {

    // push receiver
    codeStream.aload_0();

    // push the 2 parameters of "setResult(Object, Class)"
    if (this.expression == null
        || this.expression.resolvedType
            == TypeBinding
                .VOID) { // expressionType == VoidBinding if code snippet is the expression
                         // "System.out.println()"
      // push null
      codeStream.aconst_null();

      // void.class
      codeStream.generateClassLiteralAccessForType(TypeBinding.VOID, null);
    } else {
      // swap with expression
      int valueTypeID = this.expression.resolvedType.id;
      if (valueTypeID == T_long || valueTypeID == T_double) {
        codeStream.dup_x2();
        codeStream.pop();
      } else {
        codeStream.swap();
      }

      // generate wrapper if needed
      if (this.expression.resolvedType.isBaseType()
          && this.expression.resolvedType != TypeBinding.NULL) {
        codeStream.generateBoxingConversion(this.expression.resolvedType.id);
      }

      // generate the expression type
      codeStream.generateClassLiteralAccessForType(this.expression.resolvedType, null);
    }

    // generate the invoke virtual to "setResult(Object,Class)"
    codeStream.invoke(
        Opcodes.OPC_invokevirtual, this.setResultMethod, null /* default declaringClass */);
  }
Exemplo n.º 2
0
  /**
   * MessageSendDotClass code generation
   *
   * @param currentScope org.eclipse.jdt.internal.compiler.lookup.BlockScope
   * @param codeStream org.eclipse.jdt.internal.compiler.codegen.CodeStream
   * @param valueRequired boolean
   */
  public void generateCode(BlockScope currentScope, CodeStream codeStream, boolean valueRequired) {
    // {ObjectTeams: role class literal?
    if (this.roleClassLiteralAccess != null) {
      this.roleClassLiteralAccess.generateCode(currentScope, codeStream, valueRequired);
      return;
    }
    // SH}
    int pc = codeStream.position;

    // in interface case, no caching occurs, since cannot make a cache field for interface
    if (valueRequired) {
      codeStream.generateClassLiteralAccessForType(this.type.resolvedType, this.syntheticField);
      codeStream.generateImplicitConversion(this.implicitConversion);
    }
    codeStream.recordPositionsFrom(pc, this.sourceStart);
  }