EngineInterfaceObject.h 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. //-------------------------------------------------------------------------------------------------------
  2. // Copyright (C) Microsoft. All rights reserved.
  3. // Copyright (c) 2021 ChakraCore Project Contributors. All rights reserved.
  4. // Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
  5. //-------------------------------------------------------------------------------------------------------
  6. #pragma once
  7. #if defined(ENABLE_INTL_OBJECT) || defined(ENABLE_JS_BUILTINS)
  8. #pragma warning(push)
  9. #pragma warning(disable:4309) // truncation of constant value
  10. #pragma warning(disable:4838) // conversion from 'int' to 'const char' requires a narrowing conversion
  11. #if DISABLE_JIT
  12. #if TARGET_64
  13. #include "InJavascript/JsBuiltIn.nojit.bc.64b.h"
  14. #else
  15. #include "InJavascript/JsBuiltIn.nojit.bc.32b.h"
  16. #endif // TARGET_64
  17. #else
  18. #if TARGET_64
  19. #include "InJavascript/JsBuiltIn.bc.64b.h"
  20. #else
  21. #include "InJavascript/JsBuiltIn.bc.32b.h"
  22. #endif // TARGET_64
  23. #endif // DISABLE_JIT
  24. #pragma warning(pop)
  25. namespace Js
  26. {
  27. class WindowsGlobalizationAdapter;
  28. enum EngineInterfaceExtensionKind
  29. {
  30. EngineInterfaceExtensionKind_JsBuiltIn = 0,
  31. EngineInterfaceExtensionKind_Intl = 1,
  32. EngineInterfaceExtensionKind_WinRTPromise = 2,
  33. MaxEngineInterfaceExtensionKind = EngineInterfaceExtensionKind_WinRTPromise
  34. };
  35. class EngineExtensionObjectBase
  36. {
  37. public:
  38. EngineExtensionObjectBase(EngineInterfaceExtensionKind kind, Js::ScriptContext * context) :
  39. extensionKind(kind),
  40. scriptContext(context)
  41. {
  42. hasBytecode = false;
  43. }
  44. EngineInterfaceExtensionKind GetExtensionKind() const { return extensionKind; }
  45. ScriptContext* GetScriptContext() const { return scriptContext; }
  46. bool GetHasByteCode() const { return hasBytecode; }
  47. void SetHasBytecode() { hasBytecode = true; }
  48. virtual void Initialize() = 0;
  49. #if DBG
  50. virtual void DumpByteCode() = 0;
  51. #endif
  52. protected:
  53. Field(EngineInterfaceExtensionKind) extensionKind;
  54. Field(ScriptContext*) scriptContext;
  55. Field(bool) hasBytecode;
  56. };
  57. #define EngineInterfaceObject_CommonFunctionProlog(function, callInfo) \
  58. PROBE_STACK(function->GetScriptContext(), Js::Constants::MinStackDefault); \
  59. RUNTIME_ARGUMENTS(args, callInfo); \
  60. Assert(!(callInfo.Flags & CallFlags_New)); \
  61. unsigned argCount = args.Info.Count; \
  62. ScriptContext* scriptContext = function->GetScriptContext(); \
  63. AssertMsg(argCount > 0, "Should always have implicit 'this'"); \
  64. class EngineInterfaceObject : public DynamicObject
  65. {
  66. private:
  67. DEFINE_VTABLE_CTOR(EngineInterfaceObject, DynamicObject);
  68. DEFINE_MARSHAL_OBJECT_TO_SCRIPT_CONTEXT(EngineInterfaceObject);
  69. Field(DynamicObject*) commonNativeInterfaces;
  70. Field(EngineExtensionObjectBase*) engineExtensions[MaxEngineInterfaceExtensionKind + 1];
  71. public:
  72. EngineInterfaceObject(DynamicType * type)
  73. : DynamicObject(type), commonNativeInterfaces(nullptr), engineExtensions()
  74. {}
  75. DynamicObject* GetCommonNativeInterfaces() const { return commonNativeInterfaces; }
  76. EngineExtensionObjectBase* GetEngineExtension(EngineInterfaceExtensionKind extensionKind) const;
  77. void SetEngineExtension(EngineInterfaceExtensionKind extensionKind, EngineExtensionObjectBase* extensionObject);
  78. static EngineInterfaceObject* New(Recycler * recycler, DynamicType * type);
  79. #if ENABLE_TTD
  80. virtual void MarkVisitKindSpecificPtrs(TTD::SnapshotExtractor* extractor) override;
  81. virtual void ProcessCorePaths() override;
  82. virtual TTD::NSSnapObjects::SnapObjectType GetSnapTag_TTD() const override;
  83. virtual void ExtractSnapObjectDataInto(TTD::NSSnapObjects::SnapObject* objData, TTD::SlabAllocator& alloc) override;
  84. #endif
  85. void Initialize();
  86. bool IsInitialized() const { return commonNativeInterfaces != nullptr; }
  87. static bool __cdecl InitializeCommonNativeInterfaces(DynamicObject* engineInterface, DeferredTypeHandlerBase * typeHandler, DeferredInitializeMode mode);
  88. static ScriptFunction *CreateLibraryCodeScriptFunction(ScriptFunction *scriptFunction, JavascriptString *displayName, bool isConstructor, bool isJsBuiltIn, bool isPublic);
  89. class EntryInfo
  90. {
  91. public:
  92. // CallInstanceFunction is still handled specially because it gets special inline treatment from the JIT
  93. static FunctionInfo CallInstanceFunction;
  94. #define BuiltInRaiseException(exceptionType, exceptionID) static NoProfileFunctionInfo BuiltIn_raise##exceptionID;
  95. #define EngineInterfaceBuiltIn2(propId, nativeMethod) static NoProfileFunctionInfo nativeMethod;
  96. #include "EngineInterfaceObjectBuiltIns.h"
  97. };
  98. static Var Entry_CallInstanceFunction(RecyclableObject *function, CallInfo callInfo, ...);
  99. #define BuiltInRaiseException(exceptionType, exceptionID) static Var Entry_BuiltIn_raise##exceptionID(RecyclableObject *function, CallInfo callInfo, ...);
  100. #define EngineInterfaceBuiltIn2(propId, nativeMethod) static Var Entry_##nativeMethod(RecyclableObject *function, CallInfo callInfo, ...);
  101. #include "EngineInterfaceObjectBuiltIns.h"
  102. };
  103. template <> inline bool VarIsImpl<EngineInterfaceObject>(RecyclableObject* obj)
  104. {
  105. return JavascriptOperators::GetTypeId(obj) == TypeIds_EngineInterfaceObject;
  106. }
  107. }
  108. #endif // ENABLE_INTL_OBJECT || ENABLE_JS_BUILTINS