Author: dda
Date: 2008-02-29 10:45:20 -0800 (Fri, 29 Feb 2008)
New Revision: 8136
Added:
openlaszlo/trunk/test/optarg.lzx
Modified:
openlaszlo/trunk/WEB-INF/lps/server/sc/src/org/openlaszlo/sc/Parser.jjt
openlaszlo/trunk/WEB-INF/lps/server/sc/src/org/openlaszlo/sc/parser/ASTIdentifier.java
openlaszlo/trunk/WEB-INF/lps/server/sc/src/org/openlaszlo/sc/parser/ASTLiteral.java
openlaszlo/trunk/WEB-INF/lps/server/sc/src/org/openlaszlo/sc/parser/ASTModifiedDefinition.java
openlaszlo/trunk/WEB-INF/lps/server/sc/src/org/openlaszlo/sc/parser/ASTOperator.java
openlaszlo/trunk/WEB-INF/lps/server/sc/src/org/openlaszlo/sc/parser/SimpleNode.java
openlaszlo/trunk/WEB-INF/lps/server/src/org/openlaszlo/sc/CodeGenerator.java
openlaszlo/trunk/WEB-INF/lps/server/src/org/openlaszlo/sc/CommonGenerator.java
openlaszlo/trunk/WEB-INF/lps/server/src/org/openlaszlo/sc/Compiler.java
openlaszlo/trunk/WEB-INF/lps/server/src/org/openlaszlo/sc/JavascriptGenerator.java
openlaszlo/trunk/WEB-INF/lps/server/src/org/openlaszlo/sc/VariableAnalyzer.java
Log:
Change 20080226-dda-5 by [EMAIL PROTECTED] on 2008-02-26 09:02:58 EST
in /Users/dda/laszlo/src/svn/openlaszlo/trunk
for http://svn.openlaszlo.org/openlaszlo/trunk
Summary: Support optional and variable arg syntax for SWF8, DHTML
New Features: JS2 syntax for optional arguments and ...rest syntax for variable
arguments now supported
Bugs Fixed: LPP-5273
Technical Reviewer: ptw (pending)
QA Reviewer: promanik (pending)
Doc Reviewer: (pending)
Documentation: The syntax allowed is according to the Ecmascript 4 draft
standard,
which is implemented in ActionScript 3.
Release Notes:
Details:
The grammar aspect of this change is backported from the devildog branch.
To help future merges, it seemed best to take all grammar changes except for
the SWF9 'passthrough' work. Which means we get:
- varargs and optional args, with corresponding changes to ASTIdentifier
- recognition 'const' keyword (treating the same as 'var')
- 'catch' allows a type declaration for argument.
- turn on 'visitor' support in parser, could help with future work.
The changes to the formal arguments are made just before a function is
translated,
and are designed as a single method. This will allow SWF9 to provide a
no-op for the method and keep its behavior to pass through the syntax
to the third party compiler.
The new function is formalArgumentsTransformations and is expected to be
self documenting.
A small fix to 'setRuntime' in JavascriptGenerator spotted and changed.
Some unneeded code removed from CodeGenerator (this change already in
devildog).
A new file test/optarg.lzx is added. This will supercede test/optargs.lzx
already
in the devildog branch.
Tests:
(smokecheck,weather,lzpix) x (swf8,dhtml)
new test/optarg.lzx (swf8,dhtml)
one-off test: locally, incorporated parts of test/optarg.lzx into LFC to
make
sure syntaxes work within 'class { function foo(args...) }'
syntax.
Modified:
openlaszlo/trunk/WEB-INF/lps/server/sc/src/org/openlaszlo/sc/Parser.jjt
===================================================================
--- openlaszlo/trunk/WEB-INF/lps/server/sc/src/org/openlaszlo/sc/Parser.jjt
2008-02-29 18:16:32 UTC (rev 8135)
+++ openlaszlo/trunk/WEB-INF/lps/server/sc/src/org/openlaszlo/sc/Parser.jjt
2008-02-29 18:45:20 UTC (rev 8136)
@@ -10,7 +10,7 @@
*
****************************************************************************/
/* J_LZ_COPYRIGHT_BEGIN *******************************************************
-* Copyright 2001-2004 Laszlo Systems, Inc. All Rights Reserved. *
+* Copyright 2001-2008 Laszlo Systems, Inc. All Rights Reserved. *
* Use is subject to license terms. *
* J_LZ_COPYRIGHT_END *********************************************************/
@@ -23,7 +23,7 @@
NODE_DEFAULT_VOID=true;
NODE_PACKAGE = "org.openlaszlo.sc.parser";
NODE_SCOPE_HOOK=true;
- VISITOR=false;
+ VISITOR=true;
UNICODE_INPUT = true;
}
@@ -67,6 +67,31 @@
// sn.setEndLocation(t.endLine, t.endColumn);
//}
}
+
+ public static class FormalParameterState {
+ private boolean hasRest = false;
+ private boolean hasInit = false;
+ private Token token;
+ public void setToken(Token t) {
+ token = t;
+ }
+ public void checkRestParameter() {
+ if (hasRest)
+ throw new ParseException(token, "multiple ...rest parameters
not allowed");
+ hasRest = true;
+ }
+ public void checkInitParameter() {
+ if (hasRest)
+ throw new ParseException(token, "...rest parameter must be
last");
+ hasInit = true;
+ }
+ public void checkRegularParameter() {
+ if (hasRest)
+ throw new ParseException(token, "...rest parameter must be
last");
+ if (hasInit)
+ throw new ParseException(token, "regular parameters not
allowed after optional parameters");
+ }
+ }
}
PARSER_END(Parser)
@@ -275,6 +300,7 @@
| < SEMICOLON: ";" >
| < COMMA: "," >
| < DOT: "." >
+| < ELLIPSIS: "..." >
}
/* operators */
@@ -672,7 +698,8 @@
void VariableStatement() #VariableStatement : {}
{
- "var" VariableDeclarationList() Sc()
+ // TODO: [2007-12-19 dda] pass const info through
+ ( "var" | "const" ) VariableDeclarationList() Sc()
}
void VariableDeclarationList() #VariableDeclarationList(>1) : {}
@@ -875,7 +902,7 @@
void CatchClause() #CatchClause : {}
{
- "catch" "(" FormalParameter() ")" Block()
+ "catch" "(" FormalParameterIdentifier() ")" Block()
}
void FinallyClause() #FinallyClause : {}
@@ -901,22 +928,51 @@
Block()
}
-ASTFormalParameterList FormalParameterList() #FormalParameterList : {}
+ASTFormalParameterList FormalParameterList() #FormalParameterList :
{FormalParameterState fstate = new FormalParameterState(); Token t;}
{
- "(" [FormalParameters()] ")"
+ t="(" {fstate.setToken(t);}
+ [ FormalParameter(fstate) ( "," FormalParameter(fstate) )* ] ")"
{ return jjtThis; }
}
-void FormalParameters() : {}
+void FormalParameter(FormalParameterState fstate) #void : {ASTIdentifier id;
boolean hasRest = false; boolean hasInit = false;}
{
- FormalParameter() ("," FormalParameter())*
+ (
+ "..." id = FormalParameterIdentifier()
+ {
+ fstate.setToken(getToken(0));
+ id.setEllipsis(true);
+ hasRest = true;
+ }
+ | FormalParameterIdentifier()
+ [ "=" FormalInitializer()
+ {
+ fstate.setToken(getToken(0));
+ hasInit = true;
+ }
+ ]
+ )
+ {
+ if (hasRest)
+ fstate.checkRestParameter();
+ else if (hasInit)
+ fstate.checkInitParameter();
+ else
+ fstate.checkRegularParameter();
+ }
}
-void FormalParameter() #void : {ASTIdentifier id; ASTIdentifier.Type type;}
+void FormalInitializer() #FormalInitializer : {}
{
- id = Identifier() [":" type = TypeIdentifier() { id.setType(type); }]
+ AssignmentExpression()
}
+ASTIdentifier FormalParameterIdentifier() #void : {ASTIdentifier id;
ASTIdentifier.Type type;}
+{
+ (id = Identifier() [":" type = TypeIdentifier() { id.setType(type); }])
+ { return id; }
+}
+
// Program structuring/
SimpleNode Program() #Program : {}
Modified:
openlaszlo/trunk/WEB-INF/lps/server/sc/src/org/openlaszlo/sc/parser/ASTIdentifier.java
===================================================================
---
openlaszlo/trunk/WEB-INF/lps/server/sc/src/org/openlaszlo/sc/parser/ASTIdentifier.java
2008-02-29 18:16:32 UTC (rev 8135)
+++
openlaszlo/trunk/WEB-INF/lps/server/sc/src/org/openlaszlo/sc/parser/ASTIdentifier.java
2008-02-29 18:45:20 UTC (rev 8136)
@@ -13,12 +13,23 @@
private String name = null;
private Type type = null;
private int hash = 0;
+ private boolean ellipsis = false;
+ private boolean isconstructor = false;
public static class Type {
public String typeName = null;
public boolean nullable = false; // has "?"
public boolean notnullable = false; // has "!"
public boolean untyped = false; // is "*"
+
+ public String toString() {
+ String result = typeName;
+ if (nullable)
+ result += "?";
+ if (notnullable)
+ result += "!";
+ return result;
+ }
}
public ASTIdentifier(int id) {
@@ -63,16 +74,33 @@
this.type = type;
}
+ public boolean getEllipsis() {
+ return ellipsis;
+ }
+
+ public void setEllipsis(boolean ellipsis) {
+ this.ellipsis = ellipsis;
+ }
+
+ public boolean isConstructor() {
+ return isconstructor;
+ }
+
+ public void setIsConstructor(boolean value) {
+ this.isconstructor = value;
+ }
+
public String toString() {
+ String dots = ellipsis ? "..." : "";
String typesuffix = "";
if (type != null) {
- typesuffix = ": ";
- if (type.nullable)
- typesuffix += "?";
- typesuffix += type.typeName;
- if (type.notnullable)
- typesuffix += "!";
+ typesuffix = ": " + type.toString();
}
- return "ASTIdentifier(" + name + typesuffix + ")";
+ return "ASTIdentifier(" + dots + name + typesuffix + ")";
}
+
+ /** Accept the visitor */
+ public Object jjtAccept(ParserVisitor visitor, Object data) {
+ return visitor.visit(this, data);
+ }
}
Modified:
openlaszlo/trunk/WEB-INF/lps/server/sc/src/org/openlaszlo/sc/parser/ASTLiteral.java
===================================================================
---
openlaszlo/trunk/WEB-INF/lps/server/sc/src/org/openlaszlo/sc/parser/ASTLiteral.java
2008-02-29 18:16:32 UTC (rev 8135)
+++
openlaszlo/trunk/WEB-INF/lps/server/sc/src/org/openlaszlo/sc/parser/ASTLiteral.java
2008-02-29 18:45:20 UTC (rev 8136)
@@ -195,10 +195,15 @@
return "Literal(" + mValue.toString() + ")";
}
+ /** Accept the visitor */
+ public Object jjtAccept(ParserVisitor visitor, Object data) {
+ return visitor.visit(this, data);
+ }
+
}
/* J_LZ_COPYRIGHT_BEGIN *******************************************************
-* Copyright 2001-2006 Laszlo Systems, Inc. All Rights Reserved. *
+* Copyright 2001-2008 Laszlo Systems, Inc. All Rights Reserved. *
* Use is subject to license terms. *
* J_LZ_COPYRIGHT_END *********************************************************/
Modified:
openlaszlo/trunk/WEB-INF/lps/server/sc/src/org/openlaszlo/sc/parser/ASTModifiedDefinition.java
===================================================================
---
openlaszlo/trunk/WEB-INF/lps/server/sc/src/org/openlaszlo/sc/parser/ASTModifiedDefinition.java
2008-02-29 18:16:32 UTC (rev 8135)
+++
openlaszlo/trunk/WEB-INF/lps/server/sc/src/org/openlaszlo/sc/parser/ASTModifiedDefinition.java
2008-02-29 18:45:20 UTC (rev 8136)
@@ -69,7 +69,7 @@
}
public void setStatic(boolean value) {
- isStatic = true;
+ isStatic = value;
}
public boolean isStatic() {
@@ -77,7 +77,7 @@
}
public void setFinal(boolean value) {
- isFinal = true;
+ isFinal = value;
}
public boolean isFinal() {
@@ -85,7 +85,7 @@
}
public void setDynamic(boolean value) {
- isDynamic = true;
+ isDynamic = value;
}
public boolean isDynamic() {
@@ -93,7 +93,7 @@
}
public void setOverride(boolean value) {
- isOverride = true;
+ isOverride = value;
}
public boolean isOverride() {
@@ -179,7 +179,7 @@
}
/* J_LZ_COPYRIGHT_BEGIN *******************************************************
-* Copyright 2007 Laszlo Systems, Inc. All Rights Reserved. *
+* Copyright 2007-2008 Laszlo Systems, Inc. All Rights Reserved. *
* Use is subject to license terms. *
* J_LZ_COPYRIGHT_END *********************************************************/
Modified:
openlaszlo/trunk/WEB-INF/lps/server/sc/src/org/openlaszlo/sc/parser/ASTOperator.java
===================================================================
---
openlaszlo/trunk/WEB-INF/lps/server/sc/src/org/openlaszlo/sc/parser/ASTOperator.java
2008-02-29 18:16:32 UTC (rev 8135)
+++
openlaszlo/trunk/WEB-INF/lps/server/sc/src/org/openlaszlo/sc/parser/ASTOperator.java
2008-02-29 18:45:20 UTC (rev 8136)
@@ -3,7 +3,7 @@
* ****************************************************************************/
/* J_LZ_COPYRIGHT_BEGIN *******************************************************
-* Copyright 2001-2004 Laszlo Systems, Inc. All Rights Reserved. *
+* Copyright 2001-2008 Laszlo Systems, Inc. All Rights Reserved. *
* Use is subject to license terms. *
* J_LZ_COPYRIGHT_END *********************************************************/
@@ -42,4 +42,9 @@
// return "<" + tokenImage[operatorCode] + ">";
// }
+ /** Accept the visitor */
+ public Object jjtAccept(ParserVisitor visitor, Object data) {
+ return visitor.visit(this, data);
+ }
+
}
Modified:
openlaszlo/trunk/WEB-INF/lps/server/sc/src/org/openlaszlo/sc/parser/SimpleNode.java
===================================================================
---
openlaszlo/trunk/WEB-INF/lps/server/sc/src/org/openlaszlo/sc/parser/SimpleNode.java
2008-02-29 18:16:32 UTC (rev 8135)
+++
openlaszlo/trunk/WEB-INF/lps/server/sc/src/org/openlaszlo/sc/parser/SimpleNode.java
2008-02-29 18:45:20 UTC (rev 8136)
@@ -3,7 +3,7 @@
* ****************************************************************************/
/* J_LZ_COPYRIGHT_BEGIN *******************************************************
-* Copyright 2001-2006 Laszlo Systems, Inc. All Rights Reserved. *
+* Copyright 2001-2008 Laszlo Systems, Inc. All Rights Reserved. *
* Use is subject to license terms. *
* J_LZ_COPYRIGHT_END *********************************************************/
@@ -161,4 +161,10 @@
public String getComment() {
return this.comment;
}
+
+ /** Accept the visitor */
+ public Object jjtAccept(ParserVisitor visitor, Object data) {
+ return visitor.visit(this, data);
+ }
+
}
Modified:
openlaszlo/trunk/WEB-INF/lps/server/src/org/openlaszlo/sc/CodeGenerator.java
===================================================================
---
openlaszlo/trunk/WEB-INF/lps/server/src/org/openlaszlo/sc/CodeGenerator.java
2008-02-29 18:16:32 UTC (rev 8135)
+++
openlaszlo/trunk/WEB-INF/lps/server/src/org/openlaszlo/sc/CodeGenerator.java
2008-02-29 18:45:20 UTC (rev 8136)
@@ -1702,6 +1702,8 @@
try {
options = options.copy();
context = new TranslationContext(ASTFunctionExpression.class, context,
label);
+ node = formalArgumentsTransformations(node);
+ children = node.getChildren();
dependencies = translateFunctionInternal(node, useName, children);
}
finally {
@@ -1764,11 +1766,6 @@
// global name (this allows us to name closures more
// mnemonically at runtime
String meterFunctionName = functionName;
- Set pnames = new LinkedHashSet();
- SimpleNode[] paramIds = params.getChildren();
- for (int i = 0, len = paramIds.length; i < len; i++) {
- pnames.add(((ASTIdentifier)paramIds[i]).getName());
- }
// Pull all the pragmas from the beginning of the
// statement list: process them, and remove them
assert stmts instanceof ASTStatementList;
Modified:
openlaszlo/trunk/WEB-INF/lps/server/src/org/openlaszlo/sc/CommonGenerator.java
===================================================================
---
openlaszlo/trunk/WEB-INF/lps/server/src/org/openlaszlo/sc/CommonGenerator.java
2008-02-29 18:16:32 UTC (rev 8135)
+++
openlaszlo/trunk/WEB-INF/lps/server/src/org/openlaszlo/sc/CommonGenerator.java
2008-02-29 18:45:20 UTC (rev 8136)
@@ -382,6 +382,104 @@
return visitStatement(replNode);
}
+ /**
+ * If there are formal args that have initializers or indicate variable
+ * arguments, add a preamble to the function to perform any needed
+ * initialization to simulate the initialization.
+ * For example:
+ * <pre>
+ * function foo(w, x = null, y = null, ...z) {
+ * some statements
+ * }
+ * </pre>
+ * is rewritten as:
+ * <pre>
+ * function foo(w, x, y) {
+ * if (arguments.length < 2) { x = null; }
+ * if (arguments.length < 3) { y = null; }
+ * var z = new Array();
+ * for (__i=3; __i<arguments.length; __i++) {
+ * z.push(arguments[i]);
+ * }
+ * some statements
+ * }
+ * </pre>
+ * @param n function definition node
+ * @return modified function definition node
+ */
+ public SimpleNode formalArgumentsTransformations(SimpleNode n) {
+ // children are:
+ // (*) ASTIdentifier (name) (*) may be omitted
+ // ASTFormalParameterList
+ // ASTStatement (or statement list)
+ SimpleNode[] children = n.getChildren();
+ int formalPos = 0;
+ if (children.length > 0 && children[0] instanceof ASTIdentifier) {
+ formalPos++;
+ }
+ assert (children.length == formalPos+2 && children[formalPos] instanceof
ASTFormalParameterList)
+ : "function has unexpected children";
+
+ SimpleNode[] args = children[formalPos].getChildren();
+ ASTIdentifier curid = null;
+ List stmts = new ArrayList();
+ List newargs = new ArrayList();
+
+ // The argument list is a list of ASTIdentifiers and ASTFormalInitializer.
+ // When a ASTFormalInitializer appears, it contains an initialization
expression
+ // that applies to the previous argument. An ASTIdentifier can be marked
+ // with an ellipsis, the grammar should enforce it is the last one.
+ int argno = 0;
+ for (int i=0; i<args.length; i++) {
+ if (args[i] instanceof ASTIdentifier) {
+ curid = (ASTIdentifier)args[i];
+ if (curid.getEllipsis()) {
+ Map map = new HashMap();
+ String indexvar = "$lzsc$" + UUID().toString();
+ map.put("_1", new ASTIdentifier(curid.getName()));
+ map.put("_2", new ASTIdentifier(indexvar));
+ String pattern =
+ "var _1=new Array;" +
+ " for (var _2=" + argno + ";_2<arguments.length;_2++) {" +
+ "_1.push(arguments[_2]); }";
+ SimpleNode[] newNodes = (new
Compiler.Parser()).substituteStmts(pattern, map);
+ stmts.addAll(flatten(newNodes));
+ }
+ else {
+ newargs.add(args[i]);
+ }
+ argno++;
+ }
+ else if (args[i] instanceof ASTFormalInitializer) {
+ assert curid != null : "ASTFormalInitializer appears first in list";
+ SimpleNode initialValue = args[i].get(0);
+ Map map = new HashMap();
+ map.put("_1", curid);
+ map.put("_2", initialValue);
+ String pattern = "if (arguments.length<" + argno + "){_1=(_2); }";
+ stmts.addAll(flatten((new Compiler.Parser()).substituteStmts(pattern,
map)));
+ }
+ else {
+ throw new IllegalArgumentException("Unexpected item in argument list:
" + args[i]);
+ }
+ }
+
+ // any alterations needed?
+ if (stmts.size() > 0) {
+ // newargs contains arguments without initializers
+ children[formalPos].setChildren((SimpleNode[])newargs.toArray(new
SimpleNode[0]));
+
+ // Build a new statement list, consisting of new stmts for formal
+ // initializations, followed by original statements.
+ SimpleNode oldstmt = children[formalPos+1];
+ SimpleNode newstmt = new ASTStatementList(0);
+ newstmt.setChildren((SimpleNode[])stmts.toArray(new SimpleNode[0]));
+ newstmt.set(stmts.size(), oldstmt);
+ children[formalPos+1] = newstmt;
+ }
+ return n;
+ }
+
public void translateClassDirectivesBlock(SimpleNode[] dirs, String
classnameString, List props, List classProps, List stmts) {
dirs = (SimpleNode[])(flatten(dirs).toArray(new SimpleNode[0]));
Modified:
openlaszlo/trunk/WEB-INF/lps/server/src/org/openlaszlo/sc/Compiler.java
===================================================================
--- openlaszlo/trunk/WEB-INF/lps/server/src/org/openlaszlo/sc/Compiler.java
2008-02-29 18:16:32 UTC (rev 8135)
+++ openlaszlo/trunk/WEB-INF/lps/server/src/org/openlaszlo/sc/Compiler.java
2008-02-29 18:45:20 UTC (rev 8136)
@@ -749,6 +749,13 @@
SimpleNode node = parse("x = \n#file Compiler.substitute\n#line 0\n" +
str).get(0).get(0).get(2);
return visit(node, keys);
}
+
+ // Input is one or more statements, returns the nodes
+ // that correspond to those statements
+ public SimpleNode[] substituteStmts(String str, Map keys) {
+ SimpleNode fexpr = substitute("(function () {" + str + "})()", keys);
+ return fexpr.get(0).get(1).getChildren();
+ }
}
// Visitor -- only works for ParseTreePrinter so far
Modified:
openlaszlo/trunk/WEB-INF/lps/server/src/org/openlaszlo/sc/JavascriptGenerator.java
===================================================================
---
openlaszlo/trunk/WEB-INF/lps/server/src/org/openlaszlo/sc/JavascriptGenerator.java
2008-02-29 18:16:32 UTC (rev 8135)
+++
openlaszlo/trunk/WEB-INF/lps/server/src/org/openlaszlo/sc/JavascriptGenerator.java
2008-02-29 18:45:20 UTC (rev 8136)
@@ -22,7 +22,7 @@
public class JavascriptGenerator extends CommonGenerator implements Translator
{
- protected void setRuntime(String runtiem) {
+ protected void setRuntime(String runtime) {
assert org.openlaszlo.compiler.Compiler.SCRIPT_RUNTIMES.contains(runtime)
: "unknown runtime " + runtime;
}
@@ -1065,6 +1065,8 @@
try {
options = options.copy();
context = new TranslationContext(ASTFunctionExpression.class, context);
+ node = formalArgumentsTransformations(node);
+ children = node.getChildren();
result = translateFunctionInternal(node, useName, children);
}
finally {
Modified:
openlaszlo/trunk/WEB-INF/lps/server/src/org/openlaszlo/sc/VariableAnalyzer.java
===================================================================
---
openlaszlo/trunk/WEB-INF/lps/server/src/org/openlaszlo/sc/VariableAnalyzer.java
2008-02-29 18:16:32 UTC (rev 8135)
+++
openlaszlo/trunk/WEB-INF/lps/server/src/org/openlaszlo/sc/VariableAnalyzer.java
2008-02-29 18:45:20 UTC (rev 8136)
@@ -1,7 +1,7 @@
/* -*- mode: Java; c-basic-offset: 2; -*- */
/* J_LZ_COPYRIGHT_BEGIN *******************************************************
-* Copyright 2001-2004 Laszlo Systems, Inc. All Rights Reserved. *
+* Copyright 2001-2008 Laszlo Systems, Inc. All Rights Reserved. *
* Use is subject to license terms. *
* J_LZ_COPYRIGHT_END *********************************************************/
@@ -35,7 +35,13 @@
// Parameter order is significant
this.parameters = new LinkedHashSet();
for (int i = 0, len = params.size(); i < len; i++) {
- parameters.add(((ASTIdentifier)params.get(i)).getName());
+ SimpleNode param = params.get(i);
+ // might also be an initializer
+ // TODO: [2007-12-20 dda] if it is an default parameter initializer,
+ // should call visit() on the initializer expression?
+ if (param instanceof ASTIdentifier) {
+ parameters.add(((ASTIdentifier)param).getName());
+ }
}
this.locals = new LinkedHashSet(parameters);
closed = new HashSet();
Added: openlaszlo/trunk/test/optarg.lzx
Property changes on: openlaszlo/trunk/test/optarg.lzx
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Name: svn:eol-style
+ native
_______________________________________________
Laszlo-checkins mailing list
[email protected]
http://www.openlaszlo.org/mailman/listinfo/laszlo-checkins