Sebastien Ros 12 gadi atpakaļ
vecāks
revīzija
20fa0475e2

+ 20 - 2
Jint/Engine.cs

@@ -295,7 +295,12 @@ namespace Jint
             return o.Get(reference.GetReferencedName());
         }
 
-        public void SetValue(Reference reference, object value)
+        /// <summary>
+        /// http://www.ecma-international.org/ecma-262/5.1/#sec-8.7.2
+        /// </summary>
+        /// <param name="reference"></param>
+        /// <param name="value"></param>
+        public void PutValue(Reference reference, object value)
         {
             if (reference.IsUnresolvableReference())
             {
@@ -306,7 +311,20 @@ namespace Jint
 
                 Global.Set(reference.GetReferencedName(), value);
             }
-            else 
+            //else if (reference.IsPropertyReference())
+            //{
+            //    if (!reference.HasPrimitiveBase())
+            //    {
+            //        // todo: complete implementation
+            //        throw new NotImplementedException();
+            //    }
+            //    else
+            //    {
+            //        // todo: complete implementation
+            //        throw new NotImplementedException();
+            //    }
+            //} 
+            else
             {
                 var baseValue = reference.GetBase();
                 var record = baseValue as EnvironmentRecord;

+ 1 - 1
Jint/Native/Object/ObjectInstance.cs

@@ -70,7 +70,7 @@ namespace Jint.Native.Object
 
             if (!HasProperty(name))
             {
-                DefineOwnProperty(name, new DataDescriptor(value), false);
+                DefineOwnProperty(name, new DataDescriptor(value) { Configurable = true, Enumerable = true, Writable = true }, false);
             }
             else
             {

+ 71 - 9
Jint/Runtime/ExpressionIntepreter.cs

@@ -45,7 +45,7 @@ namespace Jint.Runtime
                     throw new SyntaxError();
                 }
 
-                _engine.SetValue(lref, rval);
+                _engine.PutValue(lref, rval);
                 return rval;
             }
 
@@ -95,18 +95,62 @@ namespace Jint.Runtime
                     }
                     break;
 
+                case "%=":
+                    switch (type)
+                    {
+                        case TypeCode.Double:
+                            lval = TypeConverter.ToNumber(_engine.GetValue(lref)) % TypeConverter.ToNumber(rval);
+                            break;
+                    }
+                    break;
+
+                case "&=":
+                    switch (type)
+                    {
+                        case TypeCode.Double:
+                            lval = TypeConverter.ToInt32(_engine.GetValue(lref)) & TypeConverter.ToInt32(rval);
+                            break;
+                    }
+                    break;
+
+                case "|=":
+                    switch (type)
+                    {
+                        case TypeCode.Double:
+                            lval = TypeConverter.ToInt32(_engine.GetValue(lref)) | TypeConverter.ToInt32(rval);
+                            break;
+                    }
+                    break;
+
+                case "^=":
+                    switch (type)
+                    {
+                        case TypeCode.Double:
+                            lval = TypeConverter.ToInt32(_engine.GetValue(lref)) ^ TypeConverter.ToInt32(rval);
+                            break;
+                    }
+                    break;
+
                 case "<<=":
                     switch (type)
                     {
                         case TypeCode.Double:
-                            lval = TypeConverter.ToInt32(_engine.GetValue(lref)) << TypeConverter.ToInt32(rval);
+                            lval = TypeConverter.ToInt32(_engine.GetValue(lref)) << (int)(TypeConverter.ToUint32(rval) & 0x1F);
                             break;
                     }
                     break;
 
+                case ">>>=":
+                    switch (type)
+                    {
+                        case TypeCode.Double:
+                            lval = (uint)TypeConverter.ToInt32(_engine.GetValue(lref)) >> (int)(TypeConverter.ToUint32(rval) & 0x1F);
+                            break;
+                    }
+                    break;
             }
 
-            _engine.SetValue(lref, lval);
+            _engine.PutValue(lref, lval);
 
             return lval;
         }
@@ -132,6 +176,7 @@ namespace Jint.Runtime
                             break;
                     }
                     break;
+                
                 case "-":
                     switch (type)
                     {
@@ -140,6 +185,7 @@ namespace Jint.Runtime
                             break;
                     }
                     break;
+                
                 case "*":
                     switch (type)
                     {
@@ -148,6 +194,7 @@ namespace Jint.Runtime
                             break;
                     }
                     break;
+                
                 case "/":
                     switch (type)
                     {
@@ -156,12 +203,23 @@ namespace Jint.Runtime
                             break;
                     }
                     break;
+
+                case "%":
+                    switch (type)
+                    {
+                        case TypeCode.Double:
+                            value = TypeConverter.ToNumber(left) % TypeConverter.ToNumber(right);
+                            break;
+                    }
+                    break;
                 case "==":
                     value = left.Equals(right);
                     break;
+                
                 case "!=":
                     value = !left.Equals(right);
                     break;
+                
                 case ">":
                     switch (type)
                     {
@@ -179,6 +237,7 @@ namespace Jint.Runtime
                             break;
                     }
                     break;
+                
                 case "<":
                     switch (type)
                     {
@@ -187,6 +246,7 @@ namespace Jint.Runtime
                             break;
                     }
                     break;
+                
                 case "<=":
                     switch (type)
                     {
@@ -195,9 +255,10 @@ namespace Jint.Runtime
                             break;
                     }
                     break;
+                
                 case "===":
                     return StriclyEqual(left, right);
-
+                
                 case "!==":
                     return !StriclyEqual(left, right);
 
@@ -223,8 +284,9 @@ namespace Jint.Runtime
                     var f = (FunctionInstance)right;
                     value = f.HasInstance(left);
                     break;
+                
                 default:
-                    throw new NotImplementedException("");
+                    throw new NotImplementedException();
             }
 
             return value;
@@ -381,7 +443,7 @@ namespace Jint.Runtime
                     throw new ArgumentException();
             }
 
-            _engine.SetValue(r, value);
+            _engine.PutValue(r, value);
 
             return updateExpression.Prefix ? value : old;
         }
@@ -436,7 +498,7 @@ namespace Jint.Runtime
 
                     var oldValue = _engine.GetValue(value);
                     var newValue = TypeConverter.ToNumber(value) + 1;
-                    _engine.SetValue(r, newValue);
+                    _engine.PutValue(r, newValue);
 
                     return unaryExpression.Prefix ? newValue : oldValue;
                     
@@ -452,7 +514,7 @@ namespace Jint.Runtime
 
                     oldValue = _engine.GetValue(value);
                     newValue = TypeConverter.ToNumber(value) - 1;
-                    _engine.SetValue(r, newValue);
+                    _engine.PutValue(r, newValue);
 
                     return unaryExpression.Prefix ? newValue : oldValue;
                     
@@ -487,7 +549,7 @@ namespace Jint.Runtime
                     if (r.IsPropertyReference())
                     {
                         var o = TypeConverter.ToObject(_engine, r.GetBase());
-                        o.Delete(r.GetReferencedName(), r.IsStrict());
+                        return o.Delete(r.GetReferencedName(), r.IsStrict());
                     }
                     if (r.IsStrict())
                     {

+ 2 - 2
Jint/Runtime/StatementInterpreter.cs

@@ -220,12 +220,12 @@ namespace Jint.Runtime
                 if (varName != null)
                 {
                     var varRef = varName as Reference;
-                    _engine.SetValue(varRef, p);
+                    _engine.PutValue(varRef, p);
                 }
                 else
                 {
                     var lhsRef = _engine.EvaluateExpression(forInStatement.Left.As<Expression>()) as Reference;
-                    _engine.SetValue(lhsRef, p);
+                    _engine.PutValue(lhsRef, p);
                 }
                 var stmt = ExecuteStatement(forInStatement.Body);
                 if (stmt.Value != null)