Преглед изворни кода

Remove unnecessary ObjectClass types (#1172)

Marko Lahma пре 3 година
родитељ
комит
85b407823e

+ 3 - 3
Jint/Native/Array/ArrayInstance.cs

@@ -20,7 +20,7 @@ namespace Jint.Native.Array
 
 
         private ObjectChangeFlags _objectChangeFlags;
         private ObjectChangeFlags _objectChangeFlags;
 
 
-        public ArrayInstance(Engine engine, uint capacity = 0) : base(engine, ObjectClass.Array)
+        public ArrayInstance(Engine engine, uint capacity = 0) : base(engine)
         {
         {
             if (capacity > engine.Options.Constraints.MaxArraySize)
             if (capacity > engine.Options.Constraints.MaxArraySize)
             {
             {
@@ -40,7 +40,7 @@ namespace Jint.Native.Array
         /// <summary>
         /// <summary>
         /// Possibility to construct valid array fast, requires that supplied array does not have holes.
         /// Possibility to construct valid array fast, requires that supplied array does not have holes.
         /// </summary>
         /// </summary>
-        public ArrayInstance(Engine engine, PropertyDescriptor[] items) : base(engine, ObjectClass.Array)
+        public ArrayInstance(Engine engine, PropertyDescriptor[] items) : base(engine)
         {
         {
             int length = 0;
             int length = 0;
             if (items == null || items.Length == 0)
             if (items == null || items.Length == 0)
@@ -57,7 +57,7 @@ namespace Jint.Native.Array
             _length = new PropertyDescriptor(length, PropertyFlag.OnlyWritable);
             _length = new PropertyDescriptor(length, PropertyFlag.OnlyWritable);
         }
         }
 
 
-        public ArrayInstance(Engine engine, Dictionary<uint, PropertyDescriptor> items) : base(engine, ObjectClass.Array)
+        public ArrayInstance(Engine engine, Dictionary<uint, PropertyDescriptor> items) : base(engine)
         {
         {
             _sparse = items;
             _sparse = items;
             var length = items?.Count ?? 0;
             var length = items?.Count ?? 0;

+ 1 - 1
Jint/Native/Iterator/IteratorInstance.cs

@@ -19,7 +19,7 @@ namespace Jint.Native.Iterator
 
 
         public IteratorInstance(
         public IteratorInstance(
             Engine engine,
             Engine engine,
-            IEnumerable<JsValue> enumerable) : base(engine, ObjectClass.Iterator)
+            IEnumerable<JsValue> enumerable) : base(engine)
         {
         {
             _enumerable = enumerable.GetEnumerator();
             _enumerable = enumerable.GetEnumerator();
             _prototype = engine.Realm.Intrinsics.IteratorPrototype;
             _prototype = engine.Realm.Intrinsics.IteratorPrototype;

+ 1 - 1
Jint/Native/Json/JsonInstance.cs

@@ -16,7 +16,7 @@ namespace Jint.Native.Json
             Engine engine,
             Engine engine,
             Realm realm,
             Realm realm,
             ObjectPrototype objectPrototype)
             ObjectPrototype objectPrototype)
-            : base(engine, objectClass: ObjectClass.JSON)
+            : base(engine, objectClass: ObjectClass.Object)
         {
         {
             _realm = realm;
             _realm = realm;
             _prototype = objectPrototype;
             _prototype = objectPrototype;

+ 25 - 10
Jint/Native/Json/JsonSerializer.cs

@@ -1,10 +1,12 @@
 using System.Collections.Generic;
 using System.Collections.Generic;
 using Jint.Collections;
 using Jint.Collections;
+using Jint.Native.Array;
 using Jint.Native.BigInt;
 using Jint.Native.BigInt;
 using Jint.Native.Boolean;
 using Jint.Native.Boolean;
 using Jint.Native.Global;
 using Jint.Native.Global;
 using Jint.Native.Number;
 using Jint.Native.Number;
 using Jint.Native.Object;
 using Jint.Native.Object;
+using Jint.Native.Proxy;
 using Jint.Native.String;
 using Jint.Native.String;
 using Jint.Pooling;
 using Jint.Pooling;
 using Jint.Runtime;
 using Jint.Runtime;
@@ -205,21 +207,34 @@ namespace Jint.Native.Json
                 ExceptionHelper.ThrowTypeError(_engine.Realm, "Do not know how to serialize a BigInt");
                 ExceptionHelper.ThrowTypeError(_engine.Realm, "Do not know how to serialize a BigInt");
             }
             }
 
 
-            var isCallable = value.IsObject() && value.IsCallable;
-
-            if (value.IsObject() && isCallable == false)
+            if (value is ObjectInstance { IsCallable: false } objectInstance)
             {
             {
-                return SerializesAsArray(value)
-                    ? SerializeJSONArray(value)
-                    : SerializeJSONObject(value.AsObject());
+                return SerializesAsArray(objectInstance)
+                    ? SerializeJSONArray(objectInstance)
+                    : SerializeJSONObject(objectInstance);
             }
             }
 
 
             return JsValue.Undefined;
             return JsValue.Undefined;
         }
         }
 
 
-        private static bool SerializesAsArray(JsValue value)
+        private static bool SerializesAsArray(ObjectInstance value)
         {
         {
-            return value.AsObject().Class == ObjectClass.Array || value is ObjectWrapper { IsArrayLike: true };
+            if (value is ArrayInstance)
+            {
+                return true;
+            }
+
+            if (value is ProxyInstance proxyInstance && SerializesAsArray(proxyInstance._target))
+            {
+                return true;
+            }
+
+            if (value is ObjectWrapper { IsArrayLike: true })
+            {
+                return true;
+            }
+
+            return false;
         }
         }
 
 
         /// <summary>
         /// <summary>
@@ -275,11 +290,11 @@ namespace Jint.Native.Json
         /// <summary>
         /// <summary>
         /// https://tc39.es/ecma262/#sec-serializejsonarray
         /// https://tc39.es/ecma262/#sec-serializejsonarray
         /// </summary>
         /// </summary>
-        private string SerializeJSONArray(JsValue value)
+        private string SerializeJSONArray(ObjectInstance value)
         {
         {
             _stack.Enter(value);
             _stack.Enter(value);
             var stepback = _indent;
             var stepback = _indent;
-            _indent = _indent + _gap;
+            _indent += _gap;
             var partial = new List<string>();
             var partial = new List<string>();
             var len = TypeConverter.ToUint32(value.Get(CommonProperties.Length, value));
             var len = TypeConverter.ToUint32(value.Get(CommonProperties.Length, value));
             for (int i = 0; i < len; i++)
             for (int i = 0; i < len; i++)

+ 1 - 1
Jint/Native/Math/MathInstance.cs

@@ -13,7 +13,7 @@ namespace Jint.Native.Math
     {
     {
         private Random _random;
         private Random _random;
 
 
-        internal MathInstance(Engine engine, ObjectPrototype objectPrototype) : base(engine, ObjectClass.Math)
+        internal MathInstance(Engine engine, ObjectPrototype objectPrototype) : base(engine)
         {
         {
             _prototype = objectPrototype;
             _prototype = objectPrototype;
         }
         }

+ 2 - 11
Jint/Native/Object/ObjectClass.cs

@@ -3,22 +3,13 @@ namespace Jint.Native.Object
     internal enum ObjectClass : byte
     internal enum ObjectClass : byte
     {
     {
         Arguments,
         Arguments,
-        Array,
         Boolean,
         Boolean,
         Date,
         Date,
         Error,
         Error,
         Function,
         Function,
-        Iterator,
-        JSON,
-        Math,
         Number,
         Number,
         Object,
         Object,
-        Promise,
-        Proxy,
-        Reflect,
         RegExp,
         RegExp,
-        String,
-        Symbol,
-        TypeReference
+        String
     }
     }
-}
+}

+ 24 - 21
Jint/Native/Object/ObjectInstance.cs

@@ -33,7 +33,10 @@ namespace Jint.Native.Object
         {
         {
         }
         }
 
 
-        internal ObjectInstance(Engine engine, ObjectClass objectClass, InternalTypes type = InternalTypes.Object)
+        internal ObjectInstance(
+            Engine engine,
+            ObjectClass objectClass = ObjectClass.Object,
+            InternalTypes type = InternalTypes.Object)
             : base(type)
             : base(type)
         {
         {
             _engine = engine;
             _engine = engine;
@@ -914,26 +917,6 @@ namespace Jint.Native.Object
             object converted = null;
             object converted = null;
             switch (Class)
             switch (Class)
             {
             {
-                case ObjectClass.Array:
-                    if (this is ArrayInstance arrayInstance)
-                    {
-                        var result = new object[arrayInstance.Length];
-                        for (uint i = 0; i < result.Length; i++)
-                        {
-                            var value = arrayInstance[i];
-                            object valueToSet = null;
-                            if (!value.IsUndefined())
-                            {
-                                valueToSet = value is ObjectInstance oi
-                                    ? oi.ToObject(stack)
-                                    : value.ToObject();
-                            }
-                            result[i] = valueToSet;
-                        }
-                        converted = result;
-                    }
-                    break;
-
                 case ObjectClass.String:
                 case ObjectClass.String:
                     if (this is StringInstance stringInstance)
                     if (this is StringInstance stringInstance)
                     {
                     {
@@ -981,6 +964,26 @@ namespace Jint.Native.Object
 
 
                 case ObjectClass.Arguments:
                 case ObjectClass.Arguments:
                 case ObjectClass.Object:
                 case ObjectClass.Object:
+                    
+                    if (this is ArrayInstance arrayInstance)
+                    {
+                        var result = new object[arrayInstance.Length];
+                        for (uint i = 0; i < result.Length; i++)
+                        {
+                            var value = arrayInstance[i];
+                            object valueToSet = null;
+                            if (!value.IsUndefined())
+                            {
+                                valueToSet = value is ObjectInstance oi
+                                    ? oi.ToObject(stack)
+                                    : value.ToObject();
+                            }
+                            result[i] = valueToSet;
+                        }
+                        converted = result;
+                        break;
+                    }
+                    
                     var o = _engine.Options.Interop.CreateClrObject(this);
                     var o = _engine.Options.Interop.CreateClrObject(this);
                     foreach (var p in GetOwnProperties())
                     foreach (var p in GetOwnProperties())
                     {
                     {

+ 2 - 2
Jint/Native/Promise/PromiseInstance.cs

@@ -51,7 +51,7 @@ namespace Jint.Native.Promise
         internal List<PromiseReaction> PromiseRejectReactions = new();
         internal List<PromiseReaction> PromiseRejectReactions = new();
         internal List<PromiseReaction> PromiseFulfillReactions = new();
         internal List<PromiseReaction> PromiseFulfillReactions = new();
 
 
-        internal PromiseInstance(Engine engine) : base(engine, ObjectClass.Promise)
+        internal PromiseInstance(Engine engine) : base(engine)
         {
         {
         }
         }
 
 
@@ -186,4 +186,4 @@ namespace Jint.Native.Promise
             Value = result;
             Value = result;
         }
         }
     }
     }
-}
+}

+ 1 - 1
Jint/Native/Reflect/ReflectInstance.cs

@@ -18,7 +18,7 @@ namespace Jint.Native.Reflect
         internal ReflectInstance(
         internal ReflectInstance(
             Engine engine,
             Engine engine,
             Realm realm,
             Realm realm,
-            ObjectPrototype objectPrototype) : base(engine, ObjectClass.Reflect)
+            ObjectPrototype objectPrototype) : base(engine)
         {
         {
             _realm = realm;
             _realm = realm;
             _prototype = objectPrototype;
             _prototype = objectPrototype;

+ 4 - 2
Jint/Native/Symbol/SymbolInstance.cs

@@ -5,8 +5,10 @@ namespace Jint.Native.Symbol
 {
 {
     public sealed class SymbolInstance : ObjectInstance, IPrimitiveInstance
     public sealed class SymbolInstance : ObjectInstance, IPrimitiveInstance
     {
     {
-        internal SymbolInstance(Engine engine, SymbolPrototype prototype, JsSymbol symbol)
-            : base(engine, ObjectClass.Symbol)
+        internal SymbolInstance(
+            Engine engine,
+            SymbolPrototype prototype,
+            JsSymbol symbol) : base(engine)
         {
         {
             _prototype = prototype;
             _prototype = prototype;
             SymbolData = symbol;
             SymbolData = symbol;

+ 3 - 2
Jint/Runtime/Interop/NamespaceReference.cs

@@ -42,12 +42,13 @@ namespace Jint.Runtime.Interop
                 var genericTypeReference = arguments[i];
                 var genericTypeReference = arguments[i];
                 if (genericTypeReference.IsUndefined()
                 if (genericTypeReference.IsUndefined()
                     || !genericTypeReference.IsObject()
                     || !genericTypeReference.IsObject()
-                    || genericTypeReference.AsObject().Class != ObjectClass.TypeReference)
+                    || genericTypeReference.AsObject() is not TypeReference tr)
                 {
                 {
                     ExceptionHelper.ThrowTypeError(_engine.Realm, "Invalid generic type parameter on " + _path + ", if this is not a generic type / method, are you missing a lookup assembly?");
                     ExceptionHelper.ThrowTypeError(_engine.Realm, "Invalid generic type parameter on " + _path + ", if this is not a generic type / method, are you missing a lookup assembly?");
+                    return default;
                 }
                 }
 
 
-                genericTypes[i] = ((TypeReference) genericTypeReference).ReferenceType;
+                genericTypes[i] = tr.ReferenceType;
             }
             }
 
 
             var typeReference = GetPath(_path + "`" + arguments.Length.ToString(CultureInfo.InvariantCulture)).As<TypeReference>();
             var typeReference = GetPath(_path + "`" + arguments.Length.ToString(CultureInfo.InvariantCulture)).As<TypeReference>();

+ 1 - 1
Jint/Runtime/Interop/TypeReference.cs

@@ -21,7 +21,7 @@ namespace Jint.Runtime.Interop
         private readonly record struct MemberAccessorKey(Type Type, string PropertyName); 
         private readonly record struct MemberAccessorKey(Type Type, string PropertyName); 
         
         
         private TypeReference(Engine engine, Type type)
         private TypeReference(Engine engine, Type type)
-            : base(engine, engine.Realm, _name, FunctionThisMode.Global, ObjectClass.TypeReference)
+            : base(engine, engine.Realm, _name, FunctionThisMode.Global)
         {
         {
             ReferenceType = type;
             ReferenceType = type;