JintFunctionExpression.cs 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. using Esprima.Ast;
  2. using Jint.Native.Function;
  3. using Jint.Runtime.Environments;
  4. namespace Jint.Runtime.Interpreter.Expressions
  5. {
  6. internal sealed class JintFunctionExpression : JintExpression
  7. {
  8. private readonly JintFunctionDefinition _function;
  9. public JintFunctionExpression(Engine engine, IFunction function)
  10. : base(ArrowParameterPlaceHolder.Empty)
  11. {
  12. _function = new JintFunctionDefinition(engine, function);
  13. }
  14. protected override ExpressionResult EvaluateInternal(EvaluationContext context)
  15. {
  16. return GetValue(context);
  17. }
  18. public override Completion GetValue(EvaluationContext context)
  19. {
  20. var engine = context.Engine;
  21. var funcEnv = JintEnvironment.NewDeclarativeEnvironment(engine, engine.ExecutionContext.LexicalEnvironment);
  22. var closure = new ScriptFunctionInstance(
  23. engine,
  24. _function,
  25. funcEnv,
  26. _function.ThisMode);
  27. closure.MakeConstructor();
  28. if (_function.Name != null)
  29. {
  30. funcEnv.CreateMutableBindingAndInitialize(_function.Name, canBeDeleted: false, closure);
  31. }
  32. return Completion.Normal(closure, _expression.Location);
  33. }
  34. }
  35. }