* mjs-most.tests: Enable ecma/Boolean/15.6.3.1-3.js.
* mjs-most.fail: Delete ecma/String/15.5.5.1.js,
ecma/FunctionObjects/15.3.3.1-3.js, ecma/Number/15.7.3.3-2.js,
and ecma/Number/15.7.3.5-2.js, as they no longer fail.
2007-03-01 Peter Dettman <peter.dettman@iinet.net.au>
* expression.cs: Expression.Emit changed to correctly leave a value on the
stack or not according to the 'no_effect' field, including the case where
the final AST in the list is an Assign. Fixed a reentrancy bug in Args.Emit.
* Block.cs, ForIn.cs, Statement.cs: Correctly resolve child expressions with
"no effect" where they should behave as statements.
svn path=/trunk/mcs/; revision=73783
internal override bool Resolve (Environment env)
{
AST e;
- bool no_effect;
bool r = true;
int i, n = elems.Count;
- if (parent == null || parent is FunctionDeclaration)
- no_effect = true;
- else
- no_effect = false;
-
- n = elems.Count;
-
for (i = 0; i < n; i++) {
e = (AST) elems [i];
if (e is Exp)
- r &= ((Exp) e).Resolve (env, no_effect);
+ r &= ((Exp) e).Resolve (env, true);
else
r &= e.Resolve (env);
}
+2007-03-01 Peter Dettman <peter.dettman@iinet.net.au>
+
+ * expression.cs: Expression.Emit changed to correctly leave a value on the
+ stack or not according to the 'no_effect' field, including the case where
+ the final AST in the list is an Assign. Fixed a reentrancy bug in Args.Emit.
+
+ * Block.cs, ForIn.cs, Statement.cs: Correctly resolve child expressions with
+ "no effect" where they should behave as statements.
+
2006-10-21 Miguel de Icaza <miguel@novell.com>
* JScriptCodeCompiler.cs: Ifdefed out unused code.
if (obj != null)
r &= obj.Resolve (env);
- if (body != null)
- r &= body.Resolve (env);
+ if (body != null) {
+ if (body is Exp)
+ r &= ((Exp) body).Resolve (env, true);
+ else
+ r &= body.Resolve (env);
+ }
return r;
}
bool r = true;
if (stm != null)
- r &= stm.Resolve (env);
+ if (stm is Exp)
+ r &= ((Exp) stm).Resolve (env, true);
+ else
+ r &= stm.Resolve (env);
if (exp != null)
r &= exp.Resolve (env);
return r;
else
r &= exp.Resolve (env);
if (stm != null)
- r &= stm.Resolve (env);
+ if (stm is Exp)
+ r &= ((Exp) stm).Resolve (env, true);
+ else
+ r &= stm.Resolve (env);
return r;
}
{
bool r = true;
- foreach (AST ast in exprs)
- r &= ast.Resolve (env);
+ for (int i = 0; i < 3; ++i) {
+ AST e = exprs[i];
+ if (e is Exp)
+ r &= ((Exp) e).Resolve (env, i != 1);
+ else
+ r &= e.Resolve (env);
+ }
+
if (stms != null)
r &= stms.Resolve (env);
return true;
foreach (Clause c in case_clauses)
r &= c.Resolve (env);
if (default_clauses != null)
- foreach (AST dc in default_clauses)
- r &= dc.Resolve (env);
+ foreach (AST dc in default_clauses) {
+ if (dc is Exp)
+ r &= ((Exp) dc).Resolve (env, true);
+ else
+ r &= dc.Resolve (env);
+ }
if (sec_case_clauses != null)
foreach (Clause sc in sec_case_clauses)
r &= sc.Resolve (env);
bool r = true;
if (exp != null)
r &= exp.Resolve (env);
- foreach (AST ast in stm_list)
- r &= ast.Resolve (env);
+ foreach (AST ast in stm_list) {
+ if (ast is Exp)
+ r &= ((Exp) ast).Resolve (env, true);
+ else
+ r &= ast.Resolve (env);
+ }
return r;
}
bool strong_type = BoundToMethod is MethodInfo;
ParameterInfo [] parameters = null;
+ // We may be called more than once, so avoid modifying fields
+ int expected_args = this.expected_args;
+
if (!BoundToDeclaredFunction) {
if (has_this)
expected_args--;
internal override bool Resolve (Environment env)
{
- int i, n;
- object e;
+ int n = exprs.Count - 1;
bool r = true;
-
- n = exprs.Count - 1;
+ object e;
- for (i = 0; i < n; i++) {
+ for (int i = 0; i <= n; i++) {
e = exprs [i];
if (e is Exp)
- if (e is Assign)
- r &= ((Assign) e).Resolve (env);
- else
- r &= ((Exp) e).Resolve (env, true);
- }
- e = exprs [n];
- if (e is Exp)
- if (e is Assign)
- r &= ((Assign) e).Resolve (env);
+ r &= ((Exp) e).Resolve (env, i < n || no_effect);
else
- r &= ((Exp) e).Resolve (env, no_effect);
- else
- ((AST) e).Resolve (env);
+ r &= ((AST) e).Resolve (env);
+ }
return r;
}
internal override void Emit (EmitContext ec)
{
- int i, n = exprs.Count;
+ int i, n = exprs.Count - 1;
AST exp;
for (i = 0; i < n; i++) {
exp = (AST) exprs [i];
exp.Emit (ec);
- CodeGenerator.EmitBox (ec.ig, exp);
+ }
+ if (n >= 0)
+ {
+ exp = (AST) exprs [n];
+ if (exp is Assign) {
+ if (no_effect)
+ exp.Emit (ec);
+ else
+ CodeGenerator.EmitAssignAsExp (ec, exp);
+ }
+ else {
+ exp.Emit (ec);
+ if (!no_effect)
+ CodeGenerator.EmitBox (ec.ig, exp);
+ }
}
}
}
+2007-03-01 Peter Dettman <peter.dettman@iinet.net.au>
+
+ * mjs-most.tests: Enable ecma/Boolean/15.6.3.1-3.js.
+
+ * mjs-most.fail: Delete ecma/String/15.5.5.1.js,
+ ecma/FunctionObjects/15.3.3.1-3.js, ecma/Number/15.7.3.3-2.js,
+ and ecma/Number/15.7.3.5-2.js, as they no longer fail.
+
2006-01-13 Cesar Lopez Nataren <cnataren@novell.com>
* mjs-most.tests: Enable ecma/FunctionObjects/15.3.3.1-2.js,
js1_3/Script/script-001.js
js1_4/Functions/function-001.js
-# System.NotImplementedException: The requested feature is not implemented. (Convert:ToForInObject)
-ecma/String/15.5.5.1.js
-
# System.Exception: error JS5002 A: function expected.
ecma_2/Exceptions/exception-001.js
# Throw NotImplementedException when invoking Convert:ToForInObject
ecma/Array/15.4.3.1-2.js
-
-# Throw NotImplementedException when invoking LateBinding::Delete
-ecma/FunctionObjects/15.3.3.1-3.js
-ecma/Number/15.7.3.3-2.js
-ecma/Number/15.7.3.5-2.jsc
-ecma/Number/15.7.3.5-2.js
ecma/Boolean/15.6.2.js
ecma/Boolean/15.6.3.1-1.js
ecma/Boolean/15.6.3.1-2.js
-# invalid IL
-#ecma/Boolean/15.6.3.1-3.js
+ecma/Boolean/15.6.3.1-3.js
# Invalid IL
#ecma/Boolean/15.6.3.1-4.js
ecma/Boolean/15.6.3.1-5.js