浏览代码

Unify and cleanup API (#1355)

Marko Lahma 2 年之前
父节点
当前提交
ec25ac3a66
共有 100 个文件被更改,包括 1168 次插入1227 次删除
  1. 2 3
      Jint.Benchmark/UncacheableExpressionsBenchmark.cs
  2. 2 2
      Jint.Repl/Program.cs
  3. 1 1
      Jint.Tests.PublicInterface/JavaScriptExceptionTests.cs
  4. 6 8
      Jint.Tests.PublicInterface/RavenApiUsageTests.cs
  5. 2 2
      Jint.Tests/Runtime/ArrayTests.cs
  6. 1 1
      Jint.Tests/Runtime/FunctionTests.cs
  7. 2 3
      Jint.Tests/Runtime/InteropTests.NewtonsoftJson.cs
  8. 1 1
      Jint.Tests/Runtime/InteropTests.cs
  9. 5 8
      Jint.Tests/Runtime/JsValueConversionTests.cs
  10. 9 9
      Jint.Tests/Runtime/NullPropagation.cs
  11. 2 3
      Jint.Tests/Runtime/ObjectInstanceTests.cs
  12. 7 7
      Jint.Tests/Runtime/PromiseTests.cs
  13. 1 2
      Jint.Tests/Runtime/WeakSetMapTests.cs
  14. 0 47
      Jint/Engine.Obsolete.cs
  15. 1 1
      Jint/Engine.cs
  16. 5 7
      Jint/JsValueExtensions.cs
  17. 1 1
      Jint/Native/AggregateError/AggregateErrorConstructor.cs
  18. 19 19
      Jint/Native/Array/ArrayConstructor.cs
  19. 5 19
      Jint/Native/Array/ArrayInstance.cs
  20. 3 3
      Jint/Native/Array/ArrayOperations.cs
  21. 8 8
      Jint/Native/Array/ArrayPrototype.cs
  22. 3 3
      Jint/Native/ArrayBuffer/ArrayBufferConstructor.cs
  23. 1 1
      Jint/Native/ArrayBuffer/ArrayBufferInstance.cs
  24. 6 7
      Jint/Native/ArrayBuffer/ArrayBufferOrder.cs
  25. 1 1
      Jint/Native/ArrayBuffer/ArrayBufferPrototype.cs
  26. 1 1
      Jint/Native/BigInt/BigIntConstructor.cs
  27. 1 1
      Jint/Native/BigInt/BigIntInstance.cs
  28. 1 1
      Jint/Native/BigInt/BigIntPrototype.cs
  29. 1 1
      Jint/Native/Boolean/BooleanConstructor.cs
  30. 10 11
      Jint/Native/Boolean/BooleanInstance.cs
  31. 1 1
      Jint/Native/Boolean/BooleanPrototype.cs
  32. 1 1
      Jint/Native/DataView/DataViewConstructor.cs
  33. 11 12
      Jint/Native/DataView/DataViewInstance.cs
  34. 1 1
      Jint/Native/DataView/DataViewPrototype.cs
  35. 9 9
      Jint/Native/Date/DateConstructor.cs
  36. 19 19
      Jint/Native/Date/DatePrototype.cs
  37. 6 5
      Jint/Native/DateInstance.cs
  38. 2 2
      Jint/Native/Error/ErrorConstructor.cs
  39. 8 1
      Jint/Native/Error/ErrorInstance.cs
  40. 1 1
      Jint/Native/Error/ErrorPrototype.cs
  41. 1 1
      Jint/Native/Function/ClassDefinition.cs
  42. 1 1
      Jint/Native/Function/EvalFunctionInstance.cs
  43. 1 1
      Jint/Native/Function/FunctionConstructor.cs
  44. 1 1
      Jint/Native/Function/FunctionPrototype.cs
  45. 1 1
      Jint/Native/Function/ScriptFunctionInstance.cs
  46. 1 1
      Jint/Native/Function/ThrowTypeError.cs
  47. 1 1
      Jint/Native/Global/GlobalObject.cs
  48. 4 5
      Jint/Native/ICallable.cs
  49. 4 5
      Jint/Native/IConstructor.cs
  50. 5 6
      Jint/Native/IPrimitiveInstance.cs
  51. 33 0
      Jint/Native/JsArray.cs
  52. 43 44
      Jint/Native/JsBoolean.cs
  53. 24 25
      Jint/Native/JsNull.cs
  54. 207 214
      Jint/Native/JsNumber.cs
  55. 14 0
      Jint/Native/JsObject.cs
  56. 268 270
      Jint/Native/JsString.cs
  57. 38 42
      Jint/Native/JsSymbol.cs
  58. 24 25
      Jint/Native/JsUndefined.cs
  59. 6 6
      Jint/Native/Json/JsonParser.cs
  60. 6 7
      Jint/Native/Json/JsonSerializer.cs
  61. 1 1
      Jint/Native/Map/MapConstructor.cs
  62. 1 1
      Jint/Native/Map/MapInstance.cs
  63. 1 1
      Jint/Native/Map/MapPrototype.cs
  64. 1 1
      Jint/Native/Math/MathInstance.cs
  65. 0 8
      Jint/Native/Null.cs
  66. 1 1
      Jint/Native/Number/NumberConstructor.cs
  67. 21 22
      Jint/Native/Number/NumberInstance.cs
  68. 1 1
      Jint/Native/Number/NumberPrototype.cs
  69. 3 3
      Jint/Native/Object/ObjectConstructor.cs
  70. 11 8
      Jint/Native/Object/ObjectInstance.cs
  71. 2 2
      Jint/Native/Object/ObjectPrototype.cs
  72. 1 1
      Jint/Native/Promise/PromiseConstructor.cs
  73. 133 134
      Jint/Native/Promise/PromiseInstance.cs
  74. 7 8
      Jint/Native/Prototype.cs
  75. 1 1
      Jint/Native/Proxy/ProxyConstructor.cs
  76. 1 1
      Jint/Native/Proxy/ProxyInstance.cs
  77. 1 1
      Jint/Native/Reflect/ReflectInstance.cs
  78. 2 2
      Jint/Native/RegExp/RegExpConstructor.cs
  79. 4 5
      Jint/Native/RegExp/RegExpPrototype.cs
  80. 1 1
      Jint/Native/Set/SetConstructor.cs
  81. 1 1
      Jint/Native/Set/SetInstance.cs
  82. 1 1
      Jint/Native/ShadowRealm/ShadowRealmConstructor.cs
  83. 1 1
      Jint/Native/ShadowRealm/ShadowRealmInstance.cs
  84. 1 1
      Jint/Native/String/StringConstructor.cs
  85. 88 89
      Jint/Native/String/StringInstance.cs
  86. 6 6
      Jint/Native/String/StringPrototype.cs
  87. 1 1
      Jint/Native/Symbol/SymbolConstructor.cs
  88. 13 14
      Jint/Native/Symbol/SymbolInstance.cs
  89. 1 1
      Jint/Native/Symbol/SymbolPrototype.cs
  90. 1 1
      Jint/Native/TypedArray/TypedArrayConstructor.cs
  91. 2 2
      Jint/Native/TypedArray/TypedArrayInstance.cs
  92. 1 1
      Jint/Native/TypedArray/TypedArrayPrototype.cs
  93. 0 8
      Jint/Native/Undefined.cs
  94. 1 1
      Jint/Native/WeakMap/WeakMapConstructor.cs
  95. 1 1
      Jint/Native/WeakMap/WeakMapInstance.cs
  96. 1 1
      Jint/Native/WeakMap/WeakMapPrototype.cs
  97. 1 1
      Jint/Native/WeakSet/WeakSetConstructor.cs
  98. 1 1
      Jint/Native/WeakSet/WeakSetInstance.cs
  99. 1 1
      Jint/Native/WeakSet/WeakSetPrototype.cs
  100. 1 1
      Jint/Runtime/Arguments.cs

+ 2 - 3
Jint.Benchmark/UncacheableExpressionsBenchmark.cs

@@ -2,7 +2,6 @@
 using BenchmarkDotNet.Attributes;
 using Jint.Native;
 using Newtonsoft.Json;
-using Undefined = Jint.Native.Undefined;
 
 namespace Jint.Benchmark;
 
@@ -99,7 +98,7 @@ function output(d) {
         var call = engine.GetValue("output").TryCast<ICallable>();
         for (int i = 0; i < N; ++i)
         {
-            call.Call(Undefined.Instance, targetJsObject);
+            call.Call(JsValue.Undefined, targetJsObject);
         }
     }
 
@@ -110,4 +109,4 @@ function output(d) {
         engine.Execute(targetObject);
         targetJsObject = new[] {engine.GetValue("d")};
     }
-}
+}

+ 2 - 2
Jint.Repl/Program.cs

@@ -68,14 +68,14 @@ namespace Jint.Repl
                     var result = engine.Evaluate(input, parserOptions);
                     if (!result.IsPrimitive() && result is not IPrimitiveInstance)
                     {
-                        var str = serializer.Serialize(result, Undefined.Instance, "  ");
+                        var str = serializer.Serialize(result, JsValue.Undefined, "  ");
                         Console.WriteLine(str);
                     }
                     else
                     {
                         if (result.IsString())
                         {
-                            Console.WriteLine(serializer.Serialize(result, Undefined.Instance, Undefined.Instance));
+                            Console.WriteLine(serializer.Serialize(result, JsValue.Undefined, JsValue.Undefined));
                         }
                         else
                         {

+ 1 - 1
Jint.Tests.PublicInterface/JavaScriptExceptionTests.cs

@@ -27,7 +27,7 @@ namespace Jint.Tests.PublicInterface
             });
 
             var result1 = engine.Evaluate(@"try { throw1() } catch (e) { return e; }");
-            var error1 = Assert.IsType<ErrorInstance>(result1);
+            var error1 = Assert.IsType<JsError>(result1);
             Assert.Equal("message 1", error1.Get("message").ToString());
 
             var result2 = engine.Evaluate(@"try { throw2() } catch (e) { return e; }");

+ 6 - 8
Jint.Tests.PublicInterface/RavenApiUsageTests.cs

@@ -1,10 +1,8 @@
+using System.Diagnostics;
 using Esprima.Ast;
 using Jint.Constraints;
 using Jint.Native;
-using Jint.Native.Array;
-using Jint.Native.Date;
 using Jint.Native.Function;
-using Jint.Native.Object;
 using Jint.Runtime.Descriptors;
 using Jint.Runtime.Interop;
 
@@ -68,7 +66,7 @@ public class RavenApiUsageTests
         };
 
         var engine = new Engine();
-        var array = new ArrayInstance(engine, descriptors);
+        var array = new JsArray(engine, descriptors);
         Assert.Equal(1L, array.Length);
         Assert.Equal(42, array[0]);
     }
@@ -86,18 +84,18 @@ public class RavenApiUsageTests
     public void CanInjectConstructedObjects()
     {
         var engine = new Engine();
-        var obj = new ObjectInstance(engine);
+        var obj = new JsObject(engine);
         obj.FastSetDataProperty("name", "test");
 
-        var emptyArray = new ArrayInstance(engine);
+        var emptyArray = new JsArray(engine);
 
-        var array = new ArrayInstance(engine, new object[]
+        var array = new JsArray(engine, new object[]
         {
             JsNumber.Create(1),
             JsNumber.Create(2),
             JsNumber.Create(3)
         });
-        var date = new DateInstance(engine, new DateTime(2022, 10, 20));
+        var date = new JsDate(engine, new DateTime(2022, 10, 20));
 
         engine.SetValue("obj", obj);
         engine.SetValue("emptyArray", emptyArray);

+ 2 - 2
Jint.Tests/Runtime/ArrayTests.cs

@@ -1,4 +1,4 @@
-using Jint.Native.Array;
+using Jint.Native;
 
 namespace Jint.Tests.Runtime;
 
@@ -62,7 +62,7 @@ public class ArrayTests
     public void ArrayLengthFromInitialState()
     {
         var engine = new Engine();
-        var array = new ArrayInstance(engine);
+        var array = new JsArray(engine);
         var length = (int) array.Length;
         Assert.Equal(0, length);
     }

+ 1 - 1
Jint.Tests/Runtime/FunctionTests.cs

@@ -85,7 +85,7 @@ assertEqual(booleanCount, 1);
         engine
             .SetValue("testFunction", new ClrFunctionInstance(engine, "testFunction", (thisValue, args) =>
             {
-                return engine.Invoke(thisValue, "then", new[] { Undefined.Instance, args.At(0) });
+                return engine.Invoke(thisValue, "then", new[] { JsValue.Undefined, args.At(0) });
             }))
             .SetValue("assertEqual", new Action<object, object>((a, b) => Assert.Equal(b, a)))
             .Execute(Script);

+ 2 - 3
Jint.Tests/Runtime/InteropTests.NewtonsoftJson.cs

@@ -1,5 +1,4 @@
 using Jint.Native;
-using Jint.Native.Date;
 using Jint.Runtime;
 using Newtonsoft.Json.Linq;
 
@@ -61,7 +60,7 @@ namespace Jint.Tests.Runtime
             var obj = JObject.Parse(json);
             engine.SetValue("o", obj);
             var value = engine.Evaluate("o.Properties.expirationDate.Value");
-            var dateInstance = Assert.IsAssignableFrom<DateInstance>(value);
+            var dateInstance = Assert.IsAssignableFrom<JsDate>(value);
             Assert.Equal(DateTime.Parse("2021-10-09T00:00:00Z").ToUniversalTime(), dateInstance.ToDateTime());
         }
 
@@ -103,7 +102,7 @@ namespace Jint.Tests.Runtime
 
             Assert.Equal("[{\"Text\":\"Text1\",\"Value\":1},{\"Text\":\"Text2\",\"Value\":2,\"Null\":null,\"Date\":\"2015-06-25T00:00:00.000Z\"}]", result);
         }
-        
+
         [Fact]
         public void DecimalsShouldBeHandledFromJObjects()
         {

+ 1 - 1
Jint.Tests/Runtime/InteropTests.cs

@@ -623,7 +623,7 @@ namespace Jint.Tests.Runtime
         [Fact]
         public void PocosCanReturnObjectInstanceDirectly()
         {
-            var x = new ObjectInstance(_engine);
+            var x = new JsObject(_engine);
             x.Set("foo", new JsString("bar"));
 
             var o = new

+ 5 - 8
Jint.Tests/Runtime/JsValueConversionTests.cs

@@ -1,7 +1,4 @@
 using Jint.Native;
-using Jint.Native.Array;
-using Jint.Native.Date;
-using Jint.Native.Object;
 using Jint.Native.RegExp;
 
 namespace Jint.Tests.Runtime
@@ -18,7 +15,7 @@ namespace Jint.Tests.Runtime
         [Fact]
         public void ShouldBeAnArray()
         {
-            var value = new ArrayInstance(_engine);
+            var value = new JsArray(_engine);
             Assert.Equal(false, value.IsBoolean());
             Assert.Equal(true, value.IsArray());
             Assert.Equal(false, value.IsDate());
@@ -54,7 +51,7 @@ namespace Jint.Tests.Runtime
         [Fact]
         public void ShouldBeADate()
         {
-            var value = new DateInstance(_engine, double.NaN);
+            var value = new JsDate(_engine, double.NaN);
             Assert.Equal(false, value.IsBoolean());
             Assert.Equal(false, value.IsArray());
             Assert.Equal(true, value.IsDate());
@@ -72,7 +69,7 @@ namespace Jint.Tests.Runtime
         [Fact]
         public void ShouldBeNull()
         {
-            var value = Null.Instance;
+            var value = JsValue.Null;
             Assert.Equal(false, value.IsBoolean());
             Assert.Equal(false, value.IsArray());
             Assert.Equal(false, value.IsDate());
@@ -105,7 +102,7 @@ namespace Jint.Tests.Runtime
         [Fact]
         public void ShouldBeAnObject()
         {
-            var value = new ObjectInstance(_engine);
+            var value = new JsObject(_engine);
             Assert.Equal(false, value.IsBoolean());
             Assert.Equal(false, value.IsArray());
             Assert.Equal(false, value.IsDate());
@@ -156,7 +153,7 @@ namespace Jint.Tests.Runtime
         [Fact]
         public void ShouldBeUndefined()
         {
-            var value = Undefined.Instance;
+            var value = JsValue.Undefined;
             Assert.Equal(false, value.IsBoolean());
             Assert.Equal(false, value.IsArray());
             Assert.Equal(false, value.IsDate());

+ 9 - 9
Jint.Tests/Runtime/NullPropagation.cs

@@ -87,12 +87,12 @@ var output = {
             var length = engine.GetValue("length");
             var output = engine.GetValue("output").AsObject();
 
-            Assert.Equal(Null.Instance, address);
-            Assert.Equal(Null.Instance, city);
-            Assert.Equal(Null.Instance, length);
+            Assert.Equal(JsValue.Null, address);
+            Assert.Equal(JsValue.Null, city);
+            Assert.Equal(JsValue.Null, length);
 
-            Assert.Equal(Null.Instance, output.Get("Count1"));
-            Assert.Equal(Undefined.Instance, output.Get("Count2"));
+            Assert.Equal(JsValue.Null, output.Get("Count1"));
+            Assert.Equal(JsValue.Undefined, output.Get("Count2"));
         }
 
         [Fact]
@@ -111,13 +111,13 @@ function test2(arg) {
 }
 ";
             engine.Execute(Script);
-            var result = engine.Invoke("test", Null.Instance);
+            var result = engine.Invoke("test", JsValue.Null);
 
-            Assert.Equal(Null.Instance, result);
+            Assert.Equal(JsValue.Null, result);
 
-            result = engine.Invoke("test2", Null.Instance);
+            result = engine.Invoke("test2", JsValue.Null);
 
-            Assert.Equal(Null.Instance, result);
+            Assert.Equal(JsValue.Null, result);
         }
 
         [Fact]

+ 2 - 3
Jint.Tests/Runtime/ObjectInstanceTests.cs

@@ -1,5 +1,4 @@
 using Jint.Native;
-using Jint.Native.Object;
 
 namespace Jint.Tests.Runtime
 {
@@ -9,7 +8,7 @@ namespace Jint.Tests.Runtime
         public void RemovingFirstPropertyFromObjectInstancePropertiesBucketAndEnumerating()
         {
             var engine = new Engine();
-            var instance = new ObjectInstance(engine);
+            var instance = new JsObject(engine);
             instance.FastSetDataProperty("bare", JsValue.Null);
             instance.FastSetDataProperty("scope", JsValue.Null);
             instance.RemoveOwnProperty("bare");
@@ -44,7 +43,7 @@ namespace Jint.Tests.Runtime
         public void ShouldHavePrototypeInPlaceByDefault()
         {
             var engine = new Engine();
-            var instance = new ObjectInstance(engine);
+            var instance = new JsObject(engine);
             Assert.NotNull(instance.GetPrototypeOf());
             Assert.Equal("[object Object]", instance.ToString());
         }

+ 7 - 7
Jint.Tests/Runtime/PromiseTests.cs

@@ -24,10 +24,10 @@ namespace Jint.Tests.Runtime
                 return promise;
             }));
 
-            engine.Execute("f();");
+            var promise = engine.Evaluate("f();");
 
             resolveFunc(66);
-            Assert.Equal(66, engine.GetCompletionValue().UnwrapIfPromise());
+            Assert.Equal(66, promise.UnwrapIfPromise());
         }
 
         [Fact]
@@ -45,7 +45,7 @@ namespace Jint.Tests.Runtime
 
             engine.Execute("f();");
 
-            var completion = engine.Execute("f();").GetCompletionValue();
+            var completion = engine.Evaluate("f();");
 
             rejectFunc("oops!");
 
@@ -75,7 +75,7 @@ namespace Jint.Tests.Runtime
                 return promise;
             }));
 
-            var completion = engine.Execute("Promise.race([f1(), f2()]);").GetCompletionValue();
+            var completion = engine.Evaluate("Promise.race([f1(), f2()]);");
 
             resolve1("first");
 
@@ -100,7 +100,7 @@ namespace Jint.Tests.Runtime
 
             engine.Execute("f();");
 
-            Assert.Equal(true, engine.Execute(" 1 + 1 === 2").GetCompletionValue());
+            Assert.Equal(true, engine.Evaluate(" 1 + 1 === 2"));
         }
 
         #endregion
@@ -135,9 +135,9 @@ namespace Jint.Tests.Runtime
         public void PromiseCtor_ReturnsPromiseJsValue()
         {
             var engine = new Engine();
-            engine.Execute("new Promise((resolve, reject)=>{});");
+            var promise = engine.Evaluate("new Promise((resolve, reject)=>{});");
 
-            Assert.IsType<PromiseInstance>(engine.GetCompletionValue());
+            Assert.IsType<PromiseInstance>(promise);
         }
 
         #endregion

+ 1 - 2
Jint.Tests/Runtime/WeakSetMapTests.cs

@@ -1,5 +1,4 @@
 using Jint.Native;
-using Jint.Native.Object;
 using Jint.Native.WeakMap;
 using Jint.Native.WeakSet;
 using Jint.Runtime;
@@ -56,7 +55,7 @@ public class WeakSetMapTests
         var engine = new Engine();
         var weakMap = new WeakMapInstance(engine);
 
-        var e = Assert.Throws<JavaScriptException>(() => weakMap.WeakMapSet(key, new ObjectInstance(engine)));
+        var e = Assert.Throws<JavaScriptException>(() => weakMap.WeakMapSet(key, new JsObject(engine)));
         Assert.StartsWith("WeakMap key must be an object, got ", e.Message);
 
         Assert.False(weakMap.WeakMapHas(key));

+ 0 - 47
Jint/Engine.Obsolete.cs

@@ -1,47 +0,0 @@
-using Jint.Native;
-using Jint.Native.Array;
-using Jint.Native.Date;
-using Jint.Native.Error;
-using Jint.Native.Function;
-using Jint.Native.Json;
-using Jint.Native.Object;
-using Jint.Native.String;
-
-namespace Jint
-{
-    public partial class Engine
-    {
-        /// <summary>
-        /// Gets the last evaluated statement completion value
-        /// </summary>
-        [Obsolete("Prefer calling Evaluate which returns last completion value. Execute is for initialization and Evaluate returns final result.")]
-        public JsValue GetCompletionValue()
-        {
-            return _completionValue;
-        }
-
-        [Obsolete("Use active realms Intrinsics to access well-known object")]
-        public ArrayConstructor Array => Realm.Intrinsics.Array;
-
-        [Obsolete("Use active realms Intrinsics to access well-known object")]
-        public DateConstructor Date => Realm.Intrinsics.Date;
-
-        [Obsolete("Use active realms Intrinsics to access well-known object")]
-        public EvalFunctionInstance Eval => Realm.Intrinsics.Eval;
-
-        [Obsolete("Use active realms Intrinsics to access well-known object")]
-        public ErrorConstructor Error => Realm.Intrinsics.Error;
-
-        [Obsolete("Use active realms Intrinsics to access well-known object")]
-        public FunctionConstructor Function => Realm.Intrinsics.Function;
-
-        [Obsolete("Use active realms Intrinsics to access well-known object")]
-        public JsonInstance Json => Realm.Intrinsics.Json;
-
-        [Obsolete("Use active realms Intrinsics to access well-known object")]
-        public ObjectConstructor Object => Realm.Intrinsics.Object;
-
-        [Obsolete("Use active realms Intrinsics to access well-known object")]
-        public StringConstructor String => Realm.Intrinsics.String;
-    }
-}

+ 1 - 1
Jint/Engine.cs

@@ -497,7 +497,7 @@ namespace Jint
                     var getter = desc.Get!;
                     if (getter.IsUndefined())
                     {
-                        return Undefined.Instance;
+                        return JsValue.Undefined;
                     }
 
                     var callable = (ICallable) getter.AsObject();

+ 5 - 7
Jint/JsValueExtensions.cs

@@ -3,8 +3,6 @@ using System.Numerics;
 using System.Runtime.CompilerServices;
 using Esprima;
 using Jint.Native;
-using Jint.Native.Array;
-using Jint.Native.Date;
 using Jint.Native.Function;
 using Jint.Native.Object;
 using Jint.Native.Promise;
@@ -42,7 +40,7 @@ namespace Jint
         [MethodImpl(MethodImplOptions.AggressiveInlining)]
         public static bool IsDate(this JsValue value)
         {
-            return value is DateInstance;
+            return value is JsDate;
         }
 
         [Pure]
@@ -128,14 +126,14 @@ namespace Jint
 
         [Pure]
         [MethodImpl(MethodImplOptions.AggressiveInlining)]
-        public static DateInstance AsDate(this JsValue value)
+        public static JsDate AsDate(this JsValue value)
         {
             if (!value.IsDate())
             {
                 ExceptionHelper.ThrowArgumentException("The value is not a date");
             }
 
-            return (DateInstance) value;
+            return (JsDate) value;
         }
 
         [Pure]
@@ -175,14 +173,14 @@ namespace Jint
 
         [Pure]
         [MethodImpl(MethodImplOptions.AggressiveInlining)]
-        public static ArrayInstance AsArray(this JsValue value)
+        public static JsArray AsArray(this JsValue value)
         {
             if (!value.IsArray())
             {
                 ExceptionHelper.ThrowArgumentException("The value is not an array");
             }
 
-            return (ArrayInstance) value;
+            return (JsArray) value;
         }
 
         [MethodImpl(MethodImplOptions.AggressiveInlining)]

+ 1 - 1
Jint/Native/AggregateError/AggregateErrorConstructor.cs

@@ -47,7 +47,7 @@ internal sealed class AggregateErrorConstructor : FunctionInstance, IConstructor
         var o = OrdinaryCreateFromConstructor(
             newTarget,
             static intrinsics => intrinsics.AggregateError.PrototypeObject,
-            static (Engine engine, Realm _, object? _) => new ErrorInstance(engine));
+            static (Engine engine, Realm _, object? _) => new JsError(engine));
 
         if (!message.IsUndefined())
         {

+ 19 - 19
Jint/Native/Array/ArrayConstructor.cs

@@ -223,7 +223,7 @@ namespace Jint.Native.Array
                 a = _realm.Intrinsics.Array.Construct(len);
             }
 
-            if (a is ArrayInstance ai)
+            if (a is JsArray ai)
             {
                 // faster for real arrays
                 for (uint k = 0; k < arguments.Length; k++)
@@ -275,14 +275,14 @@ namespace Jint.Native.Array
             return Construct(arguments, thisObject);
         }
 
-        public ObjectInstance Construct(JsValue[] arguments)
+        public JsArray Construct(JsValue[] arguments)
         {
             return Construct(arguments, this);
         }
 
         ObjectInstance IConstructor.Construct(JsValue[] arguments, JsValue newTarget) => Construct(arguments, newTarget);
 
-        internal ObjectInstance Construct(JsValue[] arguments, JsValue newTarget)
+        internal JsArray Construct(JsValue[] arguments, JsValue newTarget)
         {
             if (newTarget.IsUndefined())
             {
@@ -304,24 +304,24 @@ namespace Jint.Native.Array
             return Construct(arguments, capacity, proto);
         }
 
-        public ArrayInstance Construct(int capacity)
+        public JsArray Construct(int capacity)
         {
             return Construct(System.Array.Empty<JsValue>(), (uint) capacity);
         }
 
-        public ArrayInstance Construct(uint capacity)
+        public JsArray Construct(uint capacity)
         {
             return Construct(System.Array.Empty<JsValue>(), capacity);
         }
 
-        public ArrayInstance Construct(JsValue[] arguments, uint capacity)
+        public JsArray Construct(JsValue[] arguments, uint capacity)
         {
             return Construct(arguments, capacity, PrototypeObject);
         }
 
-        private ArrayInstance Construct(JsValue[] arguments, ulong capacity, ObjectInstance prototypeObject)
+        private JsArray Construct(JsValue[] arguments, ulong capacity, ObjectInstance prototypeObject)
         {
-            ArrayInstance instance;
+            JsArray instance;
             if (arguments.Length == 1)
             {
                 switch (arguments[0])
@@ -335,9 +335,9 @@ namespace Jint.Native.Array
                             ? ConstructArrayFromIEnumerable(enumerable)
                             : ArrayCreate(0, prototypeObject);
                         break;
-                    case ArrayInstance arrayInstance:
+                    case JsArray array:
                         // direct copy
-                        instance = (ArrayInstance) ConstructArrayFromArrayLike(Undefined, arrayInstance, null, this);
+                        instance = (JsArray) ConstructArrayFromArrayLike(Undefined, array, null, this);
                         break;
                     default:
                         instance = ArrayCreate(capacity, prototypeObject);
@@ -362,7 +362,7 @@ namespace Jint.Native.Array
         /// <summary>
         /// https://tc39.es/ecma262/#sec-arraycreate
         /// </summary>
-        internal ArrayInstance ArrayCreate(ulong length, ObjectInstance? proto = null)
+        internal JsArray ArrayCreate(ulong length, ObjectInstance? proto = null)
         {
             if (length > ArrayOperations.MaxArrayLength)
             {
@@ -370,16 +370,16 @@ namespace Jint.Native.Array
             }
 
             proto ??= PrototypeObject;
-            var instance = new ArrayInstance(Engine, (uint) length, (uint) length)
+            var instance = new JsArray(Engine, (uint) length, (uint) length)
             {
                 _prototype = proto
             };
             return instance;
         }
 
-        private ArrayInstance ConstructArrayFromIEnumerable(IEnumerable enumerable)
+        private JsArray ConstructArrayFromIEnumerable(IEnumerable enumerable)
         {
-            var jsArray = (ArrayInstance) Construct(Arguments.Empty);
+            var jsArray = Construct(Arguments.Empty);
             var tempArray = _engine._jsValueArrayPool.RentArray(1);
             foreach (var item in enumerable)
             {
@@ -392,7 +392,7 @@ namespace Jint.Native.Array
             return jsArray;
         }
 
-        public ArrayInstance ConstructFast(JsValue[] contents)
+        public JsArray ConstructFast(JsValue[] contents)
         {
             var instance = ArrayCreate((ulong) contents.Length);
             for (var i = 0; i < contents.Length; i++)
@@ -402,7 +402,7 @@ namespace Jint.Native.Array
             return instance;
         }
 
-        internal ArrayInstance ConstructFast(List<JsValue> contents)
+        internal JsArray ConstructFast(List<JsValue> contents)
         {
             var instance = ArrayCreate((ulong) contents.Count);
             for (var i = 0; i < contents.Count; i++)
@@ -415,7 +415,7 @@ namespace Jint.Native.Array
         /// <summary>
         /// https://tc39.es/ecma262/#sec-arrayspeciescreate
         /// </summary>
-        public ObjectInstance ArraySpeciesCreate(ObjectInstance originalArray, ulong length)
+        internal ObjectInstance ArraySpeciesCreate(ObjectInstance originalArray, ulong length)
         {
             var isArray = originalArray.IsArray();
             if (!isArray)
@@ -460,7 +460,7 @@ namespace Jint.Native.Array
             return ((IConstructor) c).Construct(new JsValue[] { JsNumber.Create(length) }, c);
         }
 
-        internal ArrayInstance CreateArrayFromList<T>(List<T> values) where T : JsValue
+        internal JsArray CreateArrayFromList<T>(List<T> values) where T : JsValue
         {
             var jsArray = ArrayCreate((uint) values.Count);
             var index = 0;
@@ -474,7 +474,7 @@ namespace Jint.Native.Array
             return jsArray;
         }
 
-        internal ArrayInstance CreateArrayFromList<T>(T[] values) where T : JsValue
+        internal JsArray CreateArrayFromList<T>(T[] values) where T : JsValue
         {
             var jsArray = ArrayCreate((uint) values.Length);
             var index = 0;

+ 5 - 19
Jint/Native/Array/ArrayInstance.cs

@@ -26,13 +26,7 @@ namespace Jint.Native.Array
             _dense = System.Array.Empty<object?>();
         }
 
-        /// <summary>
-        /// Creates a new array instance with defaults.
-        /// </summary>
-        /// <param name="engine">The engine that this array is bound to.</param>
-        /// <param name="capacity">The initial size of underlying data structure, if you know you're going to add N items, provide N.</param>
-        /// <param name="length">Sets the length of the array.</param>
-        public ArrayInstance(Engine engine, uint capacity = 0, uint length = 0) : base(engine)
+        private protected ArrayInstance(Engine engine, uint capacity = 0, uint length = 0) : base(engine)
         {
             _prototype = engine.Realm.Intrinsics.Array.PrototypeObject;
 
@@ -53,12 +47,7 @@ namespace Jint.Native.Array
             _length = new PropertyDescriptor(length, PropertyFlag.OnlyWritable);
         }
 
-        /// <summary>
-        /// Possibility to construct valid array fast.
-        /// Requires that supplied array is of type object[] and it should only contain values that inherit from JsValue or PropertyDescriptor or are null.
-        /// The array will be owned and modified by Jint afterwards.
-        /// </summary>
-        public ArrayInstance(Engine engine, object[] items) : base(engine)
+        private protected ArrayInstance(Engine engine, object[] items) : base(engine)
         {
             _prototype = engine.Realm.Intrinsics.Array.PrototypeObject;
 
@@ -82,10 +71,7 @@ namespace Jint.Native.Array
             _length = new PropertyDescriptor(length, PropertyFlag.OnlyWritable);
         }
 
-        /// <summary>
-        /// Possibility to construct valid array fast, requires that supplied array does not have holes.
-        /// </summary>
-        public ArrayInstance(Engine engine, PropertyDescriptor[] items) : base(engine)
+        private protected ArrayInstance(Engine engine, PropertyDescriptor[] items) : base(engine)
         {
             int length;
             if (items == null || items.Length == 0)
@@ -1102,7 +1088,7 @@ namespace Jint.Native.Array
             }
         }
 
-        internal ArrayInstance Map(JsValue[] arguments)
+        internal JsArray Map(JsValue[] arguments)
         {
             var callbackfn = arguments.At(0);
             var thisArg = arguments.At(1);
@@ -1239,7 +1225,7 @@ namespace Jint.Native.Array
         /// <summary>
         /// Fast path for concatenating sane-sized arrays, we assume size has been calculated.
         /// </summary>
-        internal void CopyValues(ArrayInstance source, uint sourceStartIndex, uint targetStartIndex, uint length)
+        internal void CopyValues(JsArray source, uint sourceStartIndex, uint targetStartIndex, uint length)
         {
             if (length == 0)
             {

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

@@ -14,7 +14,7 @@ namespace Jint.Native.Array
 
         public static ArrayOperations For(ObjectInstance instance)
         {
-            if (instance is ArrayInstance { CanUseFastAccess: true } arrayInstance)
+            if (instance is JsArray { CanUseFastAccess: true } arrayInstance)
             {
                 return new ArrayInstanceOperations(arrayInstance);
             }
@@ -205,9 +205,9 @@ namespace Jint.Native.Array
                 => _target.DeletePropertyOrThrow(JsString.Create(index));
         }
 
-        private sealed class ArrayInstanceOperations : ArrayOperations<ArrayInstance>
+        private sealed class ArrayInstanceOperations : ArrayOperations<JsArray>
         {
-            public ArrayInstanceOperations(ArrayInstance target) : base(target)
+            public ArrayInstanceOperations(JsArray target) : base(target)
             {
             }
 

+ 8 - 8
Jint/Native/Array/ArrayPrototype.cs

@@ -84,7 +84,7 @@ namespace Jint.Native.Array
                 [GlobalSymbolRegistry.Iterator] = new PropertyDescriptor(_originalIteratorFunction, propertyFlags),
                 [GlobalSymbolRegistry.Unscopables] = new LazyPropertyDescriptor(_engine, static state =>
                 {
-                    var unscopables = new ObjectInstance((Engine) state!)
+                    var unscopables = new JsObject((Engine) state!)
                     {
                         _prototype = null
                     };
@@ -442,7 +442,7 @@ namespace Jint.Native.Array
         /// </summary>
         private JsValue Map(JsValue thisObj, JsValue[] arguments)
         {
-            if (thisObj is ArrayInstance { CanUseFastAccess: true } arrayInstance
+            if (thisObj is JsArray { CanUseFastAccess: true } arrayInstance
                 && !arrayInstance.HasOwnProperty(CommonProperties.Constructor))
             {
                 return arrayInstance.Map(arguments);
@@ -1119,7 +1119,7 @@ namespace Jint.Native.Array
 
             var length = (uint) System.Math.Max(0, (long) final - (long) k);
             var a = _realm.Intrinsics.Array.ArraySpeciesCreate(TypeConverter.ToObject(_realm, thisObj), length);
-            if (thisObj is ArrayInstance ai && a is ArrayInstance a2)
+            if (thisObj is JsArray ai && a is JsArray a2)
             {
                 a2.CopyValues(ai, (uint) k, 0, length);
             }
@@ -1320,7 +1320,7 @@ namespace Jint.Native.Array
                 var e = items[i];
                 if (e is ObjectInstance { IsConcatSpreadable: true } oi)
                 {
-                    if (e is ArrayInstance eArray && a is ArrayInstance a2)
+                    if (e is JsArray eArray && a is JsArray a2)
                     {
                         a2.CopyValues(eArray, 0, n, eArray.GetLength());
                         n += eArray.GetLength();
@@ -1438,7 +1438,7 @@ namespace Jint.Native.Array
         /// </summary>
         public JsValue Push(JsValue thisObject, JsValue[] arguments)
         {
-            if (thisObject is ArrayInstance { CanUseFastAccess: true } arrayInstance)
+            if (thisObject is JsArray { CanUseFastAccess: true } arrayInstance)
             {
                 return arrayInstance.Push(arguments);
             }
@@ -1509,7 +1509,7 @@ namespace Jint.Native.Array
             return map;
         }
 
-        private Dictionary<JsValue, ArrayInstance> BuildArrayGrouping(JsValue thisObject, JsValue[] arguments, bool mapMode)
+        private Dictionary<JsValue, JsArray> BuildArrayGrouping(JsValue thisObject, JsValue[] arguments, bool mapMode)
         {
             var o = ArrayOperations.For(_realm, thisObject);
             var len = o.GetLongLength();
@@ -1517,7 +1517,7 @@ namespace Jint.Native.Array
             var callable = GetCallable(callbackfn);
             var thisArg = arguments.At(1);
 
-            var result = new Dictionary<JsValue, ArrayInstance>();
+            var result = new Dictionary<JsValue, JsArray>();
             var args = _engine._jsValueArrayPool.RentArray(3);
             args[2] = o.Target;
             for (uint k = 0; k < len; k++)
@@ -1538,7 +1538,7 @@ namespace Jint.Native.Array
                 }
                 if (!result.TryGetValue(key, out var list))
                 {
-                    result[key] = list = new ArrayInstance(_engine);
+                    result[key] = list = new JsArray(_engine);
                 }
 
                 list.SetIndexValue(list.GetLength(), kValue, updateLength: true);

+ 3 - 3
Jint/Native/ArrayBuffer/ArrayBufferConstructor.cs

@@ -13,7 +13,7 @@ namespace Jint.Native.ArrayBuffer
     /// <summary>
     /// https://tc39.es/ecma262/#sec-properties-of-the-arraybuffer-constructor
     /// </summary>
-    public sealed class ArrayBufferConstructor : FunctionInstance, IConstructor
+    internal sealed class ArrayBufferConstructor : FunctionInstance, IConstructor
     {
         private static readonly JsString _functionName = new("ArrayBuffer");
 
@@ -30,7 +30,7 @@ namespace Jint.Native.ArrayBuffer
             _prototypeDescriptor = new PropertyDescriptor(PrototypeObject, PropertyFlag.AllForbidden);
         }
 
-        public ArrayBufferPrototype PrototypeObject { get; }
+        private ArrayBufferPrototype PrototypeObject { get; }
 
         protected override void Initialize()
         {
@@ -87,7 +87,7 @@ namespace Jint.Native.ArrayBuffer
             var obj = OrdinaryCreateFromConstructor(
                 constructor,
                 static intrinsics => intrinsics.ArrayBuffer.PrototypeObject,
-                static (engine, realm, state) => new ArrayBufferInstance(engine, (ulong) ((JsNumber) state!)._value),
+                static (engine, realm, state) => new ArrayBufferInstance(engine, (ulong) state!._value),
                 JsNumber.Create(byteLength));
 
             return obj;

+ 1 - 1
Jint/Native/ArrayBuffer/ArrayBufferInstance.cs

@@ -7,7 +7,7 @@ namespace Jint.Native.ArrayBuffer
     /// <summary>
     /// https://tc39.es/ecma262/#sec-arraybuffer-objects
     /// </summary>
-    public sealed class ArrayBufferInstance : ObjectInstance
+    internal sealed class ArrayBufferInstance : ObjectInstance
     {
         // so that we don't need to allocate while or reading setting values
         private readonly byte[] _workBuffer = new byte[8];

+ 6 - 7
Jint/Native/ArrayBuffer/ArrayBufferOrder.cs

@@ -1,9 +1,8 @@
-namespace Jint.Native.ArrayBuffer
+namespace Jint.Native.ArrayBuffer;
+
+internal enum ArrayBufferOrder
 {
-    internal enum ArrayBufferOrder
-    {
-        Init,
-        SecCst,
-        Unordered
-    }
+    Init,
+    SecCst,
+    Unordered
 }

+ 1 - 1
Jint/Native/ArrayBuffer/ArrayBufferPrototype.cs

@@ -10,7 +10,7 @@ namespace Jint.Native.ArrayBuffer
     /// <summary>
     /// https://tc39.es/ecma262/#sec-properties-of-the-arraybuffer-prototype-object
     /// </summary>
-    public sealed class ArrayBufferPrototype : ObjectInstance
+    internal sealed class ArrayBufferPrototype : ObjectInstance
     {
         private readonly Realm _realm;
         private readonly ArrayBufferConstructor _constructor;

+ 1 - 1
Jint/Native/BigInt/BigIntConstructor.cs

@@ -11,7 +11,7 @@ namespace Jint.Native.BigInt;
 /// <summary>
 /// https://tc39.es/ecma262/#sec-properties-of-the-bigint-constructor
 /// </summary>
-public sealed class BigIntConstructor : FunctionInstance, IConstructor
+internal sealed class BigIntConstructor : FunctionInstance, IConstructor
 {
     private static readonly JsString _functionName = new("BigInt");
 

+ 1 - 1
Jint/Native/BigInt/BigIntInstance.cs

@@ -3,7 +3,7 @@ using Jint.Runtime;
 
 namespace Jint.Native.BigInt;
 
-public sealed class BigIntInstance : ObjectInstance, IPrimitiveInstance
+internal sealed class BigIntInstance : ObjectInstance, IPrimitiveInstance
 {
     public BigIntInstance(Engine engine, JsBigInt value)
         : base(engine, ObjectClass.Object)

+ 1 - 1
Jint/Native/BigInt/BigIntPrototype.cs

@@ -12,7 +12,7 @@ namespace Jint.Native.BigInt;
 /// <summary>
 /// https://tc39.es/ecma262/#sec-properties-of-the-bigint-prototype-object
 /// </summary>
-public sealed class BigIntPrototype : ObjectInstance
+internal sealed class BigIntPrototype : ObjectInstance
 {
     private readonly Realm _realm;
     private readonly BigIntConstructor _constructor;

+ 1 - 1
Jint/Native/Boolean/BooleanConstructor.cs

@@ -5,7 +5,7 @@ using Jint.Runtime.Descriptors;
 
 namespace Jint.Native.Boolean
 {
-    public sealed class BooleanConstructor : FunctionInstance, IConstructor
+    internal sealed class BooleanConstructor : FunctionInstance, IConstructor
     {
         private static readonly JsString _functionName = new JsString("Boolean");
 

+ 10 - 11
Jint/Native/Boolean/BooleanInstance.cs

@@ -1,20 +1,19 @@
 using Jint.Native.Object;
 using Jint.Runtime;
 
-namespace Jint.Native.Boolean
+namespace Jint.Native.Boolean;
+
+internal class BooleanInstance : ObjectInstance, IPrimitiveInstance
 {
-    public class BooleanInstance : ObjectInstance, IPrimitiveInstance
+    public BooleanInstance(Engine engine, JsBoolean value)
+        : base(engine, ObjectClass.Boolean)
     {
-        public BooleanInstance(Engine engine, JsBoolean value)
-            : base(engine, ObjectClass.Boolean)
-        {
-            BooleanData = value;
-        }
+        BooleanData = value;
+    }
 
-        Types IPrimitiveInstance.Type => Types.Boolean;
+    Types IPrimitiveInstance.Type => Types.Boolean;
 
-        JsValue IPrimitiveInstance.PrimitiveValue => BooleanData;
+    JsValue IPrimitiveInstance.PrimitiveValue => BooleanData;
 
-        public JsValue BooleanData { get; }
-    }
+    public JsValue BooleanData { get; }
 }

+ 1 - 1
Jint/Native/Boolean/BooleanPrototype.cs

@@ -9,7 +9,7 @@ namespace Jint.Native.Boolean
     /// <summary>
     ///     http://www.ecma-international.org/ecma-262/5.1/#sec-15.6.4
     /// </summary>
-    public sealed class BooleanPrototype : BooleanInstance
+    internal sealed class BooleanPrototype : BooleanInstance
     {
         private readonly Realm _realm;
         private readonly BooleanConstructor _constructor;

+ 1 - 1
Jint/Native/DataView/DataViewConstructor.cs

@@ -9,7 +9,7 @@ namespace Jint.Native.DataView
     /// <summary>
     /// https://tc39.es/ecma262/#sec-dataview-constructor
     /// </summary>
-    public sealed class DataViewConstructor : FunctionInstance, IConstructor
+    internal sealed class DataViewConstructor : FunctionInstance, IConstructor
     {
         private static readonly JsString _functionName = new("DataView");
 

+ 11 - 12
Jint/Native/DataView/DataViewInstance.cs

@@ -1,19 +1,18 @@
 using Jint.Native.ArrayBuffer;
 using Jint.Native.Object;
 
-namespace Jint.Native.DataView
+namespace Jint.Native.DataView;
+
+/// <summary>
+/// https://tc39.es/ecma262/#sec-properties-of-dataview-instances
+/// </summary>
+internal sealed class DataViewInstance : ObjectInstance
 {
-    /// <summary>
-    /// https://tc39.es/ecma262/#sec-properties-of-dataview-instances
-    /// </summary>
-    public sealed class DataViewInstance : ObjectInstance
-    {
-        internal ArrayBufferInstance? _viewedArrayBuffer;
-        internal uint _byteLength;
-        internal uint _byteOffset;
+    internal ArrayBufferInstance? _viewedArrayBuffer;
+    internal uint _byteLength;
+    internal uint _byteOffset;
 
-        internal DataViewInstance(Engine engine) : base(engine)
-        {
-        }
+    internal DataViewInstance(Engine engine) : base(engine)
+    {
     }
 }

+ 1 - 1
Jint/Native/DataView/DataViewPrototype.cs

@@ -12,7 +12,7 @@ namespace Jint.Native.DataView
     /// <summary>
     /// https://tc39.es/ecma262/#sec-properties-of-the-dataview-prototype-object
     /// </summary>
-    public sealed class DataViewPrototype : ObjectInstance
+    internal sealed class DataViewPrototype : ObjectInstance
     {
         private readonly Realm _realm;
         private readonly DataViewConstructor _constructor;

+ 9 - 9
Jint/Native/Date/DateConstructor.cs

@@ -12,7 +12,7 @@ namespace Jint.Native.Date
     /// <summary>
     /// https://tc39.es/ecma262/#sec-date-constructor
     /// </summary>
-    public sealed class DateConstructor : FunctionInstance, IConstructor
+    internal sealed class DateConstructor : FunctionInstance, IConstructor
     {
         internal static readonly DateTime Epoch = new(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
 
@@ -173,19 +173,19 @@ namespace Jint.Native.Date
                 return OrdinaryCreateFromConstructor(
                     newTarget,
                     static intrinsics => intrinsics.Date.PrototypeObject,
-                    static (engine, _, dateValue) => new DateInstance(engine, dateValue),
+                    static (engine, _, dateValue) => new JsDate(engine, dateValue),
                     (DateTime.UtcNow - Epoch).TotalMilliseconds);
             }
 
             return ConstructUnlikely(arguments, newTarget);
         }
 
-        private DateInstance ConstructUnlikely(JsValue[] arguments, JsValue newTarget)
+        private JsDate ConstructUnlikely(JsValue[] arguments, JsValue newTarget)
         {
             double dv;
             if (arguments.Length == 1)
             {
-                if (arguments[0] is DateInstance date)
+                if (arguments[0] is JsDate date)
                 {
                     return Construct(date.DateValue);
                 }
@@ -224,19 +224,19 @@ namespace Jint.Native.Date
             return OrdinaryCreateFromConstructor(
                 newTarget,
                 static intrinsics => intrinsics.Date.PrototypeObject,
-                static (engine, _, dateValue) => new DateInstance(engine, dateValue), dv);
+                static (engine, _, dateValue) => new JsDate(engine, dateValue), dv);
         }
 
-        public DateInstance Construct(DateTimeOffset value) => Construct(value.UtcDateTime);
+        public JsDate Construct(DateTimeOffset value) => Construct(value.UtcDateTime);
 
-        public DateInstance Construct(DateTime value) => Construct(FromDateTime(value));
+        public JsDate Construct(DateTime value) => Construct(FromDateTime(value));
 
-        public DateInstance Construct(double time)
+        public JsDate Construct(double time)
         {
             return OrdinaryCreateFromConstructor(
                 Undefined,
                 static intrinsics => intrinsics.Date.PrototypeObject,
-                static (engine, _, dateValue) => new DateInstance(engine, dateValue), time);
+                static (engine, _, dateValue) => new JsDate(engine, dateValue), time);
         }
 
         internal double FromDateTime(DateTime dt, bool negative = false)

+ 19 - 19
Jint/Native/Date/DatePrototype.cs

@@ -143,7 +143,7 @@ namespace Jint.Native.Date
         /// </summary>
         private double ThisTimeValue(JsValue thisObj)
         {
-            if (thisObj is DateInstance dateInstance)
+            if (thisObj is JsDate dateInstance)
             {
                 return dateInstance.DateValue;
             }
@@ -458,7 +458,7 @@ namespace Jint.Native.Date
             var t = TypeConverter.ToNumber(arguments.At(0));
             var v = t.TimeClip();
 
-            ((DateInstance) thisObj)._dateValue = t;
+            ((JsDate) thisObj)._dateValue = t;
             return v;
         }
 
@@ -477,7 +477,7 @@ namespace Jint.Native.Date
 
             var time = MakeTime(HourFromTime(t), MinFromTime(t), SecFromTime(t), ms);
             var u = Utc(MakeDate(Day(t), time)).TimeClip();
-            ((DateInstance) thisObj)._dateValue = u;
+            ((JsDate) thisObj)._dateValue = u;
             return u;
         }
 
@@ -496,7 +496,7 @@ namespace Jint.Native.Date
 
             var time = MakeTime(HourFromTime(t), MinFromTime(t), SecFromTime(t), milli);
             var u = MakeDate(Day(t), time).TimeClip();
-            ((DateInstance) thisObj)._dateValue = u;
+            ((JsDate) thisObj)._dateValue = u;
             return u;
         }
 
@@ -516,7 +516,7 @@ namespace Jint.Native.Date
 
             var date = MakeDate(Day(t), MakeTime(HourFromTime(t), MinFromTime(t), s, milli));
             var u = Utc(date).TimeClip();
-            ((DateInstance) thisObj)._dateValue = u;
+            ((JsDate) thisObj)._dateValue = u;
             return u;
         }
 
@@ -536,7 +536,7 @@ namespace Jint.Native.Date
 
             var date = MakeDate(Day(t), MakeTime(HourFromTime(t), MinFromTime(t), s, milli));
             var u = date.TimeClip();
-            ((DateInstance) thisObj)._dateValue = u;
+            ((JsDate) thisObj)._dateValue = u;
             return u;
         }
 
@@ -557,7 +557,7 @@ namespace Jint.Native.Date
 
             var date = MakeDate(Day(t), MakeTime(HourFromTime(t), m, s, milli));
             var u = Utc(date).TimeClip();
-            ((DateInstance) thisObj)._dateValue = u;
+            ((JsDate) thisObj)._dateValue = u;
             return u;
         }
 
@@ -578,7 +578,7 @@ namespace Jint.Native.Date
 
             var date = MakeDate(Day(t), MakeTime(HourFromTime(t), m, s, milli));
             var u = date.TimeClip();
-            ((DateInstance) thisObj)._dateValue = u;
+            ((JsDate) thisObj)._dateValue = u;
             return u;
         }
 
@@ -600,7 +600,7 @@ namespace Jint.Native.Date
 
             var date = MakeDate(Day(t), MakeTime(h, m, s, milli));
             var u = Utc(date).TimeClip();
-            ((DateInstance) thisObj)._dateValue = u;
+            ((JsDate) thisObj)._dateValue = u;
             return u;
         }
 
@@ -622,7 +622,7 @@ namespace Jint.Native.Date
 
             var newDate = MakeDate(Day(t), MakeTime(h, m, s, milli));
             var v = newDate.TimeClip();
-            ((DateInstance) thisObj)._dateValue = v;
+            ((JsDate) thisObj)._dateValue = v;
             return v;
         }
 
@@ -642,7 +642,7 @@ namespace Jint.Native.Date
             var (year, month, __) = YearMonthDayFromTime(t);
             var newDate = MakeDate(MakeDay(year, month, dt), TimeWithinDay(t));
             var u = Utc(newDate).TimeClip();
-            ((DateInstance) thisObj)._dateValue = u;
+            ((JsDate) thisObj)._dateValue = u;
             return u;
         }
 
@@ -661,7 +661,7 @@ namespace Jint.Native.Date
 
             var newDate = MakeDate(MakeDay(YearFromTime(t), MonthFromTime(t), dt), TimeWithinDay(t));
             var u = newDate.TimeClip();
-            ((DateInstance) thisObj)._dateValue = u;
+            ((JsDate) thisObj)._dateValue = u;
             return u;
         }
 
@@ -681,7 +681,7 @@ namespace Jint.Native.Date
 
             var newDate = MakeDate(MakeDay(YearFromTime(t), m, dt), TimeWithinDay(t));
             var u = Utc(newDate).TimeClip();
-            ((DateInstance) thisObj)._dateValue = u;
+            ((JsDate) thisObj)._dateValue = u;
             return u;
         }
 
@@ -701,7 +701,7 @@ namespace Jint.Native.Date
 
             var newDate = MakeDate(MakeDay(YearFromTime(t), m, dt), TimeWithinDay(t));
             var u = newDate.TimeClip();
-            ((DateInstance) thisObj)._dateValue = u;
+            ((JsDate) thisObj)._dateValue = u;
             return u;
         }
 
@@ -718,7 +718,7 @@ namespace Jint.Native.Date
 
             var newDate = MakeDate(MakeDay(y, m, dt), TimeWithinDay(t));
             var u = Utc(newDate).TimeClip();
-            ((DateInstance) thisObj)._dateValue = u;
+            ((JsDate) thisObj)._dateValue = u;
             return u;
         }
 
@@ -732,7 +732,7 @@ namespace Jint.Native.Date
             var y = TypeConverter.ToNumber(arguments.At(0));
             if (double.IsNaN(y))
             {
-                ((DateInstance) thisObj)._dateValue = double.NaN;
+                ((JsDate) thisObj)._dateValue = double.NaN;
                 return JsNumber.DoubleNaN;
             }
 
@@ -744,7 +744,7 @@ namespace Jint.Native.Date
 
             var newDate = MakeDay(fy, MonthFromTime(t), DateFromTime(t));
             var u = Utc(MakeDate(newDate, TimeWithinDay(t)));
-            ((DateInstance) thisObj)._dateValue = u.TimeClip();
+            ((JsDate) thisObj)._dateValue = u.TimeClip();
             return u;
         }
 
@@ -760,7 +760,7 @@ namespace Jint.Native.Date
             var dt = arguments.Length <= 2 ? DateFromTime(t) : TypeConverter.ToNumber(arguments.At(2));
             var newDate = MakeDate(MakeDay(y, m, dt), TimeWithinDay(t));
             var u = newDate.TimeClip();
-            ((DateInstance) thisObj)._dateValue = u;
+            ((JsDate) thisObj)._dateValue = u;
             return u;
         }
 
@@ -789,7 +789,7 @@ namespace Jint.Native.Date
                 ExceptionHelper.ThrowRangeError(_realm);
             }
 
-            if (((DateInstance) thisObj).DateTimeRangeValid)
+            if (((JsDate) thisObj).DateTimeRangeValid)
             {
                 // shortcut
                 var dt = thisTime.ToDateTime();

+ 6 - 5
Jint/Native/Date/DateInstance.cs → Jint/Native/DateInstance.cs

@@ -1,10 +1,11 @@
 using System.Globalization;
+using Jint.Native.Date;
 using Jint.Native.Object;
 using Jint.Runtime;
 
-namespace Jint.Native.Date;
+namespace Jint.Native;
 
-public sealed class DateInstance : ObjectInstance
+public class JsDate : ObjectInstance
 {
     // Maximum allowed value to prevent DateTime overflow
     private static readonly long Max = (long) (DateTime.MaxValue - DateConstructor.Epoch).TotalMilliseconds;
@@ -14,15 +15,15 @@ public sealed class DateInstance : ObjectInstance
 
     internal double _dateValue;
 
-    public DateInstance(Engine engine, DateTimeOffset value) : this(engine, value.UtcDateTime)
+    public JsDate(Engine engine, DateTimeOffset value) : this(engine, value.UtcDateTime)
     {
     }
 
-    public DateInstance(Engine engine, DateTime value) : this(engine, engine.Realm.Intrinsics.Date.FromDateTime(value))
+    public JsDate(Engine engine, DateTime value) : this(engine, engine.Realm.Intrinsics.Date.FromDateTime(value))
     {
     }
 
-    public DateInstance(Engine engine, double dateValue) : base(engine, ObjectClass.Date)
+    public JsDate(Engine engine, double dateValue) : base(engine, ObjectClass.Date)
     {
         _prototype = engine.Realm.Intrinsics.Date.PrototypeObject;
         _dateValue = dateValue.TimeClip();

+ 2 - 2
Jint/Native/Error/ErrorConstructor.cs

@@ -24,7 +24,7 @@ namespace Jint.Native.Error
             _prototypeDescriptor = new PropertyDescriptor(PrototypeObject, PropertyFlag.AllForbidden);
         }
 
-        public ErrorPrototype PrototypeObject { get; }
+        internal ErrorPrototype PrototypeObject { get; }
 
         protected internal override JsValue Call(JsValue thisObject, JsValue[] arguments)
         {
@@ -46,7 +46,7 @@ namespace Jint.Native.Error
             var o = OrdinaryCreateFromConstructor(
                 newTarget,
                 _intrinsicDefaultProto,
-                static (Engine engine, Realm _, object? _) => new ErrorInstance(engine));
+                static (Engine engine, Realm _, object? _) => new JsError(engine));
 
             var jsValue = arguments.At(0);
             if (!jsValue.IsUndefined())

+ 8 - 1
Jint/Native/Error/ErrorInstance.cs

@@ -3,9 +3,16 @@ using Jint.Runtime;
 
 namespace Jint.Native.Error;
 
+public sealed class JsError : ErrorInstance
+{
+    internal JsError(Engine engine) : base(engine, ObjectClass.Error)
+    {
+    }
+}
+
 public class ErrorInstance : ObjectInstance
 {
-    internal ErrorInstance(Engine engine, ObjectClass objectClass = ObjectClass.Error)
+    private protected ErrorInstance(Engine engine, ObjectClass objectClass)
         : base(engine, objectClass)
     {
     }

+ 1 - 1
Jint/Native/Error/ErrorPrototype.cs

@@ -9,7 +9,7 @@ namespace Jint.Native.Error
     /// <summary>
     /// http://www.ecma-international.org/ecma-262/5.1/#sec-15.11.4
     /// </summary>
-    public sealed class ErrorPrototype : ErrorInstance
+    internal sealed class ErrorPrototype : ErrorInstance
     {
         private readonly JsString _name;
         private readonly Realm _realm;

+ 1 - 1
Jint/Native/Function/ClassDefinition.cs

@@ -124,7 +124,7 @@ namespace Jint.Native.Function
                 }
             }
 
-            var proto = new ObjectInstance(engine)
+            ObjectInstance proto = new JsObject(engine)
             {
                 _prototype = protoParent
             };

+ 1 - 1
Jint/Native/Function/EvalFunctionInstance.cs

@@ -7,7 +7,7 @@ using Jint.Runtime.Interpreter.Statements;
 
 namespace Jint.Native.Function
 {
-    public sealed class EvalFunctionInstance : FunctionInstance
+    internal sealed class EvalFunctionInstance : FunctionInstance
     {
         private static readonly JsString _functionName = new("eval");
 

+ 1 - 1
Jint/Native/Function/FunctionConstructor.cs

@@ -25,7 +25,7 @@ namespace Jint.Native.Function
             _length = new PropertyDescriptor(JsNumber.PositiveOne, PropertyFlag.Configurable);
         }
 
-        public FunctionPrototype PrototypeObject { get; }
+        internal FunctionPrototype PrototypeObject { get; }
 
         protected internal override JsValue Call(JsValue thisObject, JsValue[] arguments)
         {

+ 1 - 1
Jint/Native/Function/FunctionPrototype.cs

@@ -11,7 +11,7 @@ namespace Jint.Native.Function
     /// <summary>
     /// https://tc39.es/ecma262/#sec-properties-of-the-function-prototype-object
     /// </summary>
-    public sealed class FunctionPrototype : FunctionInstance
+    internal sealed class FunctionPrototype : FunctionInstance
     {
         internal FunctionPrototype(
             Engine engine,

+ 1 - 1
Jint/Native/Function/ScriptFunctionInstance.cs

@@ -137,7 +137,7 @@ namespace Jint.Native.Function
                 thisArgument = OrdinaryCreateFromConstructor(
                     newTarget,
                     static intrinsics => intrinsics.Object.PrototypeObject,
-                    static (Engine engine, Realm _, object? _) => new ObjectInstance(engine));
+                    static (Engine engine, Realm _, object? _) => new JsObject(engine));
             }
 
             var calleeContext = PrepareForOrdinaryCall(newTarget);

+ 1 - 1
Jint/Native/Function/ThrowTypeError.cs

@@ -3,7 +3,7 @@ using Jint.Runtime.Descriptors;
 
 namespace Jint.Native.Function
 {
-    public sealed class ThrowTypeError : FunctionInstance
+    internal sealed class ThrowTypeError : FunctionInstance
     {
         public ThrowTypeError(Engine engine, Realm realm)
             : base(engine, realm, null)

+ 1 - 1
Jint/Native/Global/GlobalObject.cs

@@ -18,7 +18,7 @@ namespace Jint.Native.Global
 
         internal GlobalObject(
             Engine engine,
-            Realm realm) : base(engine)
+            Realm realm) : base(engine, ObjectClass.Object, InternalTypes.Object)
         {
             _realm = realm;
         }

+ 4 - 5
Jint/Native/ICallable.cs

@@ -1,7 +1,6 @@
-namespace Jint.Native
+namespace Jint.Native;
+
+internal interface ICallable
 {
-    internal interface ICallable
-    {
-        JsValue Call(JsValue thisObject, params JsValue[] arguments);
-    }
+    JsValue Call(JsValue thisObject, params JsValue[] arguments);
 }

+ 4 - 5
Jint/Native/IConstructor.cs

@@ -1,9 +1,8 @@
 using Jint.Native.Object;
 
-namespace Jint.Native
+namespace Jint.Native;
+
+internal interface IConstructor
 {
-    internal interface IConstructor
-    {
-        ObjectInstance Construct(JsValue[] arguments, JsValue newTarget);
-    }
+    ObjectInstance Construct(JsValue[] arguments, JsValue newTarget);
 }

+ 5 - 6
Jint/Native/IPrimitiveInstance.cs

@@ -1,10 +1,9 @@
 using Jint.Runtime;
 
-namespace Jint.Native
+namespace Jint.Native;
+
+public interface IPrimitiveInstance
 {
-    public interface IPrimitiveInstance
-    {
-        Types Type { get; } 
-        JsValue PrimitiveValue { get; }
-    }
+    Types Type { get; }
+    JsValue PrimitiveValue { get; }
 }

+ 33 - 0
Jint/Native/JsArray.cs

@@ -0,0 +1,33 @@
+using Jint.Native.Array;
+using Jint.Runtime.Descriptors;
+
+namespace Jint.Native;
+
+public sealed class JsArray : ArrayInstance
+{
+    /// <summary>
+    /// Creates a new array instance with defaults.
+    /// </summary>
+    /// <param name="engine">The engine that this array is bound to.</param>
+    /// <param name="capacity">The initial size of underlying data structure, if you know you're going to add N items, provide N.</param>
+    /// <param name="length">Sets the length of the array.</param>
+    public JsArray(Engine engine, uint capacity = 0, uint length = 0) : base(engine, capacity, length)
+    {
+    }
+
+    /// <summary>
+    /// Possibility to construct valid array fast.
+    /// Requires that supplied array is of type object[] and it should only contain values that inherit from JsValue or PropertyDescriptor or are null.
+    /// The array will be owned and modified by Jint afterwards.
+    /// </summary>
+    public JsArray(Engine engine, object[] items) : base(engine, items)
+    {
+    }
+
+    /// <summary>
+    /// Possibility to construct valid array fast, requires that supplied array does not have holes.
+    /// </summary>
+    public JsArray(Engine engine, PropertyDescriptor[] items) : base(engine, items)
+    {
+    }
+}

+ 43 - 44
Jint/Native/JsBoolean.cs

@@ -1,65 +1,64 @@
 using Jint.Runtime;
 
-namespace Jint.Native
+namespace Jint.Native;
+
+public sealed class JsBoolean : JsValue, IEquatable<JsBoolean>
 {
-    public sealed class JsBoolean : JsValue, IEquatable<JsBoolean>
-    {
-        public static readonly JsBoolean False = new JsBoolean(false);
-        public static readonly JsBoolean True = new JsBoolean(true);
+    public static readonly JsBoolean False = new JsBoolean(false);
+    public static readonly JsBoolean True = new JsBoolean(true);
 
-        internal static readonly object BoxedTrue = true;
-        internal static readonly object BoxedFalse = false;
+    internal static readonly object BoxedTrue = true;
+    internal static readonly object BoxedFalse = false;
 
-        internal readonly bool _value;
+    internal readonly bool _value;
 
-        public JsBoolean(bool value) : base(Types.Boolean)
-        {
-            _value = value;
-        }
+    public JsBoolean(bool value) : base(Types.Boolean)
+    {
+        _value = value;
+    }
 
-        public override object ToObject()
-        {
-            return _value ? BoxedTrue : BoxedFalse;
-        }
+    public override object ToObject()
+    {
+        return _value ? BoxedTrue : BoxedFalse;
+    }
 
-        public override string ToString()
+    public override string ToString()
+    {
+        return _value ? "true" : "false";
+    }
+
+    public override bool IsLooselyEqual(JsValue value)
+    {
+        if (value is JsBoolean jsBoolean)
         {
-            return _value ? "true" : "false";
+            return Equals(jsBoolean);
         }
 
-        public override bool IsLooselyEqual(JsValue value)
-        {
-            if (value is JsBoolean jsBoolean)
-            {
-                return Equals(jsBoolean);
-            }
+        return !value.IsNullOrUndefined() && base.IsLooselyEqual(value);
+    }
 
-            return !value.IsNullOrUndefined() && base.IsLooselyEqual(value);
-        }
+    public override bool Equals(JsValue? obj)
+    {
+        return Equals(obj as JsBoolean);
+    }
 
-        public override bool Equals(JsValue? obj)
+    public bool Equals(JsBoolean? other)
+    {
+        if (ReferenceEquals(this, other))
         {
-            return Equals(obj as JsBoolean);
+            return true;
         }
 
-        public bool Equals(JsBoolean? other)
+        if (other is null)
         {
-            if (ReferenceEquals(this, other))
-            {
-                return true;
-            }
-
-            if (other is null)
-            {
-                return false;
-            }
-
-            return _value == other._value;
+            return false;
         }
 
-        public override int GetHashCode()
-        {
-            return _value.GetHashCode();
-        }
+        return _value == other._value;
+    }
+
+    public override int GetHashCode()
+    {
+        return _value.GetHashCode();
     }
 }

+ 24 - 25
Jint/Native/JsNull.cs

@@ -1,36 +1,35 @@
 using Jint.Runtime;
 
-namespace Jint.Native
+namespace Jint.Native;
+
+public sealed class JsNull : JsValue, IEquatable<JsNull>
 {
-    public sealed class JsNull : JsValue, IEquatable<JsNull>
+    internal JsNull() : base(Types.Null)
     {
-        internal JsNull() : base(Types.Null)
-        {
-        }
+    }
 
-        public override object ToObject()
-        {
-            return null!;
-        }
+    public override object ToObject()
+    {
+        return null!;
+    }
 
-        public override string ToString()
-        {
-            return "null";
-        }
+    public override string ToString()
+    {
+        return "null";
+    }
 
-        public override bool IsLooselyEqual(JsValue value)
-        {
-            return ReferenceEquals(Null, value) || ReferenceEquals(Undefined, value);
-        }
+    public override bool IsLooselyEqual(JsValue value)
+    {
+        return ReferenceEquals(Null, value) || ReferenceEquals(Undefined, value);
+    }
 
-        public override bool Equals(JsValue? obj)
-        {
-            return Equals(obj as JsNull);
-        }
+    public override bool Equals(JsValue? obj)
+    {
+        return Equals(obj as JsNull);
+    }
 
-        public bool Equals(JsNull? other)
-        {
-            return other is not null;
-        }
+    public bool Equals(JsNull? other)
+    {
+        return other is not null;
     }
 }

+ 207 - 214
Jint/Native/JsNumber.cs

@@ -3,297 +3,290 @@ using System.Runtime.CompilerServices;
 using Jint.Native.Number;
 using Jint.Runtime;
 
-namespace Jint.Native
+namespace Jint.Native;
+
+public sealed class JsNumber : JsValue, IEquatable<JsNumber>
 {
-    public sealed class JsNumber : JsValue, IEquatable<JsNumber>
-    {
-        // .NET double epsilon and JS epsilon have different values
-        internal const double JavaScriptEpsilon = 2.2204460492503130808472633361816E-16;
+    // .NET double epsilon and JS epsilon have different values
+    internal const double JavaScriptEpsilon = 2.2204460492503130808472633361816E-16;
 
-        internal readonly double _value;
+    internal readonly double _value;
 
-        // how many decimals to check when determining if double is actually an int
-        internal const double DoubleIsIntegerTolerance = double.Epsilon * 100;
+    // how many decimals to check when determining if double is actually an int
+    internal const double DoubleIsIntegerTolerance = double.Epsilon * 100;
 
-        internal static readonly long NegativeZeroBits = BitConverter.DoubleToInt64Bits(-0.0);
+    internal static readonly long NegativeZeroBits = BitConverter.DoubleToInt64Bits(-0.0);
 
-        // we can cache most common values, doubles are used in indexing too at times so we also cache
-        // integer values converted to doubles
-        private const int NumbersMax = 1024 * 10;
-        private static readonly JsNumber[] _intToJsValue;
+    // we can cache most common values, doubles are used in indexing too at times so we also cache
+    // integer values converted to doubles
+    private const int NumbersMax = 1024 * 10;
+    private static readonly JsNumber[] _intToJsValue;
 
-        internal static readonly JsNumber DoubleNaN = new JsNumber(double.NaN);
-        internal static readonly JsNumber DoubleNegativeOne = new JsNumber((double) -1);
-        internal static readonly JsNumber DoublePositiveInfinity = new JsNumber(double.PositiveInfinity);
-        internal static readonly JsNumber DoubleNegativeInfinity = new JsNumber(double.NegativeInfinity);
-        internal static readonly JsNumber IntegerNegativeOne = new JsNumber(-1);
-        internal static readonly JsNumber NegativeZero = new JsNumber(-0d);
-        internal static readonly JsNumber PositiveZero = new JsNumber(+0);
-        internal static readonly JsNumber PositiveOne = new JsNumber(1);
-        internal static readonly JsNumber PositiveTwo = new JsNumber(2);
-        internal static readonly JsNumber PositiveThree = new JsNumber(3);
+    internal static readonly JsNumber DoubleNaN = new JsNumber(double.NaN);
+    internal static readonly JsNumber DoubleNegativeOne = new JsNumber((double) -1);
+    internal static readonly JsNumber DoublePositiveInfinity = new JsNumber(double.PositiveInfinity);
+    internal static readonly JsNumber DoubleNegativeInfinity = new JsNumber(double.NegativeInfinity);
+    internal static readonly JsNumber IntegerNegativeOne = new JsNumber(-1);
+    internal static readonly JsNumber NegativeZero = new JsNumber(-0d);
+    internal static readonly JsNumber PositiveZero = new JsNumber(+0);
+    internal static readonly JsNumber PositiveOne = new JsNumber(1);
+    internal static readonly JsNumber PositiveTwo = new JsNumber(2);
+    internal static readonly JsNumber PositiveThree = new JsNumber(3);
 
-        internal static readonly JsNumber PI = new JsNumber(System.Math.PI);
+    internal static readonly JsNumber PI = new JsNumber(System.Math.PI);
 
-        static JsNumber()
+    static JsNumber()
+    {
+        var integers = new JsNumber[NumbersMax];
+        for (uint i = 0; i < (uint) integers.Length; i++)
         {
-            var integers = new JsNumber[NumbersMax];
-            for (uint i = 0; i < (uint) integers.Length; i++)
-            {
-                integers[i] = new JsNumber(i);
-            }
-            _intToJsValue = integers;
+            integers[i] = new JsNumber(i);
         }
+        _intToJsValue = integers;
+    }
 
-        public JsNumber(double value) : base(Types.Number)
-        {
-            _value = value;
-        }
+    public JsNumber(double value) : base(Types.Number)
+    {
+        _value = value;
+    }
 
-        public JsNumber(int value) : base(InternalTypes.Integer)
-        {
-            _value = value;
-        }
+    public JsNumber(int value) : base(InternalTypes.Integer)
+    {
+        _value = value;
+    }
 
-        public JsNumber(uint value) : base(value <= int.MaxValue ? InternalTypes.Integer : InternalTypes.Number)
-        {
-            _value = value;
-        }
+    public JsNumber(uint value) : base(value <= int.MaxValue ? InternalTypes.Integer : InternalTypes.Number)
+    {
+        _value = value;
+    }
 
-        public JsNumber(ulong value) : base(value <= int.MaxValue ? InternalTypes.Integer : InternalTypes.Number)
-        {
-            _value = value;
-        }
+    public JsNumber(ulong value) : base(value <= int.MaxValue ? InternalTypes.Integer : InternalTypes.Number)
+    {
+        _value = value;
+    }
 
-        public JsNumber(long value) : base(value <= int.MaxValue && value >= int.MinValue ? InternalTypes.Integer : InternalTypes.Number)
-        {
-            _value = value;
-        }
+    public JsNumber(long value) : base(value is <= int.MaxValue and >= int.MinValue ? InternalTypes.Integer : InternalTypes.Number)
+    {
+        _value = value;
+    }
 
-        public override object ToObject()
-        {
-            return _value;
-        }
+    public override object ToObject()
+    {
+        return _value;
+    }
 
-        internal static JsNumber Create(object value)
+    internal static JsNumber Create(object value)
+    {
+        var underlyingType = System.Type.GetTypeCode(Enum.GetUnderlyingType(value.GetType()));
+        return underlyingType switch
         {
-            var underlyingType = System.Type.GetTypeCode(Enum.GetUnderlyingType(value.GetType()));
-            return underlyingType switch
-            {
-                TypeCode.Int64 => Create(Convert.ToInt64(value)),
-                TypeCode.UInt32 => Create(Convert.ToUInt64(value)),
-                TypeCode.UInt64 => Create(Convert.ToUInt64(value)),
-                _ => Create(Convert.ToInt32(value))
-            };
-        }
+            TypeCode.Int64 => Create(Convert.ToInt64(value)),
+            TypeCode.UInt32 => Create(Convert.ToUInt64(value)),
+            TypeCode.UInt64 => Create(Convert.ToUInt64(value)),
+            _ => Create(Convert.ToInt32(value))
+        };
+    }
 
-        public static JsNumber Create(decimal value)
-        {
-            return Create((double) value);
-        }
+    public static JsNumber Create(decimal value)
+    {
+        return Create((double) value);
+    }
 
-        [MethodImpl(MethodImplOptions.AggressiveInlining)]
-        public static JsNumber Create(double value)
+    public static JsNumber Create(double value)
+    {
+        // we expect zero to be on the fast path of integer mostly
+        if (TypeConverter.IsIntegralNumber(value) && value is > long.MinValue and < long.MaxValue && !NumberInstance.IsNegativeZero(value))
         {
-            // we expect zero to be on the fast path of integer mostly
-            var temp = _intToJsValue;
-            if (value >= 1 && value < temp.Length && TypeConverter.IsIntegralNumber(value))
-            {
-                return temp[(uint) value];
-            }
-
-            if (value == -1)
-            {
-                return DoubleNegativeOne;
-            }
-
-            return CreateNumberUnlikely(value);
+            var longValue = (long) value;
+            return longValue == -1 ? IntegerNegativeOne : Create(longValue);
         }
 
-        [MethodImpl(MethodImplOptions.NoInlining)]
-        private static JsNumber CreateNumberUnlikely(double value)
-        {
-            if (value <= double.MaxValue && value >= double.MinValue)
-            {
-                return new JsNumber(value);
-            }
-
-            if (value == double.NegativeInfinity)
-            {
-                return DoubleNegativeInfinity;
-            }
-
-            if (value == double.PositiveInfinity)
-            {
-                return DoublePositiveInfinity;
-            }
-
-            if (double.IsNaN(value))
-            {
-                return DoubleNaN;
-            }
+        return CreateNumberUnlikely(value);
+    }
 
+    [MethodImpl(MethodImplOptions.NoInlining)]
+    private static JsNumber CreateNumberUnlikely(double value)
+    {
+        if (value is <= double.MaxValue and >= double.MinValue)
+        {
             return new JsNumber(value);
         }
 
-        public static JsNumber Create(byte value)
+        if (double.IsNegativeInfinity(value))
         {
-            return _intToJsValue[value];
+            return DoubleNegativeInfinity;
         }
 
-        internal static JsNumber Create(sbyte value)
+        if (double.IsPositiveInfinity(value ))
         {
-            var temp = _intToJsValue;
-            if ((uint) value < (uint) temp.Length)
-            {
-                return temp[value];
-            }
-            return new JsNumber(value);
+            return DoublePositiveInfinity;
         }
 
-        public static JsNumber Create(int value)
+        if (double.IsNaN(value))
         {
-            var temp = _intToJsValue;
-            if ((uint) value < (uint) temp.Length)
-            {
-                return temp[value];
-            }
-
-            if (value == -1)
-            {
-                return IntegerNegativeOne;
-            }
-
-            return new JsNumber(value);
+            return DoubleNaN;
         }
 
-        internal static JsNumber Create(uint value)
-        {
-            var temp = _intToJsValue;
-            if (value < (uint) temp.Length)
-            {
-                return temp[value];
-            }
+        return new JsNumber(value);
+    }
 
-            return new JsNumber(value);
-        }
+    public static JsNumber Create(byte value)
+    {
+        return _intToJsValue[value];
+    }
 
-        internal static JsNumber Create(ulong value)
+    internal static JsNumber Create(sbyte value)
+    {
+        var temp = _intToJsValue;
+        if ((uint) value < (uint) temp.Length)
         {
-            if (value < (ulong) _intToJsValue.Length)
-            {
-                return _intToJsValue[value];
-            }
-
-            return new JsNumber(value);
+            return temp[value];
         }
+        return new JsNumber(value);
+    }
 
-        public static JsNumber Create(long value)
+    public static JsNumber Create(int value)
+    {
+        var temp = _intToJsValue;
+        if ((uint) value < (uint) temp.Length)
         {
-            if ((ulong) value < (ulong) _intToJsValue.Length)
-            {
-                return _intToJsValue[value];
-            }
-
-            return new JsNumber(value);
+            return temp[value];
         }
 
-        public static JsNumber Create(JsValue jsValue)
+        if (value == -1)
         {
-            if (jsValue is JsNumber number)
-            {
-                return number;
-            }
-
-            return Create(TypeConverter.ToNumber(jsValue));
+            return IntegerNegativeOne;
         }
 
-        public override string ToString()
-        {
-            return TypeConverter.ToString(_value);
-        }
+        return new JsNumber(value);
+    }
 
-        internal bool IsNaN()
+    internal static JsNumber Create(uint value)
+    {
+        var temp = _intToJsValue;
+        if (value < (uint) temp.Length)
         {
-            return double.IsNaN(_value);
+            return temp[value];
         }
 
-        /// <summary>
-        /// Either positive or negative zero.
-        /// </summary>
-        internal bool IsZero()
+        return new JsNumber(value);
+    }
+
+    internal static JsNumber Create(ulong value)
+    {
+        if (value < (ulong) _intToJsValue.Length)
         {
-            return IsNegativeZero() || IsPositiveZero();
+            return _intToJsValue[value];
         }
 
-        internal bool IsNegativeZero()
+        return new JsNumber(value);
+    }
+
+    public static JsNumber Create(long value)
+    {
+        if ((ulong) value < (ulong) _intToJsValue.Length)
         {
-            return NumberInstance.IsNegativeZero(_value);
+            return _intToJsValue[value];
         }
 
-        internal bool IsPositiveZero()
+        return new JsNumber(value);
+    }
+
+    public static JsNumber Create(JsValue jsValue)
+    {
+        if (jsValue is JsNumber number)
         {
-            return NumberInstance.IsPositiveZero(_value);
+            return number;
         }
 
-        internal bool IsPositiveInfinity()
+        return Create(TypeConverter.ToNumber(jsValue));
+    }
+
+    public override string ToString()
+    {
+        return TypeConverter.ToString(_value);
+    }
+
+    internal bool IsNaN()
+    {
+        return double.IsNaN(_value);
+    }
+
+    /// <summary>
+    /// Either positive or negative zero.
+    /// </summary>
+    internal bool IsZero()
+    {
+        return IsNegativeZero() || IsPositiveZero();
+    }
+
+    internal bool IsNegativeZero()
+    {
+        return NumberInstance.IsNegativeZero(_value);
+    }
+
+    internal bool IsPositiveZero()
+    {
+        return NumberInstance.IsPositiveZero(_value);
+    }
+
+    internal bool IsPositiveInfinity()
+    {
+        return double.IsPositiveInfinity(_value);
+    }
+
+    internal bool IsNegativeInfinity()
+    {
+        return double.IsNegativeInfinity(_value);
+    }
+
+    public override bool IsLooselyEqual(JsValue value)
+    {
+        if (value is JsNumber jsNumber)
         {
-            return double.IsPositiveInfinity(_value);
+            return Equals(jsNumber);
         }
 
-        internal bool IsNegativeInfinity()
+        if (value.IsBigInt())
         {
-            return double.IsNegativeInfinity(_value);
+            return TypeConverter.IsIntegralNumber(_value) && new BigInteger(_value) == value.AsBigInt();
         }
 
-        public override bool IsLooselyEqual(JsValue value)
-        {
-            if (value is JsNumber jsNumber)
-            {
-                return Equals(jsNumber);
-            }
+        return base.IsLooselyEqual(value);
+    }
 
-            if (value.IsBigInt())
-            {
-                return TypeConverter.IsIntegralNumber(_value) && new BigInteger(_value) == value.AsBigInt();
-            }
+    public override bool Equals(JsValue? obj)
+    {
+        return Equals(obj as JsNumber);
+    }
 
-            return base.IsLooselyEqual(value);
-        }
+    public override bool Equals(object? obj)
+    {
+        return Equals(obj as JsNumber);
+    }
 
-        public override bool Equals(JsValue? obj)
+    public bool Equals(JsNumber? other)
+    {
+        if (other is null)
         {
-            return Equals(obj as JsNumber);
+            return false;
         }
 
-        public override bool Equals(object? obj)
+        if (double.IsNaN(_value) || double.IsNaN(other._value))
         {
-            return Equals(obj as JsNumber);
+            return false;
         }
 
-        public bool Equals(JsNumber? other)
+        if (ReferenceEquals(this, other))
         {
-            if (other is null)
-            {
-                return false;
-            }
-
-            if (double.IsNaN(_value) || double.IsNaN(other._value))
-            {
-                return false;
-            }
-
-            if (ReferenceEquals(this, other))
-            {
-                return true;
-            }
-
-            return _value == other._value;
+            return true;
         }
 
-        public override int GetHashCode()
-        {
-            return _value.GetHashCode();
-        }
+        return _value == other._value;
+    }
+
+    public override int GetHashCode()
+    {
+        return _value.GetHashCode();
     }
 }

+ 14 - 0
Jint/Native/JsObject.cs

@@ -0,0 +1,14 @@
+using Jint.Native.Object;
+using Jint.Runtime;
+
+namespace Jint.Native;
+
+/// <summary>
+/// Dynamically constructed JavaScript object instance.
+/// </summary>
+public sealed class JsObject : ObjectInstance
+{
+    public JsObject(Engine engine) : base(engine, type: InternalTypes.Object)
+    {
+    }
+}

+ 268 - 270
Jint/Native/JsString.cs

@@ -1,385 +1,383 @@
 using System.Text;
-using Jint.Native.Array;
 using Jint.Runtime;
 
-namespace Jint.Native
+namespace Jint.Native;
+
+public class JsString : JsValue, IEquatable<JsString>
 {
-    public class JsString : JsValue, IEquatable<JsString>
+    private const int AsciiMax = 126;
+    private static readonly JsString[] _charToJsValue;
+    private static readonly JsString[] _charToStringJsValue;
+    private static readonly JsString[] _intToStringJsValue;
+
+    public static readonly JsString Empty = new JsString("");
+    internal static readonly JsString NullString = new JsString("null");
+    internal static readonly JsString UndefinedString = new JsString("undefined");
+    internal static readonly JsString ObjectString = new JsString("object");
+    internal static readonly JsString FunctionString = new JsString("function");
+    internal static readonly JsString BooleanString = new JsString("boolean");
+    internal static readonly JsString StringString = new JsString("string");
+    internal static readonly JsString NumberString = new JsString("number");
+    internal static readonly JsString BigIntString = new JsString("bigint");
+    internal static readonly JsString SymbolString = new JsString("symbol");
+    internal static readonly JsString DefaultString = new JsString("default");
+    internal static readonly JsString NumberZeroString = new JsString("0");
+    internal static readonly JsString NumberOneString = new JsString("1");
+    internal static readonly JsString TrueString = new JsString("true");
+    internal static readonly JsString FalseString = new JsString("false");
+    internal static readonly JsString LengthString = new JsString("length");
+    internal static readonly JsValue CommaString = new JsString(",");
+
+    internal string _value;
+
+    static JsString()
     {
-        private const int AsciiMax = 126;
-        private static readonly JsString[] _charToJsValue;
-        private static readonly JsString[] _charToStringJsValue;
-        private static readonly JsString[] _intToStringJsValue;
-
-        public static readonly JsString Empty = new JsString("");
-        internal static readonly JsString NullString = new JsString("null");
-        internal static readonly JsString UndefinedString = new JsString("undefined");
-        internal static readonly JsString ObjectString = new JsString("object");
-        internal static readonly JsString FunctionString = new JsString("function");
-        internal static readonly JsString BooleanString = new JsString("boolean");
-        internal static readonly JsString StringString = new JsString("string");
-        internal static readonly JsString NumberString = new JsString("number");
-        internal static readonly JsString BigIntString = new JsString("bigint");
-        internal static readonly JsString SymbolString = new JsString("symbol");
-        internal static readonly JsString DefaultString = new JsString("default");
-        internal static readonly JsString NumberZeroString = new JsString("0");
-        internal static readonly JsString NumberOneString = new JsString("1");
-        internal static readonly JsString TrueString = new JsString("true");
-        internal static readonly JsString FalseString = new JsString("false");
-        internal static readonly JsString LengthString = new JsString("length");
-        internal static readonly JsValue CommaString = new JsString(",");
-
-        internal string _value;
-
-        static JsString()
-        {
-            _charToJsValue = new JsString[AsciiMax + 1];
-            _charToStringJsValue = new JsString[AsciiMax + 1];
-
-            for (var i = 0; i <= AsciiMax; i++)
-            {
-                _charToJsValue[i] = new JsString((char) i);
-                _charToStringJsValue[i] = new JsString(((char) i).ToString());
-            }
+        _charToJsValue = new JsString[AsciiMax + 1];
+        _charToStringJsValue = new JsString[AsciiMax + 1];
 
-            _intToStringJsValue = new JsString[1024];
-            for (var i = 0; i < _intToStringJsValue.Length; ++i)
-            {
-                _intToStringJsValue[i] = new JsString(TypeConverter.ToString(i));
-            }
+        for (var i = 0; i <= AsciiMax; i++)
+        {
+            _charToJsValue[i] = new JsString((char) i);
+            _charToStringJsValue[i] = new JsString(((char) i).ToString());
         }
 
-        public JsString(string value) : this(value, InternalTypes.String)
+        _intToStringJsValue = new JsString[1024];
+        for (var i = 0; i < _intToStringJsValue.Length; ++i)
         {
+            _intToStringJsValue[i] = new JsString(TypeConverter.ToString(i));
         }
+    }
+
+    public JsString(string value) : this(value, InternalTypes.String)
+    {
+    }
 
-        private JsString(string value, InternalTypes type) : base(type)
+    private JsString(string value, InternalTypes type) : base(type)
+    {
+        _value = value;
+    }
+
+    public JsString(char value) : base(Types.String)
+    {
+        _value = value.ToString();
+    }
+
+    public override object ToObject()
+    {
+        return _value;
+    }
+
+    public static bool operator ==(JsValue? a, JsString? b)
+    {
+        if (a is JsString s && b is not null)
         {
-            _value = value;
+            return s.ToString() == b.ToString();
         }
 
-        public override object ToObject()
+        if (a is null)
         {
-            return _value;
+            return b is null;
         }
 
-        public JsString(char value) : base(Types.String)
+        return b is not null && a.Equals(b);
+    }
+
+    public static bool operator ==(JsString? a, JsValue? b)
+    {
+        if (a is not null && b is JsString s)
         {
-            _value = value.ToString();
+            return s.ToString() == b.ToString();
         }
 
-        public static bool operator ==(JsValue? a, JsString? b)
+        if (a is null)
         {
-            if (a is JsString s && b is not null)
-            {
-                return s.ToString() == b.ToString();
-            }
+            return b is null;
+        }
 
-            if (a is null)
-            {
-                return b is null;
-            }
+        return b is not null && a.Equals(b);
+    }
 
-            return b is not null && a.Equals(b);
-        }
+    public static bool operator !=(JsString a, JsValue b)
+    {
+        return !(a == b);
+    }
 
-        public static bool operator ==(JsString? a, JsValue? b)
-        {
-            if (a is not null && b is JsString s)
-            {
-                return s.ToString() == b.ToString();
-            }
+    public static bool operator !=(JsValue a, JsString b)
+    {
+        return !(a == b);
+    }
 
-            if (a is null)
-            {
-                return b is null;
-            }
+    public virtual char this[int index] => _value[index];
 
-            return b is not null && a.Equals(b);
-        }
+    public virtual JsString Append(JsValue jsValue)
+    {
+        return new ConcatenatedString(string.Concat(_value, TypeConverter.ToString(jsValue)));
+    }
 
-        public static bool operator !=(JsString a, JsValue b)
-        {
-            return !(a == b);
-        }
+    internal virtual JsString EnsureCapacity(int capacity)
+    {
+        return new ConcatenatedString(_value, capacity);
+    }
+
+    internal virtual bool IsNullOrEmpty()
+    {
+        return string.IsNullOrEmpty(_value);
+    }
+
+    public virtual int Length => _value.Length;
 
-        public static bool operator !=(JsValue a, JsString b)
+    internal static JsString Create(string value)
+    {
+        if (value.Length > 1)
         {
-            return !(a == b);
+            return new JsString(value);
         }
 
-        public virtual char this[int index] => _value[index];
-
-        public virtual JsString Append(JsValue jsValue)
+        if (value.Length == 0)
         {
-            return new ConcatenatedString(string.Concat(_value, TypeConverter.ToString(jsValue)));
+            return Empty;
         }
 
-        internal virtual JsString EnsureCapacity(int capacity)
+        var i = (uint) value[0];
+        var temp = _charToStringJsValue;
+        if (i < (uint) temp.Length)
         {
-            return new ConcatenatedString(_value, capacity);
+            return temp[i];
         }
+        return new JsString(value);
+    }
 
-        internal virtual bool IsNullOrEmpty()
+    internal static JsString Create(char value)
+    {
+        var temp = _charToJsValue;
+        if (value < (uint) temp.Length)
         {
-            return string.IsNullOrEmpty(_value);
+            return temp[value];
         }
 
-        public virtual int Length => _value.Length;
+        return new JsString(value);
+    }
 
-        internal static JsString Create(string value)
+    internal static JsString Create(int value)
+    {
+        var temp = _intToStringJsValue;
+        if (value < (uint) temp.Length)
         {
-            if (value.Length > 1)
-            {
-                return new JsString(value);
-            }
+            return temp[value];
+        }
 
-            if (value.Length == 0)
-            {
-                return Empty;
-            }
+        return new JsString(TypeConverter.ToString(value));
+    }
 
-            var i = (uint) value[0];
-            var temp = _charToStringJsValue;
-            if (i < (uint) temp.Length)
-            {
-                return temp[i];
-            }
-            return new JsString(value);
+    internal static JsValue Create(uint value)
+    {
+        var temp = _intToStringJsValue;
+        if (value < (uint) temp.Length)
+        {
+            return temp[value];
         }
 
-        internal static JsString Create(char value)
-        {
-            var temp = _charToJsValue;
-            if (value < (uint) temp.Length)
-            {
-                return temp[value];
-            }
+        return new JsString(TypeConverter.ToString(value));
+    }
 
-            return new JsString(value);
+    internal static JsValue Create(ulong value)
+    {
+        var temp = _intToStringJsValue;
+        if (value < (uint) temp.Length)
+        {
+            return temp[value];
         }
 
-        internal static JsString Create(int value)
-        {
-            var temp = _intToStringJsValue;
-            if (value < (uint) temp.Length)
-            {
-                return temp[value];
-            }
+        return new JsString(TypeConverter.ToString(value));
+    }
 
-            return new JsString(TypeConverter.ToString(value));
-        }
+    public override string ToString()
+    {
+        return _value;
+    }
 
-        internal static JsValue Create(uint value)
+    public JsArray ToArray(Engine engine)
+    {
+        var array = engine.Realm.Intrinsics.Array.ArrayCreate((uint) _value.Length);
+        for (int i = 0; i < _value.Length; ++i)
         {
-            var temp = _intToStringJsValue;
-            if (value < (uint) temp.Length)
-            {
-                return temp[value];
-            }
-
-            return new JsString(TypeConverter.ToString(value));
+            array.SetIndexValue((uint) i, _value[i], updateLength: false);
         }
 
-        internal static JsValue Create(ulong value)
-        {
-            var temp = _intToStringJsValue;
-            if (value < (uint) temp.Length)
-            {
-                return temp[value];
-            }
+        return array;
+    }
 
-            return new JsString(TypeConverter.ToString(value));
-        }
+    internal int IndexOf(string value, StringComparison comparisonType)
+    {
+        return ToString().IndexOf(value, comparisonType);
+    }
 
-        public override string ToString()
-        {
-            return _value;
-        }
+    internal int IndexOf(char value)
+    {
+        return ToString().IndexOf(value);
+    }
 
-        public ArrayInstance ToArray(Engine engine)
-        {
-            var array = engine.Realm.Intrinsics.Array.ArrayCreate((uint) _value.Length);
-            for (int i = 0; i < _value.Length; ++i)
-            {
-                array.SetIndexValue((uint) i, _value[i], updateLength: false);
-            }
+    internal string Substring(int startIndex, int length)
+    {
+        return ToString().Substring(startIndex, length);
+    }
 
-            return array;
-        }
+    internal string Substring(int startIndex)
+    {
+        return ToString().Substring(startIndex);
+    }
 
-        internal int IndexOf(string value, StringComparison comparisonType)
-        {
-            return ToString().IndexOf(value, comparisonType);
-        }
+    public override bool Equals(JsValue? obj)
+    {
+        return Equals(obj as JsString);
+    }
 
-        internal int IndexOf(char value)
+    public bool Equals(JsString? other)
+    {
+        if (other is null)
         {
-            return ToString().IndexOf(value);
+            return false;
         }
 
-        internal string Substring(int startIndex, int length)
+        if (ReferenceEquals(this, other))
         {
-            return ToString().Substring(startIndex, length);
+            return true;
         }
 
-        internal string Substring(int startIndex)
+        return _value == other.ToString();
+    }
+
+    public override bool IsLooselyEqual(JsValue value)
+    {
+        if (value is JsString jsString)
         {
-            return ToString().Substring(startIndex);
+            return Equals(jsString);
         }
 
-        public override bool Equals(JsValue? obj)
+        if (value.IsBigInt())
         {
-            return Equals(obj as JsString);
+            return value.IsBigInt() && TypeConverter.TryStringToBigInt(ToString(), out var temp) && temp == value.AsBigInt();
         }
 
-        public bool Equals(JsString? other)
-        {
-            if (other is null)
-            {
-                return false;
-            }
+        return base.IsLooselyEqual(value);
+    }
 
-            if (ReferenceEquals(this, other))
-            {
-                return true;
-            }
+    public override bool Equals(object obj)
+    {
+        return Equals(obj as JsString);
+    }
 
-            return _value == other.ToString();
-        }
+    public override int GetHashCode()
+    {
+        return _value.GetHashCode();
+    }
+
+    internal sealed class ConcatenatedString : JsString
+    {
+        private StringBuilder? _stringBuilder;
+        private bool _dirty;
 
-        public override bool IsLooselyEqual(JsValue value)
+        internal ConcatenatedString(string value, int capacity = 0)
+            : base(value, InternalTypes.String | InternalTypes.RequiresCloning)
         {
-            if (value is JsString jsString)
+            if (capacity > 0)
             {
-                return Equals(jsString);
+                _stringBuilder = new StringBuilder(value, capacity);
             }
-
-            if (value.IsBigInt())
+            else
             {
-                return value.IsBigInt() && TypeConverter.TryStringToBigInt(ToString(), out var temp) && temp == value.AsBigInt();
+                _value = value;
             }
-
-            return base.IsLooselyEqual(value);
         }
 
-        public override bool Equals(object obj)
+        public override string ToString()
         {
-            return Equals(obj as JsString);
-        }
+            if (_dirty)
+            {
+                _value = _stringBuilder!.ToString();
+                _dirty = false;
+            }
 
-        public override int GetHashCode()
-        {
-            return _value.GetHashCode();
+            return _value;
         }
 
-        internal sealed class ConcatenatedString : JsString
-        {
-            private StringBuilder? _stringBuilder;
-            private bool _dirty;
+        public override char this[int index] => _stringBuilder?[index] ?? _value[index];
 
-            internal ConcatenatedString(string value, int capacity = 0)
-                : base(value, InternalTypes.String | InternalTypes.RequiresCloning)
+        public override JsString Append(JsValue jsValue)
+        {
+            var value = TypeConverter.ToString(jsValue);
+            if (_stringBuilder == null)
             {
-                if (capacity > 0)
-                {
-                    _stringBuilder = new StringBuilder(value, capacity);
-                }
-                else
-                {
-                    _value = value;
-                }
+                _stringBuilder = new StringBuilder(_value, _value.Length + value.Length);
             }
 
-            public override string ToString()
-            {
-                if (_dirty)
-                {
-                    _value = _stringBuilder!.ToString();
-                    _dirty = false;
-                }
-
-                return _value;
-            }
+            _stringBuilder.Append(value);
+            _dirty = true;
 
-            public override char this[int index] => _stringBuilder?[index] ?? _value[index];
+            return this;
+        }
 
-            public override JsString Append(JsValue jsValue)
-            {
-                var value = TypeConverter.ToString(jsValue);
-                if (_stringBuilder == null)
-                {
-                    _stringBuilder = new StringBuilder(_value, _value.Length + value.Length);
-                }
+        internal override JsString EnsureCapacity(int capacity)
+        {
+            _stringBuilder!.EnsureCapacity(capacity);
+            return this;
+        }
 
-                _stringBuilder.Append(value);
-                _dirty = true;
+        internal override bool IsNullOrEmpty()
+        {
+            return _stringBuilder == null && string.IsNullOrEmpty(_value)
+                   || _stringBuilder != null && _stringBuilder.Length == 0;
+        }
 
-                return this;
-            }
+        public override int Length => _stringBuilder?.Length ?? _value?.Length ?? 0;
 
-            internal override JsString EnsureCapacity(int capacity)
-            {
-                _stringBuilder!.EnsureCapacity(capacity);
-                return this;
-            }
+        public override object ToObject() => ToString();
 
-            internal override bool IsNullOrEmpty()
+        public override bool Equals(JsValue? other)
+        {
+            if (other is ConcatenatedString cs)
             {
-                return _stringBuilder == null && string.IsNullOrEmpty(_value)
-                    || _stringBuilder != null && _stringBuilder.Length == 0;
-            }
-
-            public override int Length => _stringBuilder?.Length ?? _value?.Length ?? 0;
+                var stringBuilder = _stringBuilder;
+                var csStringBuilder = cs._stringBuilder;
 
-            public override object ToObject() => ToString();
-
-            public override bool Equals(JsValue? other)
-            {
-                if (other is ConcatenatedString cs)
+                // we cannot use StringBuilder.Equals as it also checks Capacity on full framework / pre .NET Core 3
+                if (stringBuilder != null && csStringBuilder != null && stringBuilder.Length == csStringBuilder.Length)
                 {
-                    var stringBuilder = _stringBuilder;
-                    var csStringBuilder = cs._stringBuilder;
-
-                    // we cannot use StringBuilder.Equals as it also checks Capacity on full framework / pre .NET Core 3
-                    if (stringBuilder != null && csStringBuilder != null && stringBuilder.Length == csStringBuilder.Length)
+                    for (var i = 0; i < stringBuilder.Length; ++i)
                     {
-                        for (var i = 0; i < stringBuilder.Length; ++i)
+                        if (stringBuilder[i] != csStringBuilder[i])
                         {
-                            if (stringBuilder[i] != csStringBuilder[i])
-                            {
-                                return false;
-                            }
+                            return false;
                         }
-
-                        return true;
                     }
 
-                    return ToString() == cs.ToString();
+                    return true;
                 }
 
-                if (other is JsString jsString)
-                {
-                    if (jsString._value.Length != Length)
-                    {
-                        return false;
-                    }
+                return ToString() == cs.ToString();
+            }
 
-                    return ToString() == jsString._value;
+            if (other is JsString jsString)
+            {
+                if (jsString._value.Length != Length)
+                {
+                    return false;
                 }
 
-                return base.Equals(other);
+                return ToString() == jsString._value;
             }
 
-            public override int GetHashCode()
-            {
-                return _stringBuilder?.GetHashCode() ?? _value.GetHashCode();
-            }
+            return base.Equals(other);
+        }
 
-            internal override JsValue DoClone()
-            {
-                return new JsString(ToString());
-            }
+        public override int GetHashCode()
+        {
+            return _stringBuilder?.GetHashCode() ?? _value.GetHashCode();
+        }
+
+        internal override JsValue DoClone()
+        {
+            return new JsString(ToString());
         }
     }
 }

+ 38 - 42
Jint/Native/JsSymbol.cs

@@ -1,51 +1,47 @@
 using System.Runtime.CompilerServices;
 using Jint.Runtime;
 
-namespace Jint.Native
+namespace Jint.Native;
+
+public sealed class JsSymbol : JsValue, IEquatable<JsSymbol>
 {
+    internal readonly JsValue _value;
+
+    internal JsSymbol(string value) : this(new JsString(value))
+    {
+    }
+
+    internal JsSymbol(JsValue value) : base(Types.Symbol)
+    {
+        _value = value;
+    }
+
+    public override object ToObject()
+    {
+        return _value;
+    }
+
     /// <summary>
-    /// The _object value of a <see cref="JsSymbol"/> is the [[Description]] internal slot.
+    /// https://tc39.es/ecma262/#sec-symboldescriptivestring
     /// </summary>
-    public sealed class JsSymbol : JsValue, IEquatable<JsSymbol>
+    public override string ToString()
+    {
+        var value = _value.IsUndefined() ? "" : _value.AsString();
+        return "Symbol(" + value + ")";
+    }
+
+    public override bool Equals(JsValue? obj)
+    {
+        return Equals(obj as JsSymbol);
+    }
+
+    public bool Equals(JsSymbol? other)
+    {
+        return ReferenceEquals(this, other);
+    }
+
+    public override int GetHashCode()
     {
-        internal readonly JsValue _value;
-
-        internal JsSymbol(string value) : this(new JsString(value))
-        {
-        }
-
-        internal JsSymbol(JsValue value) : base(Types.Symbol)
-        {
-            _value = value;
-        }
-
-        public override object ToObject()
-        {
-            return _value;
-        }
-
-        /// <summary>
-        /// https://tc39.es/ecma262/#sec-symboldescriptivestring
-        /// </summary>
-        public override string ToString()
-        {
-            var value = _value.IsUndefined() ? "" : _value.AsString();
-            return "Symbol(" + value + ")";
-        }
-
-        public override bool Equals(JsValue? obj)
-        {
-            return Equals(obj as JsSymbol);
-        }
-
-        public bool Equals(JsSymbol? other)
-        {
-            return ReferenceEquals(this, other);
-        }
-
-        public override int GetHashCode()
-        {
-            return RuntimeHelpers.GetHashCode(this);
-        }
+        return RuntimeHelpers.GetHashCode(this);
     }
 }

+ 24 - 25
Jint/Native/JsUndefined.cs

@@ -1,36 +1,35 @@
 using Jint.Runtime;
 
-namespace Jint.Native
+namespace Jint.Native;
+
+public sealed class JsUndefined : JsValue, IEquatable<JsUndefined>
 {
-    public sealed class JsUndefined : JsValue, IEquatable<JsUndefined>
+    internal JsUndefined() : base(Types.Undefined)
     {
-        internal JsUndefined() : base(Types.Undefined)
-        {
-        }
+    }
 
-        public override object ToObject()
-        {
-            return null!;
-        }
+    public override object ToObject()
+    {
+        return null!;
+    }
 
-        public override string ToString()
-        {
-            return "undefined";
-        }
+    public override string ToString()
+    {
+        return "undefined";
+    }
 
-        public override bool IsLooselyEqual(JsValue value)
-        {
-            return ReferenceEquals(Undefined, value) || ReferenceEquals(Null, value);
-        }
+    public override bool IsLooselyEqual(JsValue value)
+    {
+        return ReferenceEquals(Undefined, value) || ReferenceEquals(Null, value);
+    }
 
-        public override bool Equals(JsValue? obj)
-        {
-            return Equals(obj as JsUndefined);
-        }
+    public override bool Equals(JsValue? obj)
+    {
+        return Equals(obj as JsUndefined);
+    }
 
-        public bool Equals(JsUndefined? other)
-        {
-            return !ReferenceEquals(null, other);
-        }
+    public bool Equals(JsUndefined? other)
+    {
+        return !ReferenceEquals(null, other);
     }
 }

+ 6 - 6
Jint/Native/Json/JsonParser.cs

@@ -282,13 +282,13 @@ namespace Jint.Native.Json
         private Token ScanNullLiteral()
         {
             int start = _index;
-            if (ConsumeMatch(Null.Text))
+            if (ConsumeMatch("null"))
             {
                 return new Token
                 {
                     Type = Tokens.NullLiteral,
-                    Text = Null.Text,
-                    Value = Null.Instance,
+                    Text = "null",
+                    Value = JsValue.Null,
                     LineNumber = _lineNumber,
                     LineStart = _lineStart,
                     Range = new[] { start, _index }
@@ -639,7 +639,7 @@ namespace Jint.Native.Json
                 if (Match(","))
                 {
                     Lex();
-                    elements.Add(Null.Instance);
+                    elements.Add(JsValue.Null);
                 }
                 else
                 {
@@ -721,7 +721,7 @@ namespace Jint.Native.Json
             {
                 case Tokens.NullLiteral:
                     var v = Lex().Value;
-                    return Null.Instance;
+                    return JsValue.Null;
                 case Tokens.BooleanLiteral:
                     // implicit conversion operator goes through caching
                     return (bool) Lex().Value ? JsBoolean.True : JsBoolean.False;
@@ -745,7 +745,7 @@ namespace Jint.Native.Json
             ThrowUnexpected(Lex());
 
             // can't be reached
-            return Null.Instance;
+            return JsValue.Null;
         }
 
         public JsValue Parse(string code)

+ 6 - 7
Jint/Native/Json/JsonSerializer.cs

@@ -1,5 +1,4 @@
 using Jint.Collections;
-using Jint.Native.Array;
 using Jint.Native.BigInt;
 using Jint.Native.Boolean;
 using Jint.Native.Global;
@@ -21,7 +20,7 @@ namespace Jint.Native.Json
         private string? _indent;
         private string? _gap;
         private List<JsValue>? _propertyList;
-        private JsValue _replacerFunction = Undefined.Instance;
+        private JsValue _replacerFunction = JsValue.Undefined;
 
         private static readonly JsString toJsonProperty = new("toJSON");
 
@@ -41,9 +40,9 @@ namespace Jint.Native.Json
 
             // for JSON.stringify(), any function passed as the first argument will return undefined
             // if the replacer is not defined. The function is not called either.
-            if (value.IsCallable && ReferenceEquals(replacer, Undefined.Instance))
+            if (value.IsCallable && ReferenceEquals(replacer, JsValue.Undefined))
             {
-                return Undefined.Instance;
+                return JsValue.Undefined;
             }
 
             if (replacer is ObjectInstance oi)
@@ -174,7 +173,7 @@ namespace Jint.Native.Json
                 };
             }
 
-            if (ReferenceEquals(value, Null.Instance))
+            if (ReferenceEquals(value, JsValue.Null))
             {
                 return JsString.NullString;
             }
@@ -191,7 +190,7 @@ namespace Jint.Native.Json
 
             if (value.IsNumber())
             {
-                var isFinite = GlobalObject.IsFinite(Undefined.Instance, Arguments.From(value));
+                var isFinite = GlobalObject.IsFinite(JsValue.Undefined, Arguments.From(value));
                 if (((JsBoolean) isFinite)._value)
                 {
                     return TypeConverter.ToJsString(value);
@@ -226,7 +225,7 @@ namespace Jint.Native.Json
 
         private static bool SerializesAsArray(ObjectInstance value)
         {
-            if (value is ArrayInstance)
+            if (value is JsArray)
             {
                 return true;
             }

+ 1 - 1
Jint/Native/Map/MapConstructor.cs

@@ -9,7 +9,7 @@ using Jint.Runtime.Interop;
 
 namespace Jint.Native.Map;
 
-public sealed class MapConstructor : FunctionInstance, IConstructor
+internal sealed class MapConstructor : FunctionInstance, IConstructor
 {
     private static readonly JsString _functionName = new("Map");
 

+ 1 - 1
Jint/Native/Map/MapInstance.cs

@@ -6,7 +6,7 @@ using Jint.Runtime.Descriptors;
 
 namespace Jint.Native.Map;
 
-public sealed class MapInstance : ObjectInstance
+internal sealed class MapInstance : ObjectInstance
 {
     private readonly Realm _realm;
     internal readonly OrderedDictionary<JsValue, JsValue> _map;

+ 1 - 1
Jint/Native/Map/MapPrototype.cs

@@ -10,7 +10,7 @@ namespace Jint.Native.Map;
 /// <summary>
 /// https://tc39.es/ecma262/#sec-map-objects
 /// </summary>
-public sealed class MapPrototype : Prototype
+internal sealed class MapPrototype : Prototype
 {
     private readonly MapConstructor _mapConstructor;
 

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

@@ -8,7 +8,7 @@ using Jint.Runtime.Interop;
 
 namespace Jint.Native.Math
 {
-    public sealed class MathInstance : ObjectInstance
+    internal sealed class MathInstance : ObjectInstance
     {
         private Random? _random;
 

+ 0 - 8
Jint/Native/Null.cs

@@ -1,8 +0,0 @@
-namespace Jint.Native
-{
-    public static class Null
-    {
-        public static readonly JsValue Instance = JsValue.Null;
-        public const string Text = "null";
-    }
-}

+ 1 - 1
Jint/Native/Number/NumberConstructor.cs

@@ -11,7 +11,7 @@ namespace Jint.Native.Number
     /// <summary>
     /// https://tc39.es/ecma262/#sec-number-constructor
     /// </summary>
-    public sealed class NumberConstructor : FunctionInstance, IConstructor
+    internal sealed class NumberConstructor : FunctionInstance, IConstructor
     {
         private static readonly JsString _functionName = new JsString("Number");
 

+ 21 - 22
Jint/Native/Number/NumberInstance.cs

@@ -2,34 +2,33 @@ using System.Runtime.CompilerServices;
 using Jint.Native.Object;
 using Jint.Runtime;
 
-namespace Jint.Native.Number
+namespace Jint.Native.Number;
+
+internal class NumberInstance : ObjectInstance, IPrimitiveInstance
 {
-    public class NumberInstance : ObjectInstance, IPrimitiveInstance
-    {
-        private static readonly long NegativeZeroBits = BitConverter.DoubleToInt64Bits(-0.0);
+    private static readonly long NegativeZeroBits = BitConverter.DoubleToInt64Bits(-0.0);
 
-        public NumberInstance(Engine engine, JsNumber value)
-            : base(engine, ObjectClass.Number)
-        {
-            NumberData = value;
-        }
+    public NumberInstance(Engine engine, JsNumber value)
+        : base(engine, ObjectClass.Number)
+    {
+        NumberData = value;
+    }
 
-        Types IPrimitiveInstance.Type => Types.Number;
+    Types IPrimitiveInstance.Type => Types.Number;
 
-        JsValue IPrimitiveInstance.PrimitiveValue => NumberData;
+    JsValue IPrimitiveInstance.PrimitiveValue => NumberData;
 
-        public JsNumber NumberData { get; }
+    public JsNumber NumberData { get; }
 
-        [MethodImpl(MethodImplOptions.AggressiveInlining)]
-        public static bool IsNegativeZero(double x)
-        {
-            return x == 0 && BitConverter.DoubleToInt64Bits(x) == NegativeZeroBits;
-        }
+    [MethodImpl(MethodImplOptions.AggressiveInlining)]
+    public static bool IsNegativeZero(double x)
+    {
+        return x == 0 && BitConverter.DoubleToInt64Bits(x) == NegativeZeroBits;
+    }
 
-        [MethodImpl(MethodImplOptions.AggressiveInlining)]
-        public static bool IsPositiveZero(double x)
-        {
-            return x == 0 && BitConverter.DoubleToInt64Bits(x) != NegativeZeroBits;
-        }
+    [MethodImpl(MethodImplOptions.AggressiveInlining)]
+    public static bool IsPositiveZero(double x)
+    {
+        return x == 0 && BitConverter.DoubleToInt64Bits(x) != NegativeZeroBits;
     }
 }

+ 1 - 1
Jint/Native/Number/NumberPrototype.cs

@@ -14,7 +14,7 @@ namespace Jint.Native.Number
     /// <summary>
     /// https://tc39.es/ecma262/#sec-properties-of-the-number-prototype-object
     /// </summary>
-    public sealed class NumberPrototype : NumberInstance
+    internal sealed class NumberPrototype : NumberInstance
     {
         private readonly Realm _realm;
         private readonly NumberConstructor _constructor;

+ 3 - 3
Jint/Native/Object/ObjectConstructor.cs

@@ -162,7 +162,7 @@ namespace Jint.Native.Object
                 return OrdinaryCreateFromConstructor(
                     newTarget,
                     static intrinsics => intrinsics.Object.PrototypeObject,
-                    static (Engine engine, Realm _, object? _) => new ObjectInstance(engine));
+                    static (Engine engine, Realm _, object? _) => new JsObject(engine));
             }
 
             if (arguments.Length > 0)
@@ -181,12 +181,12 @@ namespace Jint.Native.Object
             }
 
 
-            return new ObjectInstance(_engine);
+            return new JsObject(_engine);
         }
 
         internal ObjectInstance Construct(int propertyCount)
         {
-            var obj = new ObjectInstance(_engine);
+            var obj = new JsObject(_engine);
             obj.SetProperties(propertyCount > 0  ? new PropertyDictionary(propertyCount, checkExistingKeys: true) : null);
             return obj;
         }

+ 11 - 8
Jint/Native/Object/ObjectInstance.cs

@@ -5,7 +5,6 @@ using Jint.Collections;
 using Jint.Native.Array;
 using Jint.Native.BigInt;
 using Jint.Native.Boolean;
-using Jint.Native.Date;
 using Jint.Native.Function;
 using Jint.Native.Number;
 using Jint.Native.RegExp;
@@ -28,7 +27,7 @@ namespace Jint.Native.Object
         internal ObjectInstance? _prototype;
         protected readonly Engine _engine;
 
-        public ObjectInstance(Engine engine) : this(engine, ObjectClass.Object)
+        protected ObjectInstance(Engine engine) : this(engine, ObjectClass.Object)
         {
         }
 
@@ -446,7 +445,7 @@ namespace Jint.Native.Object
         [MethodImpl(MethodImplOptions.AggressiveInlining)]
         public bool Set(JsValue p, JsValue v, bool throwOnError)
         {
-            if (!Set(p, v, this) && throwOnError)
+            if (!Set(p, v) && throwOnError)
             {
                 ExceptionHelper.ThrowTypeError(_engine.Realm);
             }
@@ -476,6 +475,7 @@ namespace Jint.Native.Object
                 {
                     return parent.Set(property, value, receiver);
                 }
+
                 ownDesc = _marker;
             }
 
@@ -518,7 +518,10 @@ namespace Jint.Native.Object
                 return false;
             }
 
-            _engine.Call(setter, receiver, new[] { value }, expression: null);
+            _engine.Call(setter, receiver, new[]
+            {
+                value
+            }, expression: null);
 
             return true;
         }
@@ -901,7 +904,7 @@ namespace Jint.Native.Object
                     break;
 
                 case ObjectClass.Date:
-                    if (this is DateInstance dateInstance)
+                    if (this is JsDate dateInstance)
                     {
                         converted = dateInstance.ToDateTime();
                     }
@@ -941,7 +944,7 @@ namespace Jint.Native.Object
                 case ObjectClass.Arguments:
                 case ObjectClass.Object:
 
-                    if (this is ArrayInstance arrayInstance)
+                    if (this is JsArray arrayInstance)
                     {
                         var result = new object?[arrayInstance.Length];
                         for (uint i = 0; i < result.Length; i++)
@@ -1220,7 +1223,7 @@ namespace Jint.Native.Object
         /// </summary>
         internal static ObjectInstance OrdinaryObjectCreate(Engine engine, ObjectInstance? proto)
         {
-            var prototype = new ObjectInstance(engine)
+            var prototype = new JsObject(engine)
             {
                 _prototype = proto
             };
@@ -1268,7 +1271,7 @@ namespace Jint.Native.Object
             }
         }
 
-        internal ArrayInstance EnumerableOwnPropertyNames(EnumerableOwnPropertyNamesKind kind)
+        internal JsArray EnumerableOwnPropertyNames(EnumerableOwnPropertyNamesKind kind)
         {
             var ownKeys = GetOwnPropertyKeys(Types.String);
 

+ 2 - 2
Jint/Native/Object/ObjectPrototype.cs

@@ -245,7 +245,7 @@ namespace Jint.Native.Object
         /// <summary>
         /// https://tc39.es/ecma262/#sec-object.prototype.tostring
         /// </summary>
-        public JsValue ToObjectString(JsValue thisObject, JsValue[] arguments)
+        internal JsValue ToObjectString(JsValue thisObject, JsValue[] arguments)
         {
             if (thisObject.IsUndefined())
             {
@@ -283,7 +283,7 @@ namespace Jint.Native.Object
         /// <summary>
         /// http://www.ecma-international.org/ecma-262/5.1/#sec-15.2.4.5
         /// </summary>
-        public JsValue HasOwnProperty(JsValue thisObject, JsValue[] arguments)
+        private JsValue HasOwnProperty(JsValue thisObject, JsValue[] arguments)
         {
             var p = TypeConverter.ToPropertyKey(arguments[0]);
             var o = TypeConverter.ToObject(_realm, thisObject);

+ 1 - 1
Jint/Native/Promise/PromiseConstructor.cs

@@ -17,7 +17,7 @@ namespace Jint.Native.Promise
         JsValue ResolveObj
     );
 
-    public sealed class PromiseConstructor : FunctionInstance, IConstructor
+    internal sealed class PromiseConstructor : FunctionInstance, IConstructor
     {
         private static readonly JsString _functionName = new JsString("Promise");
 

+ 133 - 134
Jint/Native/Promise/PromiseInstance.cs

@@ -4,181 +4,180 @@ using Jint.Runtime;
 using Jint.Runtime.Descriptors;
 using Jint.Runtime.Interop;
 
-namespace Jint.Native.Promise
+namespace Jint.Native.Promise;
+
+internal enum PromiseState
 {
-    internal enum PromiseState
-    {
-        Pending,
-        Fulfilled,
-        Rejected
-    }
+    Pending,
+    Fulfilled,
+    Rejected
+}
 
-    internal enum ReactionType
-    {
-        Fulfill,
-        Reject
-    }
+internal enum ReactionType
+{
+    Fulfill,
+    Reject
+}
 
-    internal sealed record PromiseReaction(
-        ReactionType Type,
-        PromiseCapability Capability,
-        JsValue Handler
-    );
+internal sealed record PromiseReaction(
+    ReactionType Type,
+    PromiseCapability Capability,
+    JsValue Handler
+);
 
-    internal sealed record ResolvingFunctions(
-        FunctionInstance Resolve,
-        FunctionInstance Reject
-    );
+internal sealed record ResolvingFunctions(
+    FunctionInstance Resolve,
+    FunctionInstance Reject
+);
 
-    public sealed record ManualPromise(
-        JsValue Promise,
-        Action<JsValue> Resolve,
-        Action<JsValue> Reject
-    );
+public sealed record ManualPromise(
+    JsValue Promise,
+    Action<JsValue> Resolve,
+    Action<JsValue> Reject
+);
 
 
-    internal sealed class PromiseInstance : ObjectInstance
-    {
-        internal PromiseState State { get; private set; }
+internal sealed class PromiseInstance : ObjectInstance
+{
+    internal PromiseState State { get; private set; }
 
-        // valid only in settled state (Fulfilled or Rejected)
-        internal JsValue Value { get; private set; } = null!;
+    // valid only in settled state (Fulfilled or Rejected)
+    internal JsValue Value { get; private set; } = null!;
 
-        internal List<PromiseReaction> PromiseRejectReactions = new();
-        internal List<PromiseReaction> PromiseFulfillReactions = new();
+    internal List<PromiseReaction> PromiseRejectReactions = new();
+    internal List<PromiseReaction> PromiseFulfillReactions = new();
 
-        internal PromiseInstance(Engine engine) : base(engine)
-        {
-        }
+    internal PromiseInstance(Engine engine) : base(engine)
+    {
+    }
 
-        // https://tc39.es/ecma262/#sec-createresolvingfunctions
-        // Note that functions capture over alreadyResolved
-        // that does imply that the same promise can be resolved twice but with different resolving functions
-        internal ResolvingFunctions CreateResolvingFunctions()
+    // https://tc39.es/ecma262/#sec-createresolvingfunctions
+    // Note that functions capture over alreadyResolved
+    // that does imply that the same promise can be resolved twice but with different resolving functions
+    internal ResolvingFunctions CreateResolvingFunctions()
+    {
+        var alreadyResolved = false;
+        var resolve = new ClrFunctionInstance(_engine, "", (thisObj, args) =>
         {
-            var alreadyResolved = false;
-            var resolve = new ClrFunctionInstance(_engine, "", (thisObj, args) =>
-            {
-                if (alreadyResolved)
-                {
-                    return Undefined;
-                }
-
-                alreadyResolved = true;
-                return Resolve(thisObj, args);
-            }, 1, PropertyFlag.Configurable);
-
-            var reject = new ClrFunctionInstance(_engine, "", (thisObj, args) =>
+            if (alreadyResolved)
             {
-                if (alreadyResolved)
-                {
-                    return Undefined;
-                }
-
-                alreadyResolved = true;
-                return Reject(thisObj, args);
-            }, 1, PropertyFlag.Configurable);
+                return Undefined;
+            }
 
-            return new ResolvingFunctions(resolve, reject);
-        }
+            alreadyResolved = true;
+            return Resolve(thisObj, args);
+        }, 1, PropertyFlag.Configurable);
 
-        // https://tc39.es/ecma262/#sec-promise-resolve-functions
-        private JsValue Resolve(JsValue thisObj, JsValue[] arguments)
+        var reject = new ClrFunctionInstance(_engine, "", (thisObj, args) =>
         {
-            // Note that alreadyResolved logic lives in CreateResolvingFunctions method
-
-            var result = arguments.At(0);
-
-            if (ReferenceEquals(result, this))
+            if (alreadyResolved)
             {
-                return RejectPromise(_engine.Realm.Intrinsics.TypeError.Construct("Cannot resolve Promise with itself"));
+                return Undefined;
             }
 
-            if (result is not ObjectInstance resultObj)
-            {
-                return FulfillPromise(result);
-            }
+            alreadyResolved = true;
+            return Reject(thisObj, args);
+        }, 1, PropertyFlag.Configurable);
 
-            JsValue thenProp;
-            try
-            {
-                thenProp = resultObj.Get("then");
-            }
-            catch (JavaScriptException e)
-            {
-                return RejectPromise(e.Error);
-            }
+        return new ResolvingFunctions(resolve, reject);
+    }
 
-            if (thenProp is not ICallable thenMethod)
-            {
-                return FulfillPromise(result);
-            }
+    // https://tc39.es/ecma262/#sec-promise-resolve-functions
+    private JsValue Resolve(JsValue thisObj, JsValue[] arguments)
+    {
+        // Note that alreadyResolved logic lives in CreateResolvingFunctions method
 
-            _engine.AddToEventLoop(
-                PromiseOperations.NewPromiseResolveThenableJob(this, resultObj, thenMethod));
+        var result = arguments.At(0);
 
-            return Undefined;
+        if (ReferenceEquals(result, this))
+        {
+            return RejectPromise(_engine.Realm.Intrinsics.TypeError.Construct("Cannot resolve Promise with itself"));
         }
 
-        // https://tc39.es/ecma262/#sec-promise-reject-functions
-        private JsValue Reject(JsValue thisObj, JsValue[] arguments)
+        if (result is not ObjectInstance resultObj)
         {
-            // Note that alreadyResolved logic lives in CreateResolvingFunctions method
+            return FulfillPromise(result);
+        }
 
-            var reason = arguments.At(0);
+        JsValue thenProp;
+        try
+        {
+            thenProp = resultObj.Get("then");
+        }
+        catch (JavaScriptException e)
+        {
+            return RejectPromise(e.Error);
+        }
 
-            return RejectPromise(reason);
+        if (thenProp is not ICallable thenMethod)
+        {
+            return FulfillPromise(result);
         }
 
+        _engine.AddToEventLoop(
+            PromiseOperations.NewPromiseResolveThenableJob(this, resultObj, thenMethod));
 
-        // https://tc39.es/ecma262/#sec-rejectpromise
-        // 1. Assert: The value of promise.[[PromiseState]] is pending.
-        // 2. Let reactions be promise.[[PromiseRejectReactions]].
-        // 3. Set promise.[[PromiseResult]] to reason.
-        // 4. Set promise.[[PromiseFulfillReactions]] to undefined.
-        // 5. Set promise.[[PromiseRejectReactions]] to undefined.
-        // 6. Set promise.[[PromiseState]] to rejected.
-        // 7. If promise.[[PromiseIsHandled]] is false, perform HostPromiseRejectionTracker(promise, "reject").
-        // 8. Return TriggerPromiseReactions(reactions, reason).
-        private JsValue RejectPromise(JsValue reason)
-        {
-            if (State != PromiseState.Pending)
-            {
-                ExceptionHelper.ThrowInvalidOperationException("Promise should be in Pending state");
-            }
+        return Undefined;
+    }
 
-            Settle(PromiseState.Rejected, reason);
+    // https://tc39.es/ecma262/#sec-promise-reject-functions
+    private JsValue Reject(JsValue thisObj, JsValue[] arguments)
+    {
+        // Note that alreadyResolved logic lives in CreateResolvingFunctions method
 
-            var reactions = PromiseRejectReactions;
-            PromiseRejectReactions = new List<PromiseReaction>();
-            PromiseFulfillReactions.Clear();
+        var reason = arguments.At(0);
 
-            // Note that this part is skipped because there is no tracking yet
-            // 7. If promise.[[PromiseIsHandled]] is false, perform HostPromiseRejectionTracker(promise, "reject").
+        return RejectPromise(reason);
+    }
 
-            return PromiseOperations.TriggerPromiseReactions(_engine, reactions, reason);
-        }
 
-        // https://tc39.es/ecma262/#sec-fulfillpromise
-        private JsValue FulfillPromise(JsValue result)
+    // https://tc39.es/ecma262/#sec-rejectpromise
+    // 1. Assert: The value of promise.[[PromiseState]] is pending.
+    // 2. Let reactions be promise.[[PromiseRejectReactions]].
+    // 3. Set promise.[[PromiseResult]] to reason.
+    // 4. Set promise.[[PromiseFulfillReactions]] to undefined.
+    // 5. Set promise.[[PromiseRejectReactions]] to undefined.
+    // 6. Set promise.[[PromiseState]] to rejected.
+    // 7. If promise.[[PromiseIsHandled]] is false, perform HostPromiseRejectionTracker(promise, "reject").
+    // 8. Return TriggerPromiseReactions(reactions, reason).
+    private JsValue RejectPromise(JsValue reason)
+    {
+        if (State != PromiseState.Pending)
         {
-            if (State != PromiseState.Pending)
-            {
-                ExceptionHelper.ThrowInvalidOperationException("Promise should be in Pending state");
-            }
+            ExceptionHelper.ThrowInvalidOperationException("Promise should be in Pending state");
+        }
 
-            Settle(PromiseState.Fulfilled, result);
-            var reactions = PromiseFulfillReactions;
-            PromiseFulfillReactions = new List<PromiseReaction>();
-            PromiseRejectReactions.Clear();
+        Settle(PromiseState.Rejected, reason);
 
-            return PromiseOperations.TriggerPromiseReactions(_engine, reactions, result);
-        }
+        var reactions = PromiseRejectReactions;
+        PromiseRejectReactions = new List<PromiseReaction>();
+        PromiseFulfillReactions.Clear();
+
+        // Note that this part is skipped because there is no tracking yet
+        // 7. If promise.[[PromiseIsHandled]] is false, perform HostPromiseRejectionTracker(promise, "reject").
 
-        private void Settle(PromiseState state, JsValue result)
+        return PromiseOperations.TriggerPromiseReactions(_engine, reactions, reason);
+    }
+
+    // https://tc39.es/ecma262/#sec-fulfillpromise
+    private JsValue FulfillPromise(JsValue result)
+    {
+        if (State != PromiseState.Pending)
         {
-            State = state;
-            Value = result;
+            ExceptionHelper.ThrowInvalidOperationException("Promise should be in Pending state");
         }
+
+        Settle(PromiseState.Fulfilled, result);
+        var reactions = PromiseFulfillReactions;
+        PromiseFulfillReactions = new List<PromiseReaction>();
+        PromiseRejectReactions.Clear();
+
+        return PromiseOperations.TriggerPromiseReactions(_engine, reactions, result);
+    }
+
+    private void Settle(PromiseState state, JsValue result)
+    {
+        State = state;
+        Value = result;
     }
 }

+ 7 - 8
Jint/Native/Prototype.cs

@@ -1,15 +1,14 @@
 using Jint.Native.Object;
 using Jint.Runtime;
 
-namespace Jint.Native
+namespace Jint.Native;
+
+public abstract class Prototype : ObjectInstance
 {
-    public abstract class Prototype : ObjectInstance
-    {
-        internal readonly Realm _realm;
+    internal readonly Realm _realm;
 
-        protected Prototype(Engine engine, Realm realm) : base(engine)
-        {
-            _realm = realm;
-        }
+    private protected Prototype(Engine engine, Realm realm) : base(engine)
+    {
+        _realm = realm;
     }
 }

+ 1 - 1
Jint/Native/Proxy/ProxyConstructor.cs

@@ -10,7 +10,7 @@ namespace Jint.Native.Proxy
     /// <summary>
     /// https://tc39.es/ecma262/#sec-proxy-constructor
     /// </summary>
-    public sealed class ProxyConstructor : FunctionInstance, IConstructor
+    internal sealed class ProxyConstructor : FunctionInstance, IConstructor
     {
         private static readonly JsString _name = new JsString("Proxy");
         private static readonly JsString PropertyProxy = new JsString("proxy");

+ 1 - 1
Jint/Native/Proxy/ProxyInstance.cs

@@ -5,7 +5,7 @@ using Jint.Runtime.Descriptors;
 
 namespace Jint.Native.Proxy
 {
-    public sealed class ProxyInstance : ObjectInstance, IConstructor, ICallable
+    internal sealed class ProxyInstance : ObjectInstance, IConstructor, ICallable
     {
         internal ObjectInstance _target;
         internal ObjectInstance? _handler;

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

@@ -11,7 +11,7 @@ namespace Jint.Native.Reflect
     /// <summary>
     /// https://www.ecma-international.org/ecma-262/6.0/index.html#sec-reflect-object
     /// </summary>
-    public sealed class ReflectInstance : ObjectInstance
+    internal sealed class ReflectInstance : ObjectInstance
     {
         private readonly Realm _realm;
 

+ 2 - 2
Jint/Native/RegExp/RegExpConstructor.cs

@@ -27,6 +27,8 @@ namespace Jint.Native.RegExp
             _prototypeDescriptor = new PropertyDescriptor(PrototypeObject, PropertyFlag.AllForbidden);
         }
 
+        internal RegExpPrototype PrototypeObject { get; }
+
         protected override void Initialize()
         {
             var symbols = new SymbolDictionary(1)
@@ -165,7 +167,5 @@ namespace Jint.Native.RegExp
         {
             r.SetOwnProperty(RegExpInstance.PropertyLastIndex, new PropertyDescriptor(0, PropertyFlag.OnlyWritable));
         }
-
-        public RegExpPrototype PrototypeObject { get; private set; }
     }
 }

+ 4 - 5
Jint/Native/RegExp/RegExpPrototype.cs

@@ -1,7 +1,6 @@
 using System.Diagnostics.CodeAnalysis;
 using System.Text.RegularExpressions;
 using Jint.Collections;
-using Jint.Native.Array;
 using Jint.Native.Number;
 using Jint.Native.Object;
 using Jint.Native.String;
@@ -13,7 +12,7 @@ using Jint.Runtime.Interop;
 
 namespace Jint.Native.RegExp
 {
-    public sealed class RegExpPrototype : Prototype
+    internal sealed class RegExpPrototype : Prototype
     {
         private static readonly JsString PropertyExec = new("exec");
         private static readonly JsString PropertyIndex = new("index");
@@ -470,7 +469,7 @@ namespace Jint.Native.RegExp
                     return StringPrototype.SplitWithStringSeparator(_realm, "", s, (uint) s.Length);
                 }
 
-                var a = (ArrayInstance) _realm.Intrinsics.Array.Construct(Arguments.Empty);
+                var a = _realm.Intrinsics.Array.Construct(Arguments.Empty);
                 var match = R.Value.Match(s, 0);
 
                 if (!match.Success) // No match at all return the string in an array
@@ -961,7 +960,7 @@ namespace Jint.Native.RegExp
             return len;
         }
 
-        private static ArrayInstance CreateReturnValueArray(
+        private static JsArray CreateReturnValueArray(
             Engine engine,
             Regex regex,
             Match match,
@@ -1023,7 +1022,7 @@ namespace Jint.Native.RegExp
         /// <summary>
         /// https://tc39.es/ecma262/#sec-makematchindicesindexpairarray
         /// </summary>
-        private static ArrayInstance MakeMatchIndicesIndexPairArray(
+        private static JsArray MakeMatchIndicesIndexPairArray(
             Engine engine,
             string s,
             List<JsNumber[]?> indices,

+ 1 - 1
Jint/Native/Set/SetConstructor.cs

@@ -8,7 +8,7 @@ using Jint.Runtime.Interop;
 
 namespace Jint.Native.Set;
 
-public sealed class SetConstructor : FunctionInstance, IConstructor
+internal sealed class SetConstructor : FunctionInstance, IConstructor
 {
     private static readonly JsString _functionName = new("Set");
 

+ 1 - 1
Jint/Native/Set/SetInstance.cs

@@ -5,7 +5,7 @@ using Jint.Runtime.Descriptors;
 
 namespace Jint.Native.Set;
 
-public sealed class SetInstance : ObjectInstance
+internal sealed class SetInstance : ObjectInstance
 {
     internal readonly OrderedSet<JsValue> _set;
 

+ 1 - 1
Jint/Native/ShadowRealm/ShadowRealmConstructor.cs

@@ -9,7 +9,7 @@ namespace Jint.Native.ShadowRealm;
 /// <summary>
 /// https://tc39.es/proposal-shadowrealm/#sec-properties-of-the-shadowRealm-constructor
 /// </summary>
-public sealed class ShadowRealmConstructor : FunctionInstance, IConstructor
+internal sealed class ShadowRealmConstructor : FunctionInstance, IConstructor
 {
     private static readonly JsString _functionName = new JsString("ShadowRealm");
 

+ 1 - 1
Jint/Native/ShadowRealm/ShadowRealmInstance.cs

@@ -15,7 +15,7 @@ namespace Jint.Native.ShadowRealm;
 /// <summary>
 /// https://tc39.es/proposal-shadowrealm/#sec-properties-of-shadowrealm-instances
 /// </summary>
-public sealed class ShadowRealmInstance : ObjectInstance
+internal sealed class ShadowRealmInstance : ObjectInstance
 {
     private readonly JavaScriptParser _parser = new(new ParserOptions { Tolerant = false });
     internal readonly Realm _shadowRealm;

+ 1 - 1
Jint/Native/String/StringConstructor.cs

@@ -13,7 +13,7 @@ namespace Jint.Native.String
     /// <summary>
     /// https://tc39.es/ecma262/#sec-string-constructor
     /// </summary>
-    public sealed class StringConstructor : FunctionInstance, IConstructor
+    internal sealed class StringConstructor : FunctionInstance, IConstructor
     {
         private static readonly JsString _functionName = new JsString("String");
 

+ 88 - 89
Jint/Native/String/StringInstance.cs

@@ -2,129 +2,128 @@ using Jint.Native.Object;
 using Jint.Runtime;
 using Jint.Runtime.Descriptors;
 
-namespace Jint.Native.String
+namespace Jint.Native.String;
+
+internal class StringInstance : ObjectInstance, IPrimitiveInstance
 {
-    public class StringInstance : ObjectInstance, IPrimitiveInstance
-    {
-        internal PropertyDescriptor? _length;
+    internal PropertyDescriptor? _length;
 
-        public StringInstance(Engine engine, JsString value)
-            : base(engine, ObjectClass.String)
-        {
-            StringData = value;
-            _length = PropertyDescriptor.AllForbiddenDescriptor.ForNumber(value.Length);
-        }
+    public StringInstance(Engine engine, JsString value)
+        : base(engine, ObjectClass.String)
+    {
+        StringData = value;
+        _length = PropertyDescriptor.AllForbiddenDescriptor.ForNumber(value.Length);
+    }
 
-        Types IPrimitiveInstance.Type => Types.String;
+    Types IPrimitiveInstance.Type => Types.String;
 
-        JsValue IPrimitiveInstance.PrimitiveValue => StringData;
+    JsValue IPrimitiveInstance.PrimitiveValue => StringData;
 
-        public JsString StringData { get; }
+    public JsString StringData { get; }
 
-        private static bool IsInt32(double d, out int intValue)
+    private static bool IsInt32(double d, out int intValue)
+    {
+        if (d >= int.MinValue && d <= int.MaxValue)
         {
-            if (d >= int.MinValue && d <= int.MaxValue)
-            {
-                intValue = (int) d;
-                return intValue == d;
-            }
-
-            intValue = 0;
-            return false;
+            intValue = (int) d;
+            return intValue == d;
         }
 
-        public override PropertyDescriptor GetOwnProperty(JsValue property)
-        {
-            if (property == CommonProperties.Infinity)
-            {
-                return PropertyDescriptor.Undefined;
-            }
-
-            if (property == CommonProperties.Length)
-            {
-                return _length ?? PropertyDescriptor.Undefined;
-            }
-
-            var desc = base.GetOwnProperty(property);
-            if (desc != PropertyDescriptor.Undefined)
-            {
-                return desc;
-            }
+        intValue = 0;
+        return false;
+    }
 
-            if ((property._type & (InternalTypes.Number | InternalTypes.Integer | InternalTypes.String)) == 0)
-            {
-                return PropertyDescriptor.Undefined;
-            }
+    public override PropertyDescriptor GetOwnProperty(JsValue property)
+    {
+        if (property == CommonProperties.Infinity)
+        {
+            return PropertyDescriptor.Undefined;
+        }
 
-            var str = StringData.ToString();
-            var number = TypeConverter.ToNumber(property);
-            if (!IsInt32(number, out var index) || index < 0 || index >= str.Length)
-            {
-                return PropertyDescriptor.Undefined;
-            }
+        if (property == CommonProperties.Length)
+        {
+            return _length ?? PropertyDescriptor.Undefined;
+        }
 
-            return new PropertyDescriptor(str[index], PropertyFlag.OnlyEnumerable);
+        var desc = base.GetOwnProperty(property);
+        if (desc != PropertyDescriptor.Undefined)
+        {
+            return desc;
         }
 
-        public override IEnumerable<KeyValuePair<JsValue, PropertyDescriptor>> GetOwnProperties()
+        if ((property._type & (InternalTypes.Number | InternalTypes.Integer | InternalTypes.String)) == 0)
         {
-            foreach (var entry in base.GetOwnProperties())
-            {
-                yield return entry;
-            }
+            return PropertyDescriptor.Undefined;
+        }
 
-            if (_length != null)
-            {
-                yield return new KeyValuePair<JsValue, PropertyDescriptor>(CommonProperties.Length, _length);
-            }
+        var str = StringData.ToString();
+        var number = TypeConverter.ToNumber(property);
+        if (!IsInt32(number, out var index) || index < 0 || index >= str.Length)
+        {
+            return PropertyDescriptor.Undefined;
         }
 
-        internal override IEnumerable<JsValue> GetInitialOwnStringPropertyKeys()
+        return new PropertyDescriptor(str[index], PropertyFlag.OnlyEnumerable);
+    }
+
+    public override IEnumerable<KeyValuePair<JsValue, PropertyDescriptor>> GetOwnProperties()
+    {
+        foreach (var entry in base.GetOwnProperties())
         {
-            return new[] { JsString.LengthString };
+            yield return entry;
         }
 
-        public override List<JsValue> GetOwnPropertyKeys(Types types)
+        if (_length != null)
         {
-            var keys = new List<JsValue>(StringData.Length + 1);
-            if ((types & Types.String) != 0)
-            {
-                for (uint i = 0; i < StringData.Length; ++i)
-                {
-                    keys.Add(JsString.Create(i));
-                }
+            yield return new KeyValuePair<JsValue, PropertyDescriptor>(CommonProperties.Length, _length);
+        }
+    }
 
-                keys.AddRange(base.GetOwnPropertyKeys(Types.String));
-            }
+    internal override IEnumerable<JsValue> GetInitialOwnStringPropertyKeys()
+    {
+        return new[] { JsString.LengthString };
+    }
 
-            if ((types & Types.Symbol) != 0)
+    public override List<JsValue> GetOwnPropertyKeys(Types types)
+    {
+        var keys = new List<JsValue>(StringData.Length + 1);
+        if ((types & Types.String) != 0)
+        {
+            for (uint i = 0; i < StringData.Length; ++i)
             {
-                keys.AddRange(base.GetOwnPropertyKeys(Types.Symbol));
+                keys.Add(JsString.Create(i));
             }
 
-            return keys;
+            keys.AddRange(base.GetOwnPropertyKeys(Types.String));
         }
 
-        protected internal override void SetOwnProperty(JsValue property, PropertyDescriptor desc)
+        if ((types & Types.Symbol) != 0)
         {
-            if (property == CommonProperties.Length)
-            {
-                _length = desc;
-            }
-            else
-            {
-                base.SetOwnProperty(property, desc);
-            }
+            keys.AddRange(base.GetOwnPropertyKeys(Types.Symbol));
         }
 
-        public override void RemoveOwnProperty(JsValue property)
+        return keys;
+    }
+
+    protected internal override void SetOwnProperty(JsValue property, PropertyDescriptor desc)
+    {
+        if (property == CommonProperties.Length)
         {
-            if (property == CommonProperties.Length)
-            {
-                _length = null;
-            }
+            _length = desc;
+        }
+        else
+        {
+            base.SetOwnProperty(property, desc);
+        }
+    }
 
-            base.RemoveOwnProperty(property);
+    public override void RemoveOwnProperty(JsValue property)
+    {
+        if (property == CommonProperties.Length)
+        {
+            _length = null;
         }
+
+        base.RemoveOwnProperty(property);
     }
 }

+ 6 - 6
Jint/Native/String/StringPrototype.cs

@@ -14,7 +14,7 @@ namespace Jint.Native.String
     /// <summary>
     /// https://tc39.es/ecma262/#sec-properties-of-the-string-prototype-object
     /// </summary>
-    public sealed class StringPrototype : StringInstance
+    internal sealed class StringPrototype : StringInstance
     {
         private readonly Realm _realm;
         private readonly StringConstructor _constructor;
@@ -147,7 +147,7 @@ namespace Jint.Native.String
         }
 
         [MethodImpl(MethodImplOptions.AggressiveInlining)]
-        public static string TrimStartEx(string s)
+        internal static string TrimStartEx(string s)
         {
             if (s.Length == 0)
                 return string.Empty;
@@ -173,7 +173,7 @@ namespace Jint.Native.String
         }
 
         [MethodImpl(MethodImplOptions.AggressiveInlining)]
-        public static string TrimEx(string s)
+        internal static string TrimEx(string s)
         {
             return TrimEndEx(TrimStartEx(s));
         }
@@ -347,7 +347,7 @@ namespace Jint.Native.String
 
             if (separator.IsNull())
             {
-                separator = Native.Null.Text;
+                separator = "null";
             }
             else if (!separator.IsUndefined())
             {
@@ -945,7 +945,7 @@ namespace Jint.Native.String
             var searchString = arguments.At(0);
             if (ReferenceEquals(searchString, Null))
             {
-                searchString = Native.Null.Text;
+                searchString = "null";
             }
             else
             {
@@ -990,7 +990,7 @@ namespace Jint.Native.String
             var searchString = arguments.At(0);
             if (ReferenceEquals(searchString, Null))
             {
-                searchString = Native.Null.Text;
+                searchString = "null";
             }
             else
             {

+ 1 - 1
Jint/Native/Symbol/SymbolConstructor.cs

@@ -11,7 +11,7 @@ namespace Jint.Native.Symbol
     /// 19.4
     /// http://www.ecma-international.org/ecma-262/6.0/index.html#sec-symbol-objects
     /// </summary>
-    public sealed class SymbolConstructor : FunctionInstance, IConstructor
+    internal sealed class SymbolConstructor : FunctionInstance, IConstructor
     {
         private static readonly JsString _functionName = new JsString("Symbol");
 

+ 13 - 14
Jint/Native/Symbol/SymbolInstance.cs

@@ -1,23 +1,22 @@
 using Jint.Native.Object;
 using Jint.Runtime;
 
-namespace Jint.Native.Symbol
+namespace Jint.Native.Symbol;
+
+internal sealed class SymbolInstance : ObjectInstance, IPrimitiveInstance
 {
-    public sealed class SymbolInstance : ObjectInstance, IPrimitiveInstance
+    internal SymbolInstance(
+        Engine engine,
+        SymbolPrototype prototype,
+        JsSymbol symbol) : base(engine)
     {
-        internal SymbolInstance(
-            Engine engine,
-            SymbolPrototype prototype,
-            JsSymbol symbol) : base(engine)
-        {
-            _prototype = prototype;
-            SymbolData = symbol;
-        }
+        _prototype = prototype;
+        SymbolData = symbol;
+    }
 
-        Types IPrimitiveInstance.Type => Types.Symbol;
+    Types IPrimitiveInstance.Type => Types.Symbol;
 
-        JsValue IPrimitiveInstance.PrimitiveValue => SymbolData;
+    JsValue IPrimitiveInstance.PrimitiveValue => SymbolData;
 
-        public JsSymbol SymbolData { get; }
-    }
+    public JsSymbol SymbolData { get; }
 }

+ 1 - 1
Jint/Native/Symbol/SymbolPrototype.cs

@@ -9,7 +9,7 @@ namespace Jint.Native.Symbol
     /// <summary>
     /// https://tc39.es/ecma262/#sec-properties-of-the-symbol-prototype-object
     /// </summary>
-    public sealed class SymbolPrototype : Prototype
+    internal sealed class SymbolPrototype : Prototype
     {
         private readonly SymbolConstructor _constructor;
 

+ 1 - 1
Jint/Native/TypedArray/TypedArrayConstructor.cs

@@ -31,7 +31,7 @@ namespace Jint.Native.TypedArray
             _prototypeDescriptor = new PropertyDescriptor(PrototypeObject, PropertyFlag.AllForbidden);
         }
 
-        public TypedArrayPrototype PrototypeObject { get; }
+        private TypedArrayPrototype PrototypeObject { get; }
 
         protected override void Initialize()
         {

+ 2 - 2
Jint/Native/TypedArray/TypedArrayInstance.cs

@@ -275,8 +275,8 @@ namespace Jint.Native.TypedArray
         [MethodImpl(MethodImplOptions.AggressiveInlining)]
         internal void IntegerIndexedElementSet(int index, JsValue value)
         {
-            TypedArrayValue numValue = _contentType != TypedArrayContentType.BigInt 
-                ? TypeConverter.ToNumber(value) 
+            TypedArrayValue numValue = _contentType != TypedArrayContentType.BigInt
+                ? TypeConverter.ToNumber(value)
                 : value.ToBigInteger(_engine);
 
             if (IsValidIntegerIndex(index))

+ 1 - 1
Jint/Native/TypedArray/TypedArrayPrototype.cs

@@ -7,7 +7,7 @@ namespace Jint.Native.TypedArray
     /// <summary>
     /// https://tc39.es/ecma262/#sec-properties-of-typedarray-prototype-objects
     /// </summary>
-    public sealed class TypedArrayPrototype : ObjectInstance
+    internal sealed class TypedArrayPrototype : ObjectInstance
     {
         private readonly TypedArrayConstructor _constructor;
         private readonly TypedArrayElementType _arrayElementType;

+ 0 - 8
Jint/Native/Undefined.cs

@@ -1,8 +0,0 @@
-namespace Jint.Native
-{
-    public static class Undefined
-    {
-        public static readonly JsValue Instance = JsValue.Undefined;
-        public const string Text = "undefined";
-    }
-}

+ 1 - 1
Jint/Native/WeakMap/WeakMapConstructor.cs

@@ -6,7 +6,7 @@ using Jint.Runtime.Descriptors;
 
 namespace Jint.Native.WeakMap
 {
-    public sealed class WeakMapConstructor : FunctionInstance, IConstructor
+    internal sealed class WeakMapConstructor : FunctionInstance, IConstructor
     {
         private static readonly JsString _functionName = new JsString("WeakMap");
 

+ 1 - 1
Jint/Native/WeakMap/WeakMapInstance.cs

@@ -5,7 +5,7 @@ using Jint.Runtime;
 
 namespace Jint.Native.WeakMap;
 
-public sealed class WeakMapInstance : ObjectInstance
+internal sealed class WeakMapInstance : ObjectInstance
 {
     private readonly ConditionalWeakTable<JsValue, JsValue> _table;
 

+ 1 - 1
Jint/Native/WeakMap/WeakMapPrototype.cs

@@ -10,7 +10,7 @@ namespace Jint.Native.WeakMap
     /// <summary>
     /// https://tc39.es/ecma262/#sec-weakmap-objects
     /// </summary>
-    public sealed class WeakMapPrototype : Prototype
+    internal sealed class WeakMapPrototype : Prototype
     {
         private readonly WeakMapConstructor _constructor;
 

+ 1 - 1
Jint/Native/WeakSet/WeakSetConstructor.cs

@@ -5,7 +5,7 @@ using Jint.Runtime.Descriptors;
 
 namespace Jint.Native.WeakSet
 {
-    public sealed class WeakSetConstructor : FunctionInstance, IConstructor
+    internal sealed class WeakSetConstructor : FunctionInstance, IConstructor
     {
         private static readonly JsString _functionName = new JsString("WeakSet");
 

+ 1 - 1
Jint/Native/WeakSet/WeakSetInstance.cs

@@ -5,7 +5,7 @@ using Jint.Runtime;
 
 namespace Jint.Native.WeakSet;
 
-public sealed class WeakSetInstance : ObjectInstance
+internal sealed class WeakSetInstance : ObjectInstance
 {
     private readonly ConditionalWeakTable<JsValue, JsValue> _table;
 

+ 1 - 1
Jint/Native/WeakSet/WeakSetPrototype.cs

@@ -10,7 +10,7 @@ namespace Jint.Native.WeakSet
     /// <summary>
     /// https://tc39.es/ecma262/#sec-weakset-objects
     /// </summary>
-    public sealed class WeakSetPrototype : Prototype
+    internal sealed class WeakSetPrototype : Prototype
     {
         private readonly WeakSetConstructor _constructor;
 

+ 1 - 1
Jint/Runtime/Arguments.cs

@@ -28,7 +28,7 @@ namespace Jint.Runtime
         [MethodImpl(MethodImplOptions.AggressiveInlining)]
         public static JsValue At(this JsValue[] args, int index)
         {
-            return At(args, index, Undefined.Instance);
+            return At(args, index, JsValue.Undefined);
         }
 
         [MethodImpl(MethodImplOptions.AggressiveInlining)]

部分文件因为文件数量过多而无法显示