⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 convert.java

📁 A framework written in Java for implementing high-level and dynamic languages, compiling them into J
💻 JAVA
字号:
package gnu.kawa.functions;import kawa.standard.Scheme;import gnu.bytecode.Type;import gnu.bytecode.ClassType;import gnu.bytecode.CodeAttr;import gnu.mapping.*;import gnu.expr.*;import gnu.kawa.reflect.Invoke;public class Convert extends Procedure2 implements CanInline, Inlineable{  public static final Convert as = new Convert();  static { as.setName("as"); }  public static Convert getInstance ()  {    return as;  }  public Object apply2 (Object arg1, Object arg2)  {    Type type = (Type) arg1;    return type.coerceFromObject (arg2);  }  static gnu.bytecode.ClassType typeType;  static gnu.bytecode.Method coerceMethod;  public Expression inline (ApplyExp exp, ExpWalker walker)  {    return Invoke.inlineClassName(exp, 0, (InlineCalls) walker);  }  public void compile (ApplyExp exp, Compilation comp, Target target)  {    Expression[] args = exp.getArgs();    if (args.length != 2)      throw new Error ("wrong number of arguments to "+getName());    CodeAttr code = comp.getCode();    Type type = Scheme.getTypeValue(args[0]);    if (type != null)      {        args[1].compile(comp, Target.pushValue(type));	if (code.reachableHere())	  target.compileFromStack(comp, type);      }    else      {	if (typeType == null)	  {	    typeType = ClassType.make("gnu.bytecode.Type");	    coerceMethod = typeType.addMethod("coerceFromObject",					      Compilation.apply1args,					      Type.pointer_type,					      gnu.bytecode.Access.PUBLIC);	  }	args[0].compile(comp, typeType);	args[1].compile(comp, Target.pushObject);	code.emitInvokeVirtual(coerceMethod);	target.compileFromStack(comp, Type.pointer_type);      }  }  public Type getReturnType (Expression[] args)  {    if (args != null && args.length == 2)      {	Type type = Scheme.getTypeValue(args[0]);	if (type != null)	  return type;      }    return Type.pointer_type;  }  /**   * Convenience method to make an Expression that coerces a value.   * @param value to be coerced   * @param type to coerce value to   * @return expression that coerces value to type   */  public static Expression makeCoercion(Expression value, Expression type)  {    Expression[] exps = new Expression[2];    exps[0] = type;    exps[1] = value;    QuoteExp c = new QuoteExp(Convert.getInstance());    return new ApplyExp(c, exps);  }  /**   * Convenience method to make an Expression that coerces a value.   * @param value to be coerced   * @param type to coerce value to   * @return expression that coerces value to type   */  public static Expression makeCoercion(Expression value, Type type)  {    return makeCoercion(value, new QuoteExp(type));  }  /** Modify LambdaExp so result is coerced to given type. */  public static void setCoercedReturnValue (LambdaExp lexp, Expression type,					    Language language)  {    gnu.bytecode.Type rtype = language.getTypeFor(type);    if (rtype != null)      {	Expression value = lexp.body;	lexp.body = Convert.makeCoercion(value, type);	lexp.body.setLine(value);	lexp.setReturnType(rtype);      }  }}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -