GlobalObject.h 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  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. namespace Js
  7. {
  8. class GlobalObject : public RootObjectBase
  9. {
  10. public:
  11. Field(JavascriptLibrary*) library;
  12. private:
  13. DEFINE_VTABLE_CTOR(GlobalObject, RootObjectBase);
  14. DEFINE_MARSHAL_OBJECT_TO_SCRIPT_CONTEXT(GlobalObject);
  15. GlobalObject(DynamicType * type, ScriptContext* scriptContext);
  16. static int const InitialCapacity = 52;
  17. static int const InlineSlotCapacity = 52;
  18. public:
  19. static GlobalObject * New(ScriptContext * scriptContext);
  20. JavascriptLibrary* GetLibrary() const {return library; }
  21. void Initialize(ScriptContext * scriptContext);
  22. HRESULT SetDirectHostObject(RecyclableObject* hostObject, RecyclableObject* secureHostObject);
  23. RecyclableObject* GetDirectHostObject();
  24. RecyclableObject* GetSecureDirectHostObject();
  25. Var ToThis();
  26. BOOL ReserveGlobalProperty(PropertyId propertyId);
  27. BOOL IsReservedGlobalProperty(PropertyId propertyId);
  28. Var ExecuteEvalParsedFunction(ScriptFunction *pfuncScript, FrameDisplay* environment, Var &varThis, ScriptContext *scriptContext);
  29. class EntryInfo
  30. {
  31. public:
  32. static FunctionInfo Eval;
  33. static FunctionInfo ParseInt;
  34. static FunctionInfo ParseFloat;
  35. static FunctionInfo IsNaN;
  36. static FunctionInfo IsFinite;
  37. static FunctionInfo DecodeURI;
  38. static FunctionInfo DecodeURIComponent;
  39. static FunctionInfo EncodeURI;
  40. static FunctionInfo EncodeURIComponent;
  41. static FunctionInfo Escape;
  42. static FunctionInfo UnEscape;
  43. static FunctionInfo CollectGarbage;
  44. #if ENABLE_TTD
  45. static FunctionInfo TelemetryLog;
  46. static FunctionInfo EnabledDiagnosticsTrace;
  47. static FunctionInfo EmitTTDLog;
  48. #endif
  49. #ifdef IR_VIEWER
  50. static FunctionInfo ParseIR;
  51. static FunctionInfo FunctionList;
  52. static FunctionInfo RejitFunction;
  53. #endif /* IR_VIEWER */
  54. };
  55. static Var EntryEval(RecyclableObject* function, CallInfo callInfo, ...);
  56. static Var EntryEvalRestrictedMode(RecyclableObject* function, CallInfo callInfo, ...);
  57. static Var EntryParseInt(RecyclableObject* function, CallInfo callInfo, ...);
  58. static Var EntryParseFloat(RecyclableObject* function, CallInfo callInfo, ...);
  59. static Var EntryIsNaN(RecyclableObject* function, CallInfo callInfo, ...);
  60. static Var EntryIsFinite(RecyclableObject* function, CallInfo callInfo, ...);
  61. static Var EntryDecodeURI(RecyclableObject* function, CallInfo callInfo, ...);
  62. static Var EntryDecodeURIComponent(RecyclableObject* function, CallInfo callInfo, ...);
  63. static Var EntryEncodeURI(RecyclableObject* function, CallInfo callInfo, ...);
  64. static Var EntryEncodeURIComponent(RecyclableObject* function, CallInfo callInfo, ...);
  65. static Var EntryEscape(RecyclableObject* function, CallInfo callInfo, ...);
  66. static Var EntryUnEscape(RecyclableObject* function, CallInfo callInfo, ...);
  67. static Var EntryCollectGarbage(RecyclableObject* function, CallInfo callInfo, ...);
  68. #if ENABLE_TTD
  69. static Var EntryTelemetryLog(RecyclableObject* function, CallInfo callInfo, ...);
  70. static Var EntryEnabledDiagnosticsTrace(RecyclableObject* function, CallInfo callInfo, ...);
  71. static Var EntryEmitTTDLog(RecyclableObject* function, CallInfo callInfo, ...);
  72. #endif
  73. #ifdef IR_VIEWER
  74. static Var EntryParseIR(RecyclableObject *function, CallInfo callInfo, ...);
  75. #define _refactor_ /* FIXME (t-doilij) */
  76. _refactor_ static Js::PropertyId CreateProperty(Js::ScriptContext *scriptContext, const char16 *propertyName);
  77. _refactor_ static void SetProperty(Js::DynamicObject *obj, const char16 *propertyName, Js::Var value);
  78. _refactor_ static void SetProperty(Js::DynamicObject *obj, Js::PropertyId id, Js::Var value);
  79. #undef _refactor_
  80. static Var FunctionInfoObjectBuilder(ScriptContext *scriptContext, const char16 *file,
  81. const char16 *function, ULONG lineNum, ULONG colNum,
  82. uint funcId, Js::Utf8SourceInfo *utf8SrcInfo, Js::Var source);
  83. static Var EntryFunctionList(RecyclableObject *function, CallInfo callInfo, ...);
  84. static Var EntryRejitFunction(RecyclableObject *function, CallInfo callInfo, ...);
  85. #endif /* IR_VIEWER */
  86. static void ValidateSyntax(ScriptContext* scriptContext, const char16 *source, int sourceLength, bool isGenerator, bool isAsync, void (Parser::*validateSyntax)());
  87. static void UpdateThisForEval(Var &varThis, ModuleID moduleID, ScriptContext *scriptContext, BOOL strictMode) ;
  88. static ScriptFunction* DefaultEvalHelper(ScriptContext* scriptContext, const char16 *source, int sourceLength, ModuleID moduleID, uint32 grfscr, LPCOLESTR pszTitle, BOOL registerDocument, BOOL isIndirect, BOOL strictMode);
  89. #ifdef ENABLE_SCRIPT_PROFILING
  90. static ScriptFunction* ProfileModeEvalHelper(ScriptContext* scriptContext, const char16 *source, int sourceLength, ModuleID moduleID, uint32 grfscr, LPCOLESTR pszTitle, BOOL registerDocument, BOOL isIndirect, BOOL strictMode);
  91. #endif
  92. #ifdef IR_VIEWER
  93. static Var IRDumpEvalHelper(ScriptContext* scriptContext, const char16 *source,
  94. int sourceLength, ModuleID moduleID, uint32 grfscr, LPCOLESTR pszTitle,
  95. BOOL registerDocument, BOOL isIndirect, BOOL strictMode);
  96. #endif /* IR_VIEWER */
  97. static bool Is(Var aValue);
  98. static GlobalObject* FromVar(Var aValue);
  99. typedef ScriptFunction* (*EvalHelperType)(ScriptContext* scriptContext, const char16 *source, int sourceLength, ModuleID moduleID, uint32 grfscr, LPCOLESTR pszTitle, BOOL registerDocument, BOOL isIndirect, BOOL strictMode);
  100. FieldNoBarrier(EvalHelperType) EvalHelper;
  101. static Var EntryEvalHelper(ScriptContext* scriptContext, RecyclableObject* function, CallInfo callInfo, Arguments& args);
  102. static Var VEval(JavascriptLibrary* library, FrameDisplay* environment, ModuleID moduleID, bool isStrictMode, bool isIndirect,
  103. Arguments& args, bool isLibraryCode, bool registerDocument, uint32 additionalGrfscr);
  104. virtual BOOL HasProperty(PropertyId propertyId) override;
  105. virtual BOOL HasOwnProperty(PropertyId propertyId) override;
  106. virtual BOOL HasOwnPropertyNoHostObject(PropertyId propertyId) override;
  107. virtual BOOL UseDynamicObjectForNoHostObjectAccess() override { return TRUE; }
  108. virtual BOOL GetProperty(Var originalInstance, PropertyId propertyId, Var* value, PropertyValueInfo* info, ScriptContext* requestContext) override;
  109. virtual BOOL GetProperty(Var originalInstance, JavascriptString* propertyNameString, Var* value, PropertyValueInfo* info, ScriptContext* requestContext) override;
  110. virtual BOOL InitProperty(PropertyId propertyId, Var value, PropertyOperationFlags flags = PropertyOperation_None, PropertyValueInfo* info = NULL) override;
  111. virtual BOOL InitPropertyScoped(PropertyId propertyId, Var value) override;
  112. virtual BOOL InitFuncScoped(PropertyId propertyId, Var value) override;
  113. virtual BOOL SetProperty(PropertyId propertyId, Var value, PropertyOperationFlags flags, PropertyValueInfo* info) override;
  114. virtual BOOL SetProperty(JavascriptString* propertyNameString, Var value, PropertyOperationFlags flags, PropertyValueInfo* info) override;
  115. virtual BOOL DeleteProperty(PropertyId propertyId, PropertyOperationFlags flags) override;
  116. virtual BOOL DeleteProperty(JavascriptString *propertyNameString, PropertyOperationFlags flags) override;
  117. virtual BOOL GetPropertyReference(Var originalInstance, PropertyId propertyId, Var* value, PropertyValueInfo* info, ScriptContext* requestContext) override;
  118. virtual BOOL HasItem(uint32 index) override;
  119. virtual BOOL HasOwnItem(uint32 index) override sealed;
  120. virtual BOOL GetItemReference(Var originalInstance, uint32 index, Var* value, ScriptContext * requestContext) override;
  121. virtual BOOL GetItem(Var originalInstance, uint32 index, Var* value, ScriptContext * requestContext) override;
  122. virtual DescriptorFlags GetItemSetter(uint32 index, Var* setterValue, ScriptContext* requestContext) override;
  123. virtual BOOL GetAccessors(PropertyId propertyId, Var* getter, Var* setter, ScriptContext * requestContext) override;
  124. virtual BOOL SetItem(uint32 index, Var value, PropertyOperationFlags flags) override;
  125. virtual BOOL DeleteItem(uint32 index, PropertyOperationFlags flags) override;
  126. virtual BOOL SetAccessors(PropertyId propertyId, Var getter, Var setter, PropertyOperationFlags flags) override;
  127. virtual DescriptorFlags GetSetter(PropertyId propertyId, Var* setterValue, PropertyValueInfo* info, ScriptContext* requestContext) override;
  128. virtual DescriptorFlags GetSetter(JavascriptString* propertyNameString, Var* setterValue, PropertyValueInfo* info, ScriptContext* requestContext) override;
  129. virtual BOOL Equals(__in Var other, __out BOOL* value, ScriptContext * requestContext) override;
  130. virtual BOOL StrictEquals(__in Var other, __out BOOL* value, ScriptContext * requestContext) override;
  131. virtual BOOL GetDiagValueString(StringBuilder<ArenaAllocator>* stringBuilder, ScriptContext* requestContext) override;
  132. virtual BOOL GetDiagTypeString(StringBuilder<ArenaAllocator>* stringBuilder, ScriptContext* requestContext) override;
  133. virtual BOOL HasRootProperty(PropertyId propertyId) override;
  134. virtual BOOL GetRootProperty(Var originalInstance, PropertyId propertyId, Var* value, PropertyValueInfo* info, ScriptContext* requestContext) override;
  135. virtual BOOL GetRootPropertyReference(Var originalInstance, PropertyId propertyId, Var* value, PropertyValueInfo* info, ScriptContext* requestContext) override;
  136. virtual BOOL SetRootProperty(PropertyId propertyId, Var value, PropertyOperationFlags flags, PropertyValueInfo* info) override;
  137. virtual DescriptorFlags GetRootSetter(PropertyId propertyId, Var *setterValue, PropertyValueInfo* info, ScriptContext* requestContext) override;
  138. virtual BOOL DeleteRootProperty(PropertyId propertyId, PropertyOperationFlags flags) override;
  139. BOOL SetExistingProperty(PropertyId propertyId, Var value, PropertyValueInfo* info, BOOL *setAttempted);
  140. BOOL SetExistingRootProperty(PropertyId propertyId, Var value, PropertyValueInfo* info, BOOL *setAttempted);
  141. private:
  142. static BOOL MatchPatternHelper(JavascriptString *propertyName, JavascriptString *pattern, ScriptContext *scriptContext);
  143. private:
  144. Field(RecyclableObject*) directHostObject;
  145. Field(RecyclableObject*) secureDirectHostObject;
  146. typedef JsUtil::BaseHashSet<PropertyId, Recycler, PowerOf2SizePolicy> ReservedPropertiesHashSet;
  147. Field(ReservedPropertiesHashSet *) reservedProperties;
  148. #if ENABLE_TTD
  149. public:
  150. virtual TTD::NSSnapObjects::SnapObjectType GetSnapTag_TTD() const override;
  151. virtual void ExtractSnapObjectDataInto(TTD::NSSnapObjects::SnapObject* objData, TTD::SlabAllocator& alloc) override;
  152. #endif
  153. };
  154. }