Exemple #1
0
 void recurseSetContext(PythonTree tree, expr_contextType context) {
   if (tree instanceof Context) {
     ((Context) tree).setContext(context);
   }
   if (tree instanceof GeneratorExp) {
     GeneratorExp g = (GeneratorExp) tree;
     recurseSetContext(g.getInternalElt(), context);
   } else if (tree instanceof ListComp) {
     ListComp lc = (ListComp) tree;
     recurseSetContext(lc.getInternalElt(), context);
   } else if (tree instanceof SetComp) {
     SetComp sc = (SetComp) tree;
     recurseSetContext(sc.getInternalElt(), context);
   } else if (tree instanceof DictComp) {
     DictComp dc = (DictComp) tree;
     recurseSetContext(dc.getInternalKey(), context);
     recurseSetContext(dc.getInternalValue(), context);
   } else if (!(tree instanceof ListComp)
       && (!(tree instanceof DictComp))
       && (!(tree instanceof SetComp))) {
     for (int i = 0; i < tree.getChildCount(); i++) {
       recurseSetContext(tree.getChild(i), context);
     }
   }
 }
  public void visitSetComp(SetComp node, int level) throws Exception {
    String iter = getUnique("for$iter");
    String result = getUnique("compResult$");
    String start = getUnique("compStart");
    String end = getUnique("compEnd");

    addLine("PUSH $newSet");
    addLine("CALL 0");
    addLine("POP " + result);

    comprehension comp = node.getInternalGenerators().get(level);

    visit(comp.getInternalIter());
    addLine("SELECTMEMBER __iter__");
    addLine("PUSHMEMBER");
    addLine("CALL 0");
    addLine("POP " + iter);

    addLine("LABEL " + start);

    addLine("EXCEPT StopIteration " + end);
    addLine("PUSH " + iter);
    addLine("SELECTMEMBER next");
    addLine("PUSHMEMBER");
    addLine("CALL 0");
    visit(comp.getInternalTarget());
    addLine("ENDEXCEPT");

    for (expr ifexpr : comp.getInternalIfs()) {
      visit(ifexpr);
      addLine("JUMPIFFALSE " + start);
    }

    if (node.getInternalGenerators().size() == level + 1) {
      visit(node.getInternalElt());
      addLine("PUSH " + result);
      addLine("SELECTMEMBER add");
      addLine("PUSHMEMBER");
      addLine("CALL 1");
    } else {
      visitSetComp(node, level + 1);
      addLine("PUSH " + result);
      addLine("SELECTMEMBER update");
      addLine("PUSHMEMBER");
      addLine("CALL 1");
    }

    addLine("JUMP " + start);
    addLine("LABEL " + end);
    addLine("POP $");
    addLine("PUSH " + result);
  }