Selaa lähdekoodia

Remove Engine.Realm, expose Engine.Intrinsics and Engine.Global directly (#1722)

Marko Lahma 1 vuosi sitten
vanhempi
commit
7e08babf3b

+ 3 - 3
Jint.Tests.PublicInterface/ConstructorTests.cs

@@ -79,17 +79,17 @@ file sealed class DateOnlyConstructor : Constructor
             var day = arguments.Length == 2 ? 0 : TypeConverter.ToNumber(arguments[2]) - 1;
             if (double.IsNaN(year))
             {
-                throw new JavaScriptException(_engine.Realm.Intrinsics.TypeError, $"Invalid year {year.ToString(CultureInfo.InvariantCulture)}");
+                throw new JavaScriptException(_engine.Intrinsics.TypeError, $"Invalid year {year.ToString(CultureInfo.InvariantCulture)}");
             }
 
             if (double.IsNaN(month))
             {
-                throw new JavaScriptException(_engine.Realm.Intrinsics.TypeError, $"Invalid month {month.ToString(CultureInfo.InvariantCulture)}");
+                throw new JavaScriptException(_engine.Intrinsics.TypeError, $"Invalid month {month.ToString(CultureInfo.InvariantCulture)}");
             }
 
             if (double.IsNaN(day))
             {
-                throw new JavaScriptException(_engine.Realm.Intrinsics.TypeError, $"Invalid day {day.ToString(CultureInfo.InvariantCulture)}");
+                throw new JavaScriptException(_engine.Intrinsics.TypeError, $"Invalid day {day.ToString(CultureInfo.InvariantCulture)}");
             }
 
             var dt = new DateTime((int) year, 1, 1);

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

@@ -13,7 +13,7 @@ namespace Jint.Tests.PublicInterface
 
             engine.SetValue("throw1", () =>
             {
-                throw new JavaScriptException(engine.Realm.Intrinsics.Error, "message 1");
+                throw new JavaScriptException(engine.Intrinsics.Error, "message 1");
             });
 
             engine.SetValue("throw2", () =>

+ 8 - 0
Jint.Tests.PublicInterface/PublicInterfaceTests.cs

@@ -6,6 +6,14 @@ namespace Jint.Tests.PublicInterface;
 
 public class PublicInterfaceTests
 {
+    [Fact]
+    public void CanCallEval()
+    {
+        var engine = new Engine();
+        var value = engine.Intrinsics.Eval.Call("1 + 1");
+        Assert.Equal(2, value);
+    }
+
     [Fact]
     public void BindFunctionInstancesArePublic()
     {

+ 7 - 7
Jint.Tests.PublicInterface/ShadowRealmTests.cs

@@ -8,7 +8,7 @@ public class ShadowRealmTests
     public void CanUseViaEngineMethods()
     {
         var engine = new Engine(options => options.EnableModules(GetBasePath()));
-        var shadowRealm = engine.Realm.Intrinsics.ShadowRealm.Construct();
+        var shadowRealm = engine.Intrinsics.ShadowRealm.Construct();
 
         // lexically scoped (let/const) are visible during single call
         Assert.Equal(123, shadowRealm.Evaluate("const s = 123; const f = () => s; f();"));
@@ -37,11 +37,11 @@ public class ShadowRealmTests
 
         Assert.Equal("world", engine.Evaluate("hello();"));
 
-        var shadowRealm = engine.Realm.Intrinsics.ShadowRealm.Construct();
+        var shadowRealm = engine.Intrinsics.ShadowRealm.Construct();
         shadowRealm.SetValue("message", "realm 1");
         shadowRealm.Evaluate("function hello() {return message}");
 
-        var shadowRealm2 = engine.Realm.Intrinsics.ShadowRealm.Construct();
+        var shadowRealm2 = engine.Intrinsics.ShadowRealm.Construct();
         shadowRealm2.SetValue("message", "realm 2");
         shadowRealm2.Evaluate("function hello() {return message}");
 
@@ -57,11 +57,11 @@ public class ShadowRealmTests
         engine.SetValue("message", "hello ");
         engine.Evaluate("(function hello() {message += \"engine\"})();");
 
-        var shadowRealm = engine.Realm.Intrinsics.ShadowRealm.Construct();
+        var shadowRealm = engine.Intrinsics.ShadowRealm.Construct();
         shadowRealm.SetValue("message", "hello ");
         shadowRealm.Evaluate("(function hello() {message += \"realm 1\"})();");
 
-        var shadowRealm2 = engine.Realm.Intrinsics.ShadowRealm.Construct();
+        var shadowRealm2 = engine.Intrinsics.ShadowRealm.Construct();
         shadowRealm2.SetValue("message", "hello ");
         shadowRealm2.Evaluate("(function hello() {message += \"realm 2\"})();");
 
@@ -77,10 +77,10 @@ public class ShadowRealmTests
         var engine = new Engine(options => options.EnableModules(GetBasePath()));
         engine.SetValue("message", "engine");
 
-        var shadowRealm = engine.Realm.Intrinsics.ShadowRealm.Construct();
+        var shadowRealm = engine.Intrinsics.ShadowRealm.Construct();
         shadowRealm.SetValue("message", "realm 1");
 
-        var shadowRealm2 = engine.Realm.Intrinsics.ShadowRealm.Construct();
+        var shadowRealm2 = engine.Intrinsics.ShadowRealm.Construct();
         shadowRealm2.SetValue("message", "realm 2");
 
         var parser = new Esprima.JavaScriptParser();

+ 0 - 3
Jint/Engine.Advanced.cs

@@ -1,7 +1,4 @@
-using Jint.Native;
-using Jint.Native.Function;
 using Jint.Native.Promise;
-using Jint.Runtime;
 using Jint.Runtime.Environments;
 using Environment = Jint.Runtime.Environments.Environment;
 

+ 11 - 1
Jint/Engine.cs

@@ -174,7 +174,17 @@ namespace Jint
 
         internal SyntaxElement? _lastSyntaxElement;
 
-        public Realm Realm => _realmInConstruction ?? ExecutionContext.Realm;
+        internal Realm Realm => _realmInConstruction ?? ExecutionContext.Realm;
+
+        /// <summary>
+        /// The well-known intrinsics for this engine instance.
+        /// </summary>
+        public Intrinsics Intrinsics => Realm.Intrinsics;
+
+        /// <summary>
+        /// The global object for this engine instance.
+        /// </summary>
+        public ObjectInstance Global => Realm.GlobalObject;
 
         internal GlobalSymbolRegistry GlobalSymbolRegistry { get; } = new();
 

+ 0 - 1
Jint/JsValueExtensions.cs

@@ -554,7 +554,6 @@ public static class JsValueExtensions
         return ThrowNotObject(value);
     }
 
-    [Pure]
     [MethodImpl(MethodImplOptions.AggressiveInlining)]
     public static JsValue Call(this JsValue value, JsValue thisObj, JsValue[] arguments)
     {

+ 3 - 3
Jint/Native/Function/EvalFunction.cs

@@ -9,14 +9,14 @@ using Environment = Jint.Runtime.Environments.Environment;
 
 namespace Jint.Native.Function;
 
-internal sealed class EvalFunction : Function
+public sealed class EvalFunction : Function
 {
     private static readonly JsString _functionName = new("eval");
 
     private static readonly ParserOptions _parserOptions = ParserOptions.Default with { Tolerant = true };
     private readonly JavaScriptParser _parser = new(_parserOptions);
 
-    public EvalFunction(
+    internal EvalFunction(
         Engine engine,
         Realm realm,
         FunctionPrototype functionPrototype)
@@ -40,7 +40,7 @@ internal sealed class EvalFunction : Function
     /// <summary>
     /// https://tc39.es/ecma262/#sec-performeval
     /// </summary>
-    public JsValue PerformEval(JsValue x, Realm callerRealm, bool strictCaller, bool direct)
+    internal JsValue PerformEval(JsValue x, Realm callerRealm, bool strictCaller, bool direct)
     {
         if (!x.IsString())
         {

+ 1 - 1
Jint/Runtime/Intrinsics.cs

@@ -254,7 +254,7 @@ namespace Jint.Runtime
         internal GeneratorFunctionConstructor GeneratorFunction =>
             _generatorFunction ??= new GeneratorFunctionConstructor(_engine, _realm, Function.PrototypeObject, IteratorPrototype);
 
-        internal EvalFunction Eval =>
+        public EvalFunction Eval =>
             _eval ??= new EvalFunction(_engine, _realm, Function.PrototypeObject);
 
         public ErrorConstructor Error =>