ClrHelper.cs 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. using Jint.Native;
  2. namespace Jint.Runtime.Interop;
  3. #pragma warning disable IL2072
  4. internal sealed class ClrHelper
  5. {
  6. private readonly Options.InteropOptions _interopOptions;
  7. internal ClrHelper(Options.InteropOptions interopOptions)
  8. {
  9. _interopOptions = interopOptions;
  10. }
  11. /// <summary>
  12. /// Call JsValue.ToString(), mainly for NamespaceReference.
  13. /// </summary>
  14. #pragma warning disable CA1822
  15. public JsValue ToString(JsValue value)
  16. #pragma warning restore CA1822
  17. {
  18. return value.ToString();
  19. }
  20. /// <summary>
  21. /// Cast `obj as ISomeInterface` to `obj`
  22. /// </summary>
  23. #pragma warning disable CA1822
  24. public JsValue Unwrap(ObjectWrapper obj)
  25. #pragma warning restore CA1822
  26. {
  27. return ObjectWrapper.Create(obj.Engine, obj.Target);
  28. }
  29. /// <summary>
  30. /// Cast `obj` to `obj as ISomeInterface`
  31. /// </summary>
  32. #pragma warning disable CA1822
  33. public JsValue Wrap(ObjectWrapper obj, TypeReference type)
  34. #pragma warning restore CA1822
  35. {
  36. if (!type.ReferenceType.IsInstanceOfType(obj.Target))
  37. {
  38. Throw.TypeError(type.Engine.Realm, "Argument obj must be an instance of type");
  39. }
  40. return ObjectWrapper.Create(obj.Engine, obj.Target, type.ReferenceType);
  41. }
  42. /// <summary>
  43. /// Get `TypeReference(ISomeInterface)` from `obj as ISomeInterface`
  44. /// </summary>
  45. public JsValue TypeOf(ObjectWrapper obj)
  46. {
  47. MustAllowGetType();
  48. return TypeReference.CreateTypeReference(obj.Engine, obj.ClrType);
  49. }
  50. /// <summary>
  51. /// Cast `TypeReference(SomeClass)` to `ObjectWrapper(SomeClass)`
  52. /// </summary>
  53. public JsValue TypeToObject(TypeReference type)
  54. {
  55. MustAllowGetType();
  56. var engine = type.Engine;
  57. return engine.Options.Interop.WrapObjectHandler.Invoke(engine, type.ReferenceType, null) ?? JsValue.Undefined;
  58. }
  59. /// <summary>
  60. /// Cast `ObjectWrapper(SomeClass)` to `TypeReference(SomeClass)`
  61. /// </summary>
  62. public JsValue ObjectToType(ObjectWrapper obj)
  63. {
  64. MustAllowGetType();
  65. if (obj.Target is Type t)
  66. {
  67. return TypeReference.CreateTypeReference(obj.Engine, t);
  68. }
  69. Throw.ArgumentException("Must be an ObjectWrapper of Type", nameof(obj));
  70. return JsValue.Undefined;
  71. }
  72. private void MustAllowGetType()
  73. {
  74. if (!_interopOptions.AllowGetType)
  75. {
  76. Throw.InvalidOperationException("Invalid when Engine.Options.Interop.AllowGetType == false");
  77. }
  78. }
  79. }