2
0

JintArrowFunctionExpression.cs 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. using Jint.Native.Function;
  2. namespace Jint.Runtime.Interpreter.Expressions;
  3. internal sealed class JintArrowFunctionExpression : JintExpression
  4. {
  5. private readonly JintFunctionDefinition _function;
  6. public JintArrowFunctionExpression(ArrowFunctionExpression function) : base(function)
  7. {
  8. _function = new JintFunctionDefinition(function);
  9. }
  10. protected override object EvaluateInternal(EvaluationContext context)
  11. {
  12. return Build(context.Engine, _function);
  13. }
  14. private static ScriptFunction Build(Engine engine, JintFunctionDefinition function)
  15. {
  16. var functionName = function.Name ?? "";
  17. var closure = function.Function.Async
  18. ? InstantiateAsyncArrowFunctionExpression(engine, function, functionName)
  19. : InstantiateArrowFunctionExpression(engine, function, functionName);
  20. return closure;
  21. }
  22. /// <summary>
  23. /// https://tc39.es/ecma262/#sec-runtime-semantics-instantiatearrowfunctionexpression
  24. /// </summary>
  25. private static ScriptFunction InstantiateArrowFunctionExpression(Engine engine, JintFunctionDefinition function, string name)
  26. {
  27. var runningExecutionContext = engine.ExecutionContext;
  28. var env = runningExecutionContext.LexicalEnvironment;
  29. var privateEnv = runningExecutionContext.PrivateEnvironment;
  30. var intrinsics = engine.Realm.Intrinsics;
  31. var closure = intrinsics.Function.OrdinaryFunctionCreate(
  32. intrinsics.Function.PrototypeObject,
  33. function,
  34. FunctionThisMode.Lexical,
  35. env,
  36. privateEnv
  37. );
  38. closure.SetFunctionName(name);
  39. return closure;
  40. }
  41. /// <summary>
  42. /// https://tc39.es/ecma262/#sec-runtime-semantics-instantiateasyncarrowfunctionexpression
  43. /// </summary>
  44. private static ScriptFunction InstantiateAsyncArrowFunctionExpression(Engine engine, JintFunctionDefinition function, string name)
  45. {
  46. var executionContext = engine.ExecutionContext;
  47. var env = executionContext.LexicalEnvironment;
  48. var privateEnv = executionContext.PrivateEnvironment;
  49. var intrinsics = engine.Realm.Intrinsics;
  50. var closure = intrinsics.Function.OrdinaryFunctionCreate(
  51. intrinsics.AsyncFunction.PrototypeObject,
  52. function,
  53. FunctionThisMode.Lexical,
  54. env,
  55. privateEnv
  56. );
  57. closure.SetFunctionName(name);
  58. return closure;
  59. }
  60. }