EngineInterfaceObject.h 4.9 KB

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