Changeset 3109

Show
Ignore:
Timestamp:
11/26/08 12:46:49 (12 months ago)
Author:
sukyoungryu
Message:

[ast refactoring] Merged AbstractTupleType?, TupleType?, and VarargTupleType? to TupleType?.

Location:
trunk/ProjectFortress
Files:
15 modified

Legend:

Unmodified
Added
Removed
  • trunk/ProjectFortress/astgen/Fortress.ast

    r3107 r3109  
    653653             * e.g.) self 
    654654             * e.g.) x: String... 
     655             * 
     656             * <varargsType> 
     657             * It is a varargs parameter if the varargsType field is set. 
    655658             */ 
    656659            Param(List<Modifier> mods = Collections.<Modifier>emptyList(), 
     
    13571360                /** 
    13581361                 * tuple-like types 
    1359                  */ 
    1360                 abstract AbstractTupleType(List<Type> elements); 
    1361                     /** 
    1362                      * tuple type 
    1363                      * TupleType ::= ( Type, TypeList ) 
    1364                      * e.g.) (ZZ32, String) 
    1365                      */ 
    1366                     TupleType(); 
    1367                     /** 
    1368                      * Used internally to represent an infinite union of 
    1369                      * TupleTypes. 
    1370                      */ 
    1371                     VarargTupleType(Type varargs); 
     1362                 * TupleType ::= ( Type, TypeList ) 
     1363                 * e.g.) (ZZ32, String) 
     1364                 * 
     1365                 * <varargs> 
     1366                 * It has a varargs parameter if the varargs field is set. 
     1367                 */ 
     1368                TupleType(List<Type> elements, 
     1369                          Option<Type> varargs = Option.<Type>none()); 
    13721370                /** 
    13731371                 * void type 
  • trunk/ProjectFortress/src/com/sun/fortress/compiler/Types.java

    r3071 r3109  
    4545 
    4646    private Types() {} 
    47      
     47 
    4848    private static Span span = NodeFactory.makeSpan("If you see this, it is a bug."); 
    4949 
     
    5353    //       ImmutableHeapSequence is put into the libraries. 
    5454    public static final Id IMMUTABLE_HEAP_SEQ_NAME = makeId(fortressLibrary, "ImmutableArray"); 
    55      
     55 
    5656    public static final AnyType ANY = new AnyType(span); 
    5757    public static final BottomType BOTTOM = new BottomType(span); 
     
    226226     * Bottom. 
    227227     */ 
    228     public static Type varargDisjunct(VarargTupleType t, int arity) { 
     228    public static Type varargDisjunct(TupleType t, int arity) { 
    229229        List<Type> base = t.getElements(); 
    230230        int baseSize = base.size(); 
    231231        if (baseSize > arity) { return BOTTOM; } 
    232232        else { 
    233             Iterable<Type> rest = IterUtil.copy(t.getVarargs(), arity-baseSize); 
     233            Iterable<Type> rest = IterUtil.copy(t.getVarargs().unwrap(), arity-baseSize); 
    234234            return makeTuple(IterUtil.compose(base, rest)); 
    235235        } 
     
    238238    /** 
    239239     * Produce a type representing a Domain with any keyword types removed. 
    240      * May return a TupleType, a VoidType, a VarargTupleType, or a type 
     240     * May return a TupleType, a VoidType, a TupleType with varargs, or a type 
    241241     * representing a singleton argument. 
    242242     */ 
    243243    public static Type stripKeywords(Domain d) { 
    244244        if (d.getVarargs().isSome()) { 
    245             return new VarargTupleType(NodeFactory.makeSpan(d.getArgs(), d.getVarargs().unwrap()), d.getArgs(), d.getVarargs().unwrap()); 
     245            return new TupleType(NodeFactory.makeSpan(d.getArgs(), d.getVarargs().unwrap()), d.getArgs(), d.getVarargs()); 
    246246        } 
    247247        else { 
     
    294294            } 
    295295            @Override public Domain forTupleType(TupleType t) { 
    296                 return new Domain(NodeFactory.makeSpan(t, keywords), t.getElements(), keywords); 
    297             } 
    298             @Override public Domain forVarargTupleType(VarargTupleType t) { 
    299                 return new Domain(NodeFactory.makeSpan(t, keywords), t.getElements(), Option.some(t.getVarargs()), 
    300                                   keywords); 
     296                if ( t.getVarargs().isNone() ) 
     297                    return new Domain(NodeFactory.makeSpan(t, keywords), t.getElements(), keywords); 
     298                else 
     299                    return new Domain(NodeFactory.makeSpan(t, keywords), t.getElements(), t.getVarargs(), 
     300                                      keywords); 
    301301            } 
    302302            @Override public Domain forType(Type t) { 
  • trunk/ProjectFortress/src/com/sun/fortress/compiler/typechecker/SubtypeChecker.java

    r3071 r3109  
    379379    } 
    380380    private boolean isTuple(Type t) { 
    381         return (t instanceof AbstractTupleType); 
     381        return (t instanceof TupleType); 
    382382    } 
    383383    private boolean isInst(Type t) { 
     
    397397    } 
    398398    private boolean isVarargTupleType(Type t) { 
    399         return (t instanceof VarargTupleType); 
     399        return (t instanceof TupleType && 
     400                ((TupleType)t).getVarargs().isSome()); 
    400401    } 
    401402 
     
    598599     * 
    599600     *        _InferenceVarType(Object id, int index = -1); 
    600      *        VarargTupleType(Type varargs); 
    601601     *        abstract DimExpr(); 
    602602     *            ExponentType(Type base, IntExpr power); 
     
    719719            //           p; Delta |- (s, ...) <: (t, ...) 
    720720            if (isTuple(s) && isTuple(t)) { 
    721                 if (s instanceof VarargTupleType && t instanceof VarargTupleType) { 
    722                     VarargTupleType ss = (VarargTupleType)s; 
    723                     VarargTupleType tt = (VarargTupleType)t; 
     721                TupleType ss = (TupleType)s; 
     722                TupleType tt = (TupleType)t; 
     723                if (ss.getVarargs().isSome() && tt.getVarargs().isSome()) { 
    724724                    List<Type> stypes = ss.getElements(); 
    725725                    List<Type> ttypes = tt.getElements(); 
    726726                    int padLength = Math.max(stypes.size(), ttypes.size()); 
    727                     List<Type> spadded = pad(stypes, ss.getVarargs(), padLength); 
    728                     List<Type> tpadded = pad(ttypes, tt.getVarargs(), padLength); 
     727                    List<Type> spadded = pad(stypes, ss.getVarargs().unwrap(), padLength); 
     728                    List<Type> tpadded = pad(ttypes, tt.getVarargs().unwrap(), padLength); 
    729729                    for (Pair<Type, Type> p : IterUtil.zip(spadded, tpadded)) { 
    730730                        if (!subtype(p.first(), p.second(), history)) { 
     
    733733                    } 
    734734                    // Check that varargs are subtypes 
    735                     if (!subtype(ss.getVarargs(), tt.getVarargs())) { 
     735                    if (!subtype(ss.getVarargs().unwrap(), tt.getVarargs().unwrap())) { 
    736736                        return FALSE; 
    737737                    } 
    738738                    return TRUE; 
    739                 } else if (s instanceof VarargTupleType || t instanceof VarargTupleType) { 
    740                     // only one is a VarargTupleType 
     739                } else if (ss.getVarargs().isSome() || tt.getVarargs().isSome()) { 
     740                    // only one has a varargs parameter 
    741741                    return FALSE; 
    742742                } else { // s instanceof TupleType && s instanceof TupleType 
    743                     TupleType ss = (TupleType)s; 
    744                     TupleType tt = (TupleType)t; 
    745743                    List<Type> types = tt.getElements(); 
    746744                    if (ss.getElements().size() != types.size()) { 
  • trunk/ProjectFortress/src/com/sun/fortress/compiler/typechecker/TypeAnalyzer.java

    r3071 r3109  
    253253            } 
    254254 
    255             @Override public Type forTupleTypeOnly(TupleType t, List<Type> normalElements) { 
    256                 Type result = handleAbstractTuple(normalElements, MAKE_TUPLE); 
    257                 return t.equals(result) ? t : result; 
    258             } 
    259  
    260             @Override public Type forVarargTupleTypeOnly(VarargTupleType t, List<Type> normalElements, 
    261                                                          Type normalVarargs) { 
    262                 // the varargs type can be treated like just another tuple element, as far as 
    263                 // normalization is concerned, unless the varargs type is Bottom 
    264                 if (normalVarargs.equals(BOTTOM)) { 
    265                     return handleAbstractTuple(normalElements, MAKE_TUPLE); 
    266                 } 
    267                 else { 
    268                     Lambda<Iterable<Type>, Type> factory = new Lambda<Iterable<Type>, Type>() { 
    269                         public Type value(Iterable<Type> ts) { 
    270                             if (IterUtil.isEmpty(ts)) { return VOID; } 
    271                             else { 
    272                                 List<Type> elts = makeList(skipLast(ts)); 
    273                                 Type varargs = last(ts); 
    274                                 return new VarargTupleType(NodeFactory.makeSpan(elts, varargs), elts, varargs); 
    275                             } 
    276                         } 
    277                     }; 
    278                     Type result = handleAbstractTuple(compose(normalElements, normalVarargs), 
    279                                                       factory); 
    280                     return t.equals(result) ? t : result; 
    281                 } 
    282             } 
     255                @Override public Type forTupleTypeOnly(TupleType t, List<Type> normalElements, 
     256                                                       Option<Type> normalVarargs) { 
     257                    if ( normalVarargs.isNone() ) { 
     258                        Type result = handleAbstractTuple(normalElements, MAKE_TUPLE); 
     259                        return t.equals(result) ? t : result; 
     260                    } else { 
     261                        // the varargs type can be treated like just another tuple element, as far as 
     262                        // normalization is concerned, unless the varargs type is Bottom 
     263                        if (normalVarargs.unwrap().equals(BOTTOM)) { 
     264                            return handleAbstractTuple(normalElements, MAKE_TUPLE); 
     265                        } 
     266                        else { 
     267                            Lambda<Iterable<Type>, Type> factory = new Lambda<Iterable<Type>, Type>() { 
     268                                public Type value(Iterable<Type> ts) { 
     269                                    if (IterUtil.isEmpty(ts)) { return VOID; } 
     270                                    else { 
     271                                        List<Type> elts = makeList(skipLast(ts)); 
     272                                        Type varargs = last(ts); 
     273                                        return new TupleType(NodeFactory.makeSpan(elts, varargs), 
     274                                                             elts, Option.<Type>some(varargs)); 
     275                                    } 
     276                                } 
     277                            }; 
     278                            Type result = handleAbstractTuple(compose(normalElements, normalVarargs.unwrap()), 
     279                                                              factory); 
     280                            return t.equals(result) ? t : result; 
     281                        } 
     282                    } 
     283                } 
    283284 
    284285            private Type handleAbstractTuple(Iterable<Type> normalElements, 
     
    455456 
    456457                @Override public 
    457                 ConstraintFormula forVarargTupleType(final VarargTupleType t) { 
     458                ConstraintFormula forTupleType(final TupleType t) { 
     459                    if ( t.getVarargs().isSome() ) { 
     460 
    458461                    return s.accept(new NodeAbstractVisitor<ConstraintFormula>() { 
    459462                        @Override public ConstraintFormula forType(Type s) { 
     
    471474                        } 
    472475                        @Override public ConstraintFormula forTupleType(TupleType s) { 
    473                             return tupleSubVararg(s, t, h); 
    474                         } 
    475                         @Override public 
    476                         ConstraintFormula forVarargTupleType(VarargTupleType s) { 
    477                             return varargSubVararg(s, t, h); 
     476                            if ( s.getVarargs().isSome() ) 
     477                                return varargSubVararg(s, t, h); 
     478                            else return tupleSubVararg(s, t, h); 
    478479                        } 
    479480                    }); 
     481                    } else 
     482                        return null; 
    480483                } 
    481484 
     
    658661    } 
    659662 
    660     private ConstraintFormula voidSubVararg(VoidType s, VarargTupleType t, SubtypeHistory h) { 
     663    private ConstraintFormula voidSubVararg(VoidType s, TupleType t, SubtypeHistory h) { 
    661664        return sub(s, varargDisjunct(t, 0), h); 
    662665    } 
    663666 
    664     private ConstraintFormula traitSubVararg(TraitType s, VarargTupleType t, SubtypeHistory h) { 
     667    private ConstraintFormula traitSubVararg(TraitType s, TupleType t, SubtypeHistory h) { 
    665668        return sub(s, varargDisjunct(t, 1), h); 
    666669    } 
    667670 
    668     private ConstraintFormula anySubVararg(AnyType s, VarargTupleType t, SubtypeHistory h) { 
     671    private ConstraintFormula anySubVararg(AnyType s, TupleType t, SubtypeHistory h) { 
    669672        return sub(s, varargDisjunct(t, 1), h); 
    670673    } 
    671674 
    672     private ConstraintFormula tupleSubVararg(TupleType s, VarargTupleType t, SubtypeHistory h) { 
     675    private ConstraintFormula tupleSubVararg(TupleType s, TupleType t, SubtypeHistory h) { 
    673676        return sub(s, varargDisjunct(t, s.getElements().size()), h); 
    674677    } 
    675678 
    676     private ConstraintFormula varargSubVararg(VarargTupleType s, VarargTupleType t, 
     679    private ConstraintFormula varargSubVararg(TupleType s, TupleType t, 
    677680                                              SubtypeHistory h) { 
    678681        int n = s.getElements().size(); 
     
    680683        ConstraintFormula f = sub(varargDisjunct(s, n), varargDisjunct(t, n), h); 
    681684        if (!f.isFalse()) { 
    682             f = f.and(sub(s.getVarargs(), t.getVarargs(), h), h); 
     685            f = f.and(sub(s.getVarargs().unwrap(), t.getVarargs().unwrap(), h), h); 
    683686        } 
    684687        return f; 
  • trunk/ProjectFortress/src/com/sun/fortress/compiler/typechecker/TypeAnalyzerJUTest.java

    r3096 r3109  
    550550            if (varargs) { s = s.substring(0, s.length()-4) + ")"; } 
    551551            List<Type> ts = parseTypeList(s, "(", ")"); 
    552             if (varargs) { return new VarargTupleType(span, ts, ts.remove(ts.size()-1)); } 
     552            if (varargs) { return new TupleType(span, ts, Option.<Type>some(ts.remove(ts.size()-1))); } 
    553553            else if (ts.size() == 0) { return VOID; } 
    554554            else if (ts.size() == 1) { return ts.get(0); } 
  • trunk/ProjectFortress/src/com/sun/fortress/compiler/typechecker/TypeAnalyzerUtil.java

    r2448 r3109  
    172172            } 
    173173            @Override public Boolean forTupleType(TupleType t) { 
    174                 return recurOnList(t.getElements()); 
    175             } 
    176             @Override public Boolean forVarargTupleType(VarargTupleType t) { 
    177                 return recurOnList(t.getElements()) || t.getVarargs().accept(this); 
     174                if ( t.getVarargs().isNone() ) 
     175                    return recurOnList(t.getElements()); 
     176                else 
     177                    return recurOnList(t.getElements()) || t.getVarargs().unwrap().accept(this); 
    178178            } 
    179179            @Override public Boolean forAnyType(AnyType t) { return false; } 
  • trunk/ProjectFortress/src/com/sun/fortress/compiler/typechecker/TypeChecker.java

    r3107 r3109  
    23952395                    } 
    23962396                } 
    2397                 AbstractTupleType domain; 
     2397                TupleType domain; 
    23982398                if(varargs){ 
    23992399                        Type var = dlist.remove(dlist.size()-1); 
    2400                         domain = new VarargTupleType(that.getSpan(), dlist,var); 
     2400                        domain = new TupleType(that.getSpan(), dlist, Option.<Type>some(var)); 
    24012401                } 
    24022402                else{ 
  • trunk/ProjectFortress/src/com/sun/fortress/interpreter/evaluator/EvalType.java

    r3107 r3109  
    410410 
    411411    @Override 
    412     public FType forVarargTupleType(VarargTupleType tt) { 
    413         List<FType> elts = getFTypeListFromList(tt.getElements()); 
    414         elts.add(FTypeRest.make(tt.getVarargs().accept(this))); 
    415         return FTypeTuple.make(elts); 
    416     } 
    417  
    418     @Override 
    419412    public FType forTupleType(TupleType tt) { 
    420         List<FType> elts = getFTypeListFromList(tt.getElements()); 
    421         return FTypeTuple.make(elts); 
     413        if ( tt.getVarargs().isNone() ) { 
     414            List<FType> elts = getFTypeListFromList(tt.getElements()); 
     415            return FTypeTuple.make(elts); 
     416        } else { 
     417            List<FType> elts = getFTypeListFromList(tt.getElements()); 
     418            elts.add(FTypeRest.make(tt.getVarargs().unwrap().accept(this))); 
     419            return FTypeTuple.make(elts); 
     420        } 
    422421    } 
    423422 
  • trunk/ProjectFortress/src/com/sun/fortress/interpreter/evaluator/MakeInferenceSpecific.java

    r2649 r3109  
    3030import com.sun.fortress.nodes.NodeAbstractVisitor_void; 
    3131import com.sun.fortress.nodes.TraitType; 
    32 import com.sun.fortress.nodes.VarargTupleType; 
    3332import com.sun.fortress.nodes.TupleType; 
    3433import com.sun.fortress.nodes.VoidType; 
     
    136135 
    137136    /* (non-Javadoc) 
    138      * @see com.sun.fortress.nodes.NodeAbstractVisitor_void#forVarargTupleType(com.sun.fortress.nodes.VarargTupleType) 
    139      */ 
    140     @Override 
    141     public void forVarargTupleType(VarargTupleType that) { 
    142         // TODO: implement 
    143         NI.nyi("Can't yet handle varargs tuples"); 
    144     } 
    145  
    146     /* (non-Javadoc) 
    147137     * @see com.sun.fortress.nodes.NodeAbstractVisitor_void#forTupleType(com.sun.fortress.nodes.TupleType) 
    148138     */ 
    149139    @Override 
    150140    public void forTupleType(TupleType that) { 
    151         acceptList(that.getElements(), this); 
     141        if ( that.getVarargs().isSome() ) { 
     142            // TODO: implement 
     143            NI.nyi("Can't yet handle varargs tuples"); 
     144        } else { 
     145            acceptList(that.getElements(), this); 
     146        } 
    152147    } 
    153148 
  • trunk/ProjectFortress/src/com/sun/fortress/interpreter/evaluator/ScoutVisitor.java

    r3096 r3109  
    3535import com.sun.fortress.nodes.BaseType; 
    3636import com.sun.fortress.nodes.TraitTypeWhere; 
    37 import com.sun.fortress.nodes.VarargTupleType; 
    3837import com.sun.fortress.nodes.TupleType; 
    3938import com.sun.fortress.nodes.Type; 
     
    151150 
    152151    /* (non-Javadoc) 
    153      * @see com.sun.fortress.nodes.NodeAbstractVisitor_void#forVarargTupleType(com.sun.fortress.nodes.VarargTupleType) 
    154      */ 
    155     @Override 
    156     public void forVarargTupleType(VarargTupleType that) { 
    157         // TODO Auto-generated method stub 
    158         super.forVarargTupleType(that); 
    159     } 
    160  
    161     /* (non-Javadoc) 
    162152     * @see com.sun.fortress.nodes.NodeAbstractVisitor_void#forTupleType(com.sun.fortress.nodes.TupleType) 
    163153     */ 
  • trunk/ProjectFortress/src/com/sun/fortress/interpreter/evaluator/types/FTypeTuple.java

    r2618 r3109  
    3434import com.sun.fortress.nodes.TupleType; 
    3535import com.sun.fortress.nodes.Type; 
    36 import com.sun.fortress.nodes.VarargTupleType; 
    3736import com.sun.fortress.nodes.VoidType; 
    3837import com.sun.fortress.useful.BoundingMap; 
     
    382381        } 
    383382        else if (val instanceof TupleType) { 
    384             elements = ((TupleType) val).getElements(); 
    385             vargs = Option.none(); 
    386         } 
    387         else if (val instanceof VarargTupleType) { 
    388             VarargTupleType tup = (VarargTupleType) val; 
    389             elements = tup.getElements(); 
    390             vargs = Option.some(tup.getVarargs()); 
     383            TupleType _val = (TupleType) val; 
     384            if ( _val.getVarargs().isNone() ) { 
     385                elements = _val.getElements(); 
     386                vargs = Option.none(); 
     387            } else { 
     388                elements = _val.getElements(); 
     389                vargs = Option.some(_val.getVarargs().unwrap()); 
     390            } 
    391391        } 
    392392        else { return false; } 
  • trunk/ProjectFortress/src/com/sun/fortress/nodes_util/ErrorMsgMaker.java

    r3107 r3109  
    356356    } 
    357357 
    358     public String forVarargTupleType(VarargTupleType node) { 
    359         return 
    360             "(" + 
    361             Useful.listInDelimiters("", mapSelf(node.getElements()), "") + 
    362             node.getVarargs().accept(this) + "..." + 
    363             ")"; 
    364     } 
    365  
    366358    public String forTupleType(TupleType node) { 
    367         return Useful.listInDelimiters("(", mapSelf(node.getElements()), ")"); 
     359        if ( node.getVarargs().isNone() ) 
     360            return Useful.listInDelimiters("(", mapSelf(node.getElements()), ")"); 
     361        else 
     362            return 
     363                "(" + 
     364                Useful.listInDelimiters("", mapSelf(node.getElements()), "") + 
     365                node.getVarargs().unwrap().accept(this) + "..." + 
     366                ")"; 
    368367    } 
    369368 
  • trunk/ProjectFortress/src/com/sun/fortress/nodes_util/NodeComparator.java

    r3107 r3109  
    381381    } 
    382382 
    383     static int compare(VarargTupleType left, VarargTupleType right) { 
    384         int x = typeListComparer.compare(left.getElements(), right.getElements()); 
    385         if (x != 0) return x; 
    386         return compare(left.getVarargs(), right.getVarargs()); 
    387     } 
    388  
    389383    static int compare(TupleType left, TupleType right) { 
    390         return typeListComparer.compare(left.getElements(), right.getElements()); 
     384        if ( left.getVarargs().isSome() && right.getVarargs().isSome() ) { 
     385            int x = typeListComparer.compare(left.getElements(), right.getElements()); 
     386            if (x != 0) return x; 
     387            return compare(left.getVarargs().unwrap(), right.getVarargs().unwrap()); 
     388        } else 
     389            return typeListComparer.compare(left.getElements(), right.getElements()); 
    391390    } 
    392391 
     
    424423        } else if (left instanceof VoidType) { 
    425424            return 0; 
    426         } else if (left instanceof VarargTupleType) { 
    427             return compare((VarargTupleType) left, (VarargTupleType) right); 
    428425        } else if (left instanceof TupleType) { 
    429426            return compare((TupleType) left, (TupleType) right); 
  • trunk/ProjectFortress/src/com/sun/fortress/nodes_util/NodeFactory.java

    r3107 r3109  
    12721272                        t.getArgs()); 
    12731273            } 
    1274             public Type forVarargTupleType(VarargTupleType t) { 
    1275                 return new VarargTupleType(t.getSpan(), true, t.getElements(), 
    1276                         t.getVarargs()); 
    1277             } 
    12781274            public Type forTupleType(TupleType t) { 
    1279                 return new TupleType(t.getSpan(), true, t.getElements()); 
     1275                return new TupleType(t.getSpan(), true, t.getElements(), 
     1276                                     t.getVarargs()); 
    12801277            } 
    12811278            public Type forVoidType(VoidType t) { 
  • trunk/ProjectFortress/src/com/sun/fortress/tools/FortressAstToConcrete.java

    r3107 r3109  
    21732173 
    21742174    @Override public String forTupleTypeOnly(TupleType that, 
    2175                                              List<String> elements_result) { 
     2175                                             List<String> elements_result, 
     2176                                             Option<String> varargs_result) { 
    21762177        StringBuilder s = new StringBuilder(); 
    21772178 
    21782179        s.append( "(" ); 
    21792180        s.append( join(elements_result, ", ") ); 
     2181        if ( varargs_result.isSome() ) { 
     2182            s.append( "(* " ); 
     2183            s.append( ", " ); 
     2184            s.append( varargs_result.unwrap() ); 
     2185            s.append( "...)" ); 
     2186            s.append( " *)" ); 
     2187        } 
    21802188        s.append( ")" ); 
    21812189 
    21822190        return s.toString(); 
    2183     } 
    2184  
    2185     @Override public String forVarargTupleTypeOnly(VarargTupleType that, 
    2186                                                    List<String> elements_result, 
    2187                                                    String varargs_result) { 
    2188         StringBuilder s = new StringBuilder(); 
    2189  
    2190         s.append( "(" ); 
    2191         s.append( join(elements_result, ", ") ); 
    2192         s.append( ", " ); 
    2193         s.append( varargs_result ); 
    2194         s.append( "...)" ); 
    2195  
    2196         return "(* " + s.toString() + " *)"; 
    21972191    } 
    21982192