using Jint.Native.Function; namespace Jint.Runtime.Interpreter.Expressions; internal sealed class JintArrowFunctionExpression : JintExpression { private readonly JintFunctionDefinition _function; public JintArrowFunctionExpression(ArrowFunctionExpression function) : base(function) { _function = new JintFunctionDefinition(function); } protected override object EvaluateInternal(EvaluationContext context) { return Build(context.Engine, _function); } private static ScriptFunction Build(Engine engine, JintFunctionDefinition function) { var functionName = function.Name ?? ""; var closure = function.Function.Async ? InstantiateAsyncArrowFunctionExpression(engine, function, functionName) : InstantiateArrowFunctionExpression(engine, function, functionName); return closure; } /// /// https://tc39.es/ecma262/#sec-runtime-semantics-instantiatearrowfunctionexpression /// private static ScriptFunction InstantiateArrowFunctionExpression(Engine engine, JintFunctionDefinition function, string name) { var runningExecutionContext = engine.ExecutionContext; var env = runningExecutionContext.LexicalEnvironment; var privateEnv = runningExecutionContext.PrivateEnvironment; var intrinsics = engine.Realm.Intrinsics; var closure = intrinsics.Function.OrdinaryFunctionCreate( intrinsics.Function.PrototypeObject, function, FunctionThisMode.Lexical, env, privateEnv ); closure.SetFunctionName(name); return closure; } /// /// https://tc39.es/ecma262/#sec-runtime-semantics-instantiateasyncarrowfunctionexpression /// private static ScriptFunction InstantiateAsyncArrowFunctionExpression(Engine engine, JintFunctionDefinition function, string name) { var executionContext = engine.ExecutionContext; var env = executionContext.LexicalEnvironment; var privateEnv = executionContext.PrivateEnvironment; var intrinsics = engine.Realm.Intrinsics; var closure = intrinsics.Function.OrdinaryFunctionCreate( intrinsics.AsyncFunction.PrototypeObject, function, FunctionThisMode.Lexical, env, privateEnv ); closure.SetFunctionName(name); return closure; } }