WeakRefConstructor.cs 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354
  1. using Jint.Native.Function;
  2. using Jint.Native.Object;
  3. using Jint.Runtime;
  4. using Jint.Runtime.Descriptors;
  5. namespace Jint.Native.WeakRef;
  6. /// <summary>
  7. /// https://tc39.es/ecma262/#sec-weak-ref-constructor
  8. /// </summary>
  9. internal sealed class WeakRefConstructor : Constructor
  10. {
  11. private static readonly JsString _functionName = new("WeakRef");
  12. internal WeakRefConstructor(
  13. Engine engine,
  14. Realm realm,
  15. FunctionPrototype functionPrototype,
  16. ObjectPrototype objectPrototype)
  17. : base(engine, realm, _functionName)
  18. {
  19. _prototype = functionPrototype;
  20. PrototypeObject = new WeakRefPrototype(engine, realm, this, objectPrototype);
  21. _length = new PropertyDescriptor(1, PropertyFlag.Configurable);
  22. _prototypeDescriptor = new PropertyDescriptor(PrototypeObject, PropertyFlag.AllForbidden);
  23. }
  24. private WeakRefPrototype PrototypeObject { get; }
  25. public override ObjectInstance Construct(JsCallArguments arguments, JsValue newTarget)
  26. {
  27. if (newTarget.IsUndefined())
  28. {
  29. Throw.TypeError(_realm);
  30. }
  31. var target = arguments.At(0);
  32. if (!target.CanBeHeldWeakly(_engine.GlobalSymbolRegistry))
  33. {
  34. Throw.TypeError(_realm, "WeakRef: target must be an object or symbol");
  35. }
  36. var weakRef = OrdinaryCreateFromConstructor(
  37. newTarget,
  38. static intrinsics => intrinsics.WeakRef.PrototypeObject,
  39. static (engine, _, target) => new JsWeakRef(engine, target!),
  40. target);
  41. _engine.AddToKeptObjects(target);
  42. return weakRef;
  43. }
  44. }