Browse Source

Completing strict code management

Sebastien Ros 12 years ago
parent
commit
efab9cfc8b

+ 1 - 0
Jint.Tests.Ecma/Ecma/8.1.cs

@@ -2,6 +2,7 @@ using Xunit;
 
 namespace Jint.Tests.Ecma
 {
+    [Trait("Category", "Pass")]
     public class Test_8_1 : EcmaTest
     {
         [Fact]

+ 1 - 0
Jint.Tests.Ecma/Ecma/8.12.1.cs

@@ -2,6 +2,7 @@ using Xunit;
 
 namespace Jint.Tests.Ecma
 {
+    [Trait("Category", "Pass")]
     public class Test_8_12_1 : EcmaTest
     {
         [Fact]

+ 1 - 0
Jint.Tests.Ecma/Ecma/8.12.3.cs

@@ -2,6 +2,7 @@ using Xunit;
 
 namespace Jint.Tests.Ecma
 {
+    [Trait("Category", "Pass")]
     public class Test_8_12_3 : EcmaTest
     {
         [Fact]

+ 1 - 0
Jint.Tests.Ecma/Ecma/8.12.4.cs

@@ -2,6 +2,7 @@ using Xunit;
 
 namespace Jint.Tests.Ecma
 {
+    [Trait("Category", "Pass")]
     public class Test_8_12_4 : EcmaTest
     {
         [Fact]

+ 1 - 0
Jint.Tests.Ecma/Ecma/8.12.5.cs

@@ -2,6 +2,7 @@ using Xunit;
 
 namespace Jint.Tests.Ecma
 {
+    [Trait("Category", "Pass")]
     public class Test_8_12_5 : EcmaTest
     {
         [Fact]

+ 1 - 0
Jint.Tests.Ecma/Ecma/8.12.6.cs

@@ -2,6 +2,7 @@ using Xunit;
 
 namespace Jint.Tests.Ecma
 {
+    [Trait("Category", "Pass")]
     public class Test_8_12_6 : EcmaTest
     {
         [Fact]

+ 1 - 0
Jint.Tests.Ecma/Ecma/8.12.7.cs

@@ -2,6 +2,7 @@ using Xunit;
 
 namespace Jint.Tests.Ecma
 {
+    [Trait("Category", "Pass")]
     public class Test_8_12_7 : EcmaTest
     {
         [Fact]

+ 1 - 0
Jint.Tests.Ecma/Ecma/8.12.8.cs

@@ -2,6 +2,7 @@ using Xunit;
 
 namespace Jint.Tests.Ecma
 {
+    [Trait("Category", "Pass")]
     public class Test_8_12_8 : EcmaTest
     {
         [Fact]

+ 1 - 0
Jint.Tests.Ecma/Ecma/8.12.9.cs

@@ -2,6 +2,7 @@ using Xunit;
 
 namespace Jint.Tests.Ecma
 {
+    [Trait("Category", "Pass")]
     public class Test_8_12_9 : EcmaTest
     {
         [Fact]

+ 1 - 0
Jint.Tests.Ecma/Ecma/8.14.4.cs

@@ -2,6 +2,7 @@ using Xunit;
 
 namespace Jint.Tests.Ecma
 {
+    [Trait("Category", "Pass")]
     public class Test_8_14_4 : EcmaTest
     {
         [Fact]

+ 1 - 0
Jint.Tests.Ecma/Ecma/8.2.cs

@@ -2,6 +2,7 @@ using Xunit;
 
 namespace Jint.Tests.Ecma
 {
+    [Trait("Category", "Pass")]
     public class Test_8_2 : EcmaTest
     {
         [Fact]

+ 1 - 0
Jint.Tests.Ecma/Ecma/8.3.cs

@@ -2,6 +2,7 @@ using Xunit;
 
 namespace Jint.Tests.Ecma
 {
+    [Trait("Category", "Pass")]
     public class Test_8_3 : EcmaTest
     {
         [Fact]

+ 1 - 0
Jint.Tests.Ecma/Ecma/8.4.cs

@@ -2,6 +2,7 @@ using Xunit;
 
 namespace Jint.Tests.Ecma
 {
+    [Trait("Category", "Pass")]
     public class Test_8_4 : EcmaTest
     {
         [Fact]

+ 1 - 0
Jint.Tests.Ecma/Ecma/8.5.cs

@@ -2,6 +2,7 @@ using Xunit;
 
 namespace Jint.Tests.Ecma
 {
+    [Trait("Category", "Pass")]
     public class Test_8_5 : EcmaTest
     {
         [Fact]

+ 1 - 0
Jint.Tests.Ecma/Ecma/8.6.1.cs

@@ -2,6 +2,7 @@ using Xunit;
 
 namespace Jint.Tests.Ecma
 {
+    [Trait("Category", "Pass")]
     public class Test_8_6_1 : EcmaTest
     {
         [Fact]

+ 1 - 0
Jint.Tests.Ecma/Ecma/8.6.2.cs

@@ -2,6 +2,7 @@ using Xunit;
 
 namespace Jint.Tests.Ecma
 {
+    [Trait("Category", "Pass")]
     public class Test_8_6_2 : EcmaTest
     {
         [Fact]

+ 1 - 0
Jint.Tests.Ecma/Ecma/8.6.cs

@@ -2,6 +2,7 @@ using Xunit;
 
 namespace Jint.Tests.Ecma
 {
+    [Trait("Category", "Pass")]
     public class Test_8_6 : EcmaTest
     {
         [Fact]

+ 1 - 0
Jint.Tests.Ecma/Ecma/8.7.1.cs

@@ -2,6 +2,7 @@ using Xunit;
 
 namespace Jint.Tests.Ecma
 {
+    [Trait("Category", "Pass")]
     public class Test_8_7_1 : EcmaTest
     {
         [Fact]

+ 1 - 0
Jint.Tests.Ecma/Ecma/8.7.2.cs

@@ -2,6 +2,7 @@ using Xunit;
 
 namespace Jint.Tests.Ecma
 {
+    [Trait("Category", "Pass")]
     public class Test_8_7_2 : EcmaTest
     {
         [Fact]

+ 1 - 0
Jint.Tests.Ecma/Ecma/8.7.cs

@@ -2,6 +2,7 @@ using Xunit;
 
 namespace Jint.Tests.Ecma
 {
+    [Trait("Category", "Pass")]
     public class Test_8_7 : EcmaTest
     {
         [Fact]

+ 1 - 0
Jint.Tests.Ecma/Ecma/8.8.cs

@@ -2,6 +2,7 @@ using Xunit;
 
 namespace Jint.Tests.Ecma
 {
+    [Trait("Category", "Pass")]
     public class Test_8_8 : EcmaTest
     {
         [Fact]

+ 12 - 10
Jint/Native/Function/EvalFunctionInstance.cs

@@ -16,28 +16,30 @@ namespace Jint.Native.Function
 
         public override object Call(object thisObject, object[] arguments)
         {
-            if (StrictModeScope.IsStrictModeCode)
-            {
-                throw new JavaScriptException(Engine.SyntaxError, "eval() is not allowed in strict mode.");
-            }
-
             var code = TypeConverter.ToString(arguments.At(0));
 
-            var parser = new JavaScriptParser();
             try
             {
+                var parser = new JavaScriptParser(StrictModeScope.IsStrictModeCode);
                 var program = parser.Parse(code);
                 using (new StrictModeScope(program.Strict))
                 {
-                    return _engine.ExecuteStatement(program).Value ?? Undefined.Instance;
+                    var result = _engine.ExecuteStatement(program);
+
+                    if (result.Type == Completion.Throw)
+                    {
+                        throw new JavaScriptException(result.Value);
+                    }
+                    else
+                    {
+                        return result.Value ?? Undefined.Instance;
+                    }
                 }
             }
-            catch (ParserError e)
+            catch (ParserError)
             {
                 throw new JavaScriptException(Engine.SyntaxError);
             }
-
-            
         }
     }
 }

+ 12 - 2
Jint/Parser/JavascriptParser.cs

@@ -57,7 +57,18 @@ namespace Jint.Parser
         private bool _strict;
 
         private readonly Stack<IVariableScope> _variableScopes = new Stack<IVariableScope>();
-        private readonly Stack<IFunctionScope> _functionScopes = new Stack<IFunctionScope>(); 
+        private readonly Stack<IFunctionScope> _functionScopes = new Stack<IFunctionScope>();
+
+
+        public JavaScriptParser()
+        {
+            
+        }
+
+        public JavaScriptParser(bool strict)
+        {
+            _strict = strict;
+        }
 
         private static bool IsDecimalDigit(char ch)
         {
@@ -3835,7 +3846,6 @@ namespace Jint.Parser
             
             SkipComment();
             MarkStart();
-            _strict = false;
             Peek();
             ICollection<Statement> body = ParseSourceElements();
             return MarkEnd(CreateProgram(body, _strict));

+ 29 - 19
Jint/Runtime/Descriptors/PropertyDescriptor.cs

@@ -79,34 +79,44 @@ namespace Jint.Runtime.Descriptors
             bool? enumerable = obj.HasProperty("enumerable") ? TypeConverter.ToBoolean(obj.Get("enumerable")) : default(bool?);
             bool? configurable = obj.HasProperty("configurable") ? TypeConverter.ToBoolean(obj.Get("configurable")) : default(bool?);
 
+            PropertyDescriptor desc = new DataDescriptor(Native.Undefined.Instance) { Configurable = configurable, Enumerable = enumerable, Writable = writable };
+
             if (obj.HasProperty("value"))
             {
                 var value = obj.Get("value");
-                return new DataDescriptor(value) { Configurable = configurable, Enumerable = enumerable, Writable = writable};
+                desc = new DataDescriptor(value) { Configurable = configurable, Enumerable = enumerable, Writable = writable};
             }
-            else
+
+            object getter = null, setter = null;
+            if (obj.HasProperty("get"))
             {
-                object getter = null, setter = null;
-                if (obj.HasProperty("get"))
+                getter = obj.Get("get");
+                if (getter != Native.Undefined.Instance && !(getter is ICallable))
                 {
-                    getter = obj.Get("get");
-                    if (getter != Native.Undefined.Instance && !(getter is ICallable))
-                    {
-                        throw new JavaScriptException(engine.TypeError);
-                    }
+                    throw new JavaScriptException(engine.TypeError);
                 }
+            }
 
-                if (obj.HasProperty("set"))
+            if (obj.HasProperty("set"))
+            {
+                setter = obj.Get("set");
+                if (setter != Native.Undefined.Instance && !(setter is ICallable))
                 {
-                    setter = obj.Get("set");
-                    if (setter != Native.Undefined.Instance && !(setter is ICallable))
-                    {
-                        throw new JavaScriptException(engine.TypeError);
-                    }
+                    throw new JavaScriptException(engine.TypeError);
                 }
+            }
 
-                return new AccessorDescriptor(getter as ICallable, setter as ICallable) { Configurable = configurable, Enumerable = enumerable };
+            if (getter != null || setter != null)
+            {
+                if (obj.HasProperty("value") || writable != null)
+                {
+                    throw new JavaScriptException(engine.TypeError);
+                }
+
+                desc = new AccessorDescriptor(getter as ICallable, setter as ICallable) { Configurable = configurable, Enumerable = enumerable };
             }
+
+            return desc;
         }
 
         public static object FromPropertyDescriptor(Engine engine, PropertyDescriptor desc)
@@ -122,7 +132,7 @@ namespace Jint.Runtime.Descriptors
             {
                 var datadesc = desc.As<DataDescriptor>();
                 obj.DefineOwnProperty("value", new DataDescriptor(datadesc.Value) { Writable = true, Enumerable = true, Configurable = true }, false);
-                obj.DefineOwnProperty("writable", new DataDescriptor(datadesc.Writable) { Writable = true, Enumerable = true, Configurable = true }, false);
+                obj.DefineOwnProperty("writable", new DataDescriptor(datadesc.WritableIsSet) { Writable = true, Enumerable = true, Configurable = true }, false);
             }
             else
             {
@@ -131,8 +141,8 @@ namespace Jint.Runtime.Descriptors
                 obj.DefineOwnProperty("set", new DataDescriptor(accdesc.Set ?? Native.Undefined.Instance) { Writable = true, Enumerable = true, Configurable = true }, false);
             }
 
-            obj.DefineOwnProperty("enumerable", new DataDescriptor(desc.Enumerable) { Writable = true, Enumerable = true, Configurable = true }, false);
-            obj.DefineOwnProperty("configurable", new DataDescriptor(desc.Configurable) { Writable = true, Enumerable = true, Configurable = true }, false);
+            obj.DefineOwnProperty("enumerable", new DataDescriptor(desc.EnumerableIsSet) { Writable = true, Enumerable = true, Configurable = true }, false);
+            obj.DefineOwnProperty("configurable", new DataDescriptor(desc.ConfigurableIsSet) { Writable = true, Enumerable = true, Configurable = true }, false);
 
             return obj;
         }