DisposableStackPrototype.cs 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. using Jint.Native.Object;
  2. using Jint.Native.Symbol;
  3. using Jint.Runtime;
  4. using Jint.Runtime.Descriptors;
  5. using Jint.Runtime.Interop;
  6. namespace Jint.Native.Disposable;
  7. internal sealed class DisposableStackPrototype : Prototype
  8. {
  9. private readonly DisposableStackConstructor _constructor;
  10. internal DisposableStackPrototype(
  11. Engine engine,
  12. Realm realm,
  13. DisposableStackConstructor constructor,
  14. ObjectPrototype objectPrototype) : base(engine, realm)
  15. {
  16. _prototype = objectPrototype;
  17. _constructor = constructor;
  18. }
  19. protected override void Initialize()
  20. {
  21. var disposeFunction = new ClrFunction(Engine, "dispose", Dispose, 0, PropertyFlag.Configurable);
  22. const PropertyFlag PropertyFlags = PropertyFlag.Configurable | PropertyFlag.Writable;
  23. var properties = new PropertyDictionary(8, checkExistingKeys: false)
  24. {
  25. ["length"] = new PropertyDescriptor(0, PropertyFlag.Configurable),
  26. ["constructor"] = new PropertyDescriptor(_constructor, PropertyFlag.NonEnumerable),
  27. ["adopt"] = new PropertyDescriptor(new ClrFunction(Engine, "adopt", Adopt, 2, PropertyFlag.Configurable), PropertyFlags),
  28. ["defer"] = new PropertyDescriptor(new ClrFunction(Engine, "defer", Defer, 1, PropertyFlag.Configurable), PropertyFlags),
  29. ["dispose"] = new PropertyDescriptor(disposeFunction, PropertyFlags),
  30. ["disposed"] = new GetSetPropertyDescriptor(get: new ClrFunction(Engine, "get disposed", Disposed, 0, PropertyFlag.Configurable), set: Undefined, PropertyFlags),
  31. ["move"] = new PropertyDescriptor(new ClrFunction(Engine, "move", Move, 0, PropertyFlag.Configurable), PropertyFlags),
  32. ["use"] = new PropertyDescriptor(new ClrFunction(Engine, "use", Use, 1, PropertyFlag.Configurable), PropertyFlags),
  33. };
  34. SetProperties(properties);
  35. var symbols = new SymbolDictionary(2)
  36. {
  37. [GlobalSymbolRegistry.Dispose] = new PropertyDescriptor(disposeFunction, PropertyFlags),
  38. [GlobalSymbolRegistry.ToStringTag] = new PropertyDescriptor("DisposableStack", PropertyFlag.Configurable),
  39. };
  40. SetSymbols(symbols);
  41. }
  42. private JsValue Adopt(JsValue thisObject, JsCallArguments arguments)
  43. {
  44. var stack = AssertDisposableStack(thisObject);
  45. return stack.Adopt(arguments.At(0), arguments.At(1));
  46. }
  47. private JsValue Defer(JsValue thisObject, JsCallArguments arguments)
  48. {
  49. var stack = AssertDisposableStack(thisObject);
  50. stack.Defer(arguments.At(0));
  51. return Undefined;
  52. }
  53. private JsValue Dispose(JsValue thisObject, JsCallArguments arguments)
  54. {
  55. var stack = AssertDisposableStack(thisObject);
  56. return stack.Dispose();
  57. }
  58. private JsValue Disposed(JsValue thisObject, JsCallArguments arguments)
  59. {
  60. var stack = AssertDisposableStack(thisObject);
  61. return stack.State == DisposableState.Disposed;
  62. }
  63. private JsValue Move(JsValue thisObject, JsCallArguments arguments)
  64. {
  65. var stack = AssertDisposableStack(thisObject);
  66. var newDisposableStack = _engine.Intrinsics.Function.OrdinaryCreateFromConstructor(
  67. _engine.Intrinsics.DisposableStack,
  68. static intrinsics => intrinsics.DisposableStack.PrototypeObject,
  69. static (Engine engine, Realm _, object? _) => new DisposableStack(engine, DisposeHint.Sync));
  70. return stack.Move(newDisposableStack);
  71. }
  72. private JsValue Use(JsValue thisObject, JsCallArguments arguments)
  73. {
  74. var stack = AssertDisposableStack(thisObject);
  75. return stack.Use(arguments.At(0));
  76. }
  77. private DisposableStack AssertDisposableStack(JsValue thisObject)
  78. {
  79. if (thisObject is not DisposableStack { _hint: DisposeHint.Sync } stack)
  80. {
  81. ExceptionHelper.ThrowTypeError(_engine.Realm, "This is not a DisposableStack instance.");
  82. return null!;
  83. }
  84. return stack;
  85. }
  86. }