protected IRExpression compile_impl() {
    ISymbol symbol = _expr().getSymbol();

    ICompilableType gsClass = getGosuClass();
    if ((Keyword.KW_this.equals(symbol.getName()) || Keyword.KW_super.equals(symbol.getName()))
        &&
        // 'this' must be an external symbol when in a program e.g., studio debugger expression
        (!(gsClass instanceof IGosuProgram) || gsClass.isAnonymous())) {
      if (_cc().isBlockInvoke() && _cc().currentlyCompilingBlock()) {
        while (gsClass instanceof IBlockClass) {
          gsClass = gsClass.getEnclosingType();
        }
        return pushOuter(gsClass);
      } else {
        return pushThis();
      }
    } else if (symbol instanceof DynamicPropertySymbol
        && ((DynamicPropertySymbol) symbol).getGetterDfs() instanceof OuterFunctionSymbol) {
      // 'outer'
      return pushOuterForOuterSymbol();
    } else {
      return pushSymbolValue(symbol);
    }
  }
예제 #2
0
 @Override
 public IModifierInfo getModifierInfo() {
   return symbol.getModifierInfo();
 }
예제 #3
0
 @Override
 public boolean isWritable() {
   return symbol.isWritable();
 }
예제 #4
0
 @Override
 public void setDefaultValueExpression(IExpression defaultValue) {
   symbol.setDefaultValueExpression(defaultValue);
 }
예제 #5
0
 @Override
 public boolean hasDynamicSymbolTable() {
   return symbol.hasDynamicSymbolTable();
 }
예제 #6
0
 @Override
 public void setType(IType type) {
   symbol.setType(type);
 }
예제 #7
0
 @Override
 public void setValue(Object value) {
   symbol.setValue(value);
 }
예제 #8
0
 @Override
 public boolean isInternal() {
   return symbol.isInternal();
 }
예제 #9
0
 @Override
 public boolean isProtected() {
   return symbol.isProtected();
 }
예제 #10
0
 @Override
 public String getFullDescription() {
   return symbol.getFullDescription();
 }
예제 #11
0
 @Override
 public boolean isPrivate() {
   return symbol.isPrivate();
 }
예제 #12
0
 @Override
 public List<IGosuAnnotation> getAnnotations() {
   return symbol.getAnnotations();
 }
예제 #13
0
 @Override
 public int getModifiers() {
   return symbol.getModifiers();
 }
예제 #14
0
 @Override
 public IReducedSymbol createReducedSymbol() {
   return symbol.createReducedSymbol();
 }
예제 #15
0
 @Override
 public String getDisplayName() {
   return symbol.getDisplayName();
 }
예제 #16
0
 @Override
 public boolean isPublic() {
   return symbol.isPublic();
 }
예제 #17
0
 @Override
 public IType getType() {
   return symbol.getType();
 }
예제 #18
0
 @Override
 public boolean isAbstract() {
   return symbol.isAbstract();
 }
예제 #19
0
 @Override
 public Object getValue() {
   return symbol.getValue();
 }
예제 #20
0
 @Override
 public boolean isFinal() {
   return symbol.isFinal();
 }
예제 #21
0
 @Override
 public IExpression getDefaultValueExpression() {
   return symbol.getDefaultValueExpression();
 }
예제 #22
0
 @Override
 public IScriptPartId getScriptPart() {
   return symbol.getScriptPart();
 }
예제 #23
0
 @Override
 public void setDynamicSymbolTable(ISymbolTable symTable) {
   symbol.setDynamicSymbolTable(symTable);
 }
예제 #24
0
 @Override
 public IGosuClass getGosuClass() {
   return symbol.getGosuClass();
 }
예제 #25
0
 @Override
 public ISymbolTable getDynamicSymbolTable() {
   return symbol.getDynamicSymbolTable();
 }
예제 #26
0
 @Override
 public boolean hasTypeVariables() {
   return symbol.hasTypeVariables();
 }
예제 #27
0
 @Override
 public void setValueIsBoxed(boolean b) {
   symbol.setValueIsBoxed(b);
 }
예제 #28
0
 @Override
 public Class<?> getSymbolClass() {
   return symbol.getSymbolClass();
 }
  public IRExpression pushSymbolValue(ISymbol symbol) {
    IType type = symbol.getType();
    Class symClass;
    IReducedSymbol reducedSym;
    if (symbol instanceof ReducedSymbol.SyntheticSymbol) {
      reducedSym = ((ReducedSymbol.SyntheticSymbol) symbol).getReducedSymbol();
      symClass = reducedSym.getSymbolClass();
    } else {
      reducedSym = symbol;
      symClass = symbol.getClass();
    }
    if (_cc().isExternalSymbol(reducedSym.getName())) {
      // unbox( symbols.getValue( name ) )
      return unboxValueToType(
          reducedSym.getType(),
          callMethod(
              IExternalSymbolMap.class,
              "getValue",
              new Class[] {String.class, int.class},
              pushExternalSymbolsMap(),
              Arrays.asList(
                  pushConstant(reducedSym.getName()), pushConstant(getArrayDims(reducedSym)))));
    } else if (DynamicSymbol.class.isAssignableFrom(symClass)) {
      // Instance or Static field

      IRProperty irProp = IRPropertyFactory.createIRProperty(reducedSym);
      if (!irProp.isStatic()) {
        if (isMemberOnEnclosingType(reducedSym) != null) {
          // Instance field from 'outer'
          return getField_new(
              irProp, pushOuter(reducedSym.getGosuClass()), getDescriptor(reducedSym.getType()));
        } else {
          // Instance field from 'this'
          return getField_new(irProp, pushThis(), getDescriptor(reducedSym.getType()));
        }
      } else {
        // Static field
        return getField_new(irProp, null, getDescriptor(reducedSym.getType()));
      }
    } else if (CapturedSymbol.class.isAssignableFrom(symClass)) {
      // Captured symbol is stored as a Field on an anonymous inner class (one elem array of
      // symbol's type)
      // e.g., val$myFiield[0] = value. Note a captured symbol is duplicated in all nested classes.
      IRProperty irProp = IRPropertyFactory.createIRProperty(getGosuClass(), reducedSym);
      return getField_new(irProp, pushThis(), getDescriptor(reducedSym.getType()));
    } else if (reducedSym.getIndex() >= 0) {
      // Local var

      if (reducedSym.isValueBoxed()) {
        // Local var is captured in an anonymous inner class.
        // Symbol's value maintained as a one elem array of symbol's type.
        return buildArrayLoad(
            identifier(_cc().getSymbol(reducedSym.getName())), 0, getDescriptor(type));
      } else {
        // Simple local var
        return identifier(_cc().getSymbol(reducedSym.getName()));
      }
    } else if (DynamicPropertySymbol.class.isAssignableFrom(symClass)) {
      IRProperty irProp;
      if (reducedSym instanceof DynamicPropertySymbol) {
        irProp = IRPropertyFactory.createIRProperty((DynamicPropertySymbol) reducedSym);
      } else {
        irProp = IRPropertyFactory.createIRProperty((ReducedDynamicPropertySymbol) reducedSym);
      }

      IRExpression root;
      if (irProp.isStatic()) {
        root = null;
      } else {
        ICompilableType targetType = isMemberOnEnclosingType(reducedSym);
        if (targetType != null) {
          root = pushOuter(targetType);
        } else {
          root = pushThis();
        }
      }
      IRExpression getterCall =
          callMethod(irProp.getGetterMethod(), root, Collections.<IRExpression>emptyList());
      return castResultingTypeIfNecessary(
          getDescriptor(reducedSym.getType()), irProp.getType(), getterCall);
    } else {
      throw new UnsupportedOperationException(
          "Don't know how to compile symbol: "
              + reducedSym.getClass().getSimpleName()
              + ": "
              + reducedSym.getName()
              + ": "
              + reducedSym.getType());
    }
  }
예제 #30
0
 @Override
 public boolean isValueBoxed() {
   return symbol.isValueBoxed();
 }