FunctionConstructor.cs 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. using System.Collections.Generic;
  2. using Jint.Native.Object;
  3. using Jint.Parser.Ast;
  4. using Jint.Runtime;
  5. using Jint.Runtime.Descriptors;
  6. using Jint.Runtime.Environments;
  7. namespace Jint.Native.Function
  8. {
  9. /// <summary>
  10. ///
  11. /// </summary>
  12. public sealed class FunctionConstructor : FunctionInstance, IConstructor
  13. {
  14. private readonly Engine _engine;
  15. private readonly IEnumerable<Identifier> _parameters;
  16. public FunctionConstructor(Engine engine)
  17. : base(engine, engine.RootFunction, null, null, false)
  18. {
  19. _engine = engine;
  20. // http://www.ecma-international.org/ecma-262/5.1/#sec-13.2
  21. Extensible = true;
  22. }
  23. public override object Call(object thisObject, object[] arguments)
  24. {
  25. return Construct(arguments);
  26. }
  27. public ObjectInstance Construct(object[] arguments)
  28. {
  29. var instance = new FunctionShim(_engine, Prototype, null, null);
  30. instance.DefineOwnProperty("constructor", new DataDescriptor(Prototype) { Writable = true, Enumerable = false, Configurable = false }, false);
  31. return instance;
  32. }
  33. /// <summary>
  34. /// http://www.ecma-international.org/ecma-262/5.1/#sec-13.2
  35. /// </summary>
  36. /// <param name="functionDeclaration"></param>
  37. /// <returns></returns>
  38. public FunctionInstance CreateFunctionObject(FunctionDeclaration functionDeclaration)
  39. {
  40. var functionObject = new ScriptFunctionInstance(
  41. _engine,
  42. functionDeclaration,
  43. _engine.Function.Prototype /* instancePrototype */,
  44. _engine.Object.Construct(Arguments.Empty) /* functionPrototype */,
  45. LexicalEnvironment.NewDeclarativeEnvironment(_engine.ExecutionContext.LexicalEnvironment),
  46. functionDeclaration.Strict
  47. ) { Extensible = true };
  48. return functionObject;
  49. }
  50. }
  51. }