JintFunctionExpression.cs 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. using Esprima.Ast;
  2. using Jint.Native;
  3. using Jint.Native.Function;
  4. using Jint.Runtime.Environments;
  5. namespace Jint.Runtime.Interpreter.Expressions
  6. {
  7. internal sealed class JintFunctionExpression : JintExpression
  8. {
  9. private readonly JintFunctionDefinition _function;
  10. public JintFunctionExpression(Engine engine, IFunction function)
  11. : base(engine, ArrowParameterPlaceHolder.Empty)
  12. {
  13. _function = new JintFunctionDefinition(engine, function);
  14. }
  15. protected override object EvaluateInternal()
  16. {
  17. return GetValue();
  18. }
  19. public override JsValue GetValue()
  20. {
  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 closure;
  33. }
  34. }
  35. }