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

📄 orderedmap.java

📁 A framework written in Java for implementing high-level and dynamic languages, compiling them into J
💻 JAVA
字号:
package gnu.xquery.util;import gnu.lists.*;import gnu.mapping.*;import gnu.expr.*;import gnu.bytecode.*;/** A procedure used to represent a FLWOR expression with * an {@code order by} clause. * ({@link gnu.kawa.functions.ValuesMap} is used for FLWOR expression * that don't have an {@code order by} clause.) * * As returned by the parser: * <pre> * for $x1 in exp1, $x2 in exp2 where cond order by comparator1 ... return body * </pre> * is represented as * <pre> * ordered-map(tuple-sequence, body-function, *             comparator-function1, flags1, collation1, ...) * </pre> * Here tuple-sequence is an expression that returns a sequence of tuples, * which are currently implemnted as Java Object[] arrays. * After inlining we get: * <pre> * ordered-map(tuple-sequence. *   OrderedTuples.make$V(body-function, *     new Object[]{comparator-function1, flags1, collation1, ...})) * </pre> * * A future optimization would be to create an instance of a new sub-class * of OrderedTuples.  Then the body-function and comparator-functions * could be compiled as methods to that class.  That wins especially * if it saves us having to create extra frame classes. */public class OrderedMap extends MethodProc  implements CanInline, Inlineable{  public static final OrderedMap orderedMap = new OrderedMap();  public static Object[] makeTuple$V (Object[] values)  {    return values;  }  static final ClassType typeTuples    = ClassType.make("gnu.xquery.util.OrderedTuples");  public Expression inline (ApplyExp exp, ExpWalker walker)  {    Expression[] args = exp.getArgs();    if (args.length > 2)      {        Expression[] rargs = new Expression[args.length-1];        System.arraycopy(args, 1, rargs, 0, rargs.length);        Expression[] xargs = new Expression[2];        Method makeTupleMethod = typeTuples.getDeclaredMethod("make$V", 2);         xargs[0] = args[0];        xargs[1] = new ApplyExp(makeTupleMethod, rargs);        return new ApplyExp(this, xargs);      }    return exp;  }  public void apply (CallContext ctx) throws Throwable  {    Consumer out = ctx.consumer;    Object[] args = ctx.getArgs();    Object values = args[0];    OrderedTuples tuples;    if (args.length == 2)      {        tuples = (OrderedTuples) args[1];      }    else      {        Object[] comps = new Object[args.length-2];        System.arraycopy(args, 2, comps, 0, comps.length);        tuples = OrderedTuples.make$V((Procedure) args[1], comps);      }    Values.writeValues(values, tuples);    tuples.run$X(ctx);  }  public void compile (ApplyExp exp, Compilation comp, Target target)  {    Expression[] args = exp.getArgs();    if (args.length != 2)      {        ApplyExp.compile(exp, comp, target);        return;      }    CodeAttr code = comp.getCode();    Scope scope = code.pushScope();    Variable consumer = scope.addVariable(code, typeTuples, null);    args[1].compile(comp, Target.pushValue(typeTuples));    code.emitStore(consumer);    ConsumerTarget ctarget = new ConsumerTarget(consumer);    args[0].compile(comp, ctarget);    Method mm = typeTuples.getDeclaredMethod("run$X", 1);    code.emitLoad(consumer);    PrimProcedure.compileInvoke(comp, mm, target, exp.isTailCall(),                                182/*invokevirtual*/, Type.pointer_type);    code.popScope();  }  public gnu.bytecode.Type getReturnType (Expression[] args)  {    return Type.pointer_type; // FIXME  }}

⌨️ 快捷键说明

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