예제 #1
0
 public void atCastExpr(CastExpr expr) throws CompileError {
   String cname = resolveClassName(expr.getClassName());
   String toClass = checkCastExpr(expr, cname);
   int srcType = exprType;
   exprType = expr.getType();
   arrayDim = expr.getArrayDim();
   className = cname;
   if (toClass == null) atNumCastExpr(srcType, exprType); // built-in type
   else bytecode.addCheckcast(toClass);
 }
예제 #2
0
  private String checkCastExpr(CastExpr expr, String name) throws CompileError {
    final String msg = "invalid cast";
    ASTree oprand = expr.getOprand();
    int dim = expr.getArrayDim();
    int type = expr.getType();
    oprand.accept(this);
    int srcType = exprType;
    if (invalidDim(srcType, arrayDim, className, type, dim, name, true)
        || srcType == VOID
        || type == VOID) throw new CompileError(msg);

    if (type == CLASS) {
      if (!isRefType(srcType)) throw new CompileError(msg);

      return toJvmArrayName(name, dim);
    } else if (dim > 0) return toJvmTypeName(type, dim);
    else return null; // built-in type
  }