BindFunctionInstance.cs 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. using System.Linq;
  2. using Jint.Native.Object;
  3. using Jint.Runtime;
  4. namespace Jint.Native.Function
  5. {
  6. public sealed class BindFunctionInstance : FunctionInstance, IConstructor
  7. {
  8. public BindFunctionInstance(Engine engine) : base(engine, System.Array.Empty<string>(), null, false)
  9. {
  10. }
  11. public JsValue TargetFunction { get; set; }
  12. public JsValue BoundThis { get; set; }
  13. public JsValue[] BoundArgs { get; set; }
  14. public override JsValue Call(JsValue thisObject, JsValue[] arguments)
  15. {
  16. var f = TargetFunction.TryCast<FunctionInstance>(x =>
  17. {
  18. ExceptionHelper.ThrowTypeError(Engine);
  19. });
  20. return f.Call(BoundThis, CreateArguments(arguments));
  21. }
  22. public ObjectInstance Construct(JsValue[] arguments)
  23. {
  24. var target = TargetFunction.TryCast<IConstructor>(x =>
  25. {
  26. ExceptionHelper.ThrowTypeError(Engine);
  27. });
  28. return target.Construct(CreateArguments(arguments));
  29. }
  30. public override bool HasInstance(JsValue v)
  31. {
  32. var f = TargetFunction.TryCast<FunctionInstance>(x =>
  33. {
  34. ExceptionHelper.ThrowTypeError(Engine);
  35. });
  36. return f.HasInstance(v);
  37. }
  38. private JsValue[] CreateArguments(JsValue[] arguments)
  39. {
  40. return Enumerable.Union(BoundArgs, arguments).ToArray();
  41. }
  42. }
  43. }