GlobalObject.h 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  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. 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);
  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. #ifdef IR_VIEWER
  45. static FunctionInfo ParseIR;
  46. static FunctionInfo FunctionList;
  47. static FunctionInfo RejitFunction;
  48. #endif /* IR_VIEWER */
  49. };
  50. static Var EntryEval(RecyclableObject* function, CallInfo callInfo, ...);
  51. static Var EntryEvalRestrictedMode(RecyclableObject* function, CallInfo callInfo, ...);
  52. static Var EntryParseInt(RecyclableObject* function, CallInfo callInfo, ...);
  53. static Var EntryParseFloat(RecyclableObject* function, CallInfo callInfo, ...);
  54. static Var EntryIsNaN(RecyclableObject* function, CallInfo callInfo, ...);
  55. static Var EntryIsFinite(RecyclableObject* function, CallInfo callInfo, ...);
  56. static Var EntryDecodeURI(RecyclableObject* function, CallInfo callInfo, ...);
  57. static Var EntryDecodeURIComponent(RecyclableObject* function, CallInfo callInfo, ...);
  58. static Var EntryEncodeURI(RecyclableObject* function, CallInfo callInfo, ...);
  59. static Var EntryEncodeURIComponent(RecyclableObject* function, CallInfo callInfo, ...);
  60. static Var EntryEscape(RecyclableObject* function, CallInfo callInfo, ...);
  61. static Var EntryUnEscape(RecyclableObject* function, CallInfo callInfo, ...);
  62. static Var EntryCollectGarbage(RecyclableObject* function, CallInfo callInfo, ...);
  63. #ifdef IR_VIEWER
  64. static Var EntryParseIR(RecyclableObject *function, CallInfo callInfo, ...);
  65. #define _refactor_ /* FIXME (t-doilij) */
  66. _refactor_ static Js::PropertyId CreateProperty(Js::ScriptContext *scriptContext, const wchar_t *propertyName);
  67. _refactor_ static void SetProperty(Js::DynamicObject *obj, const wchar_t *propertyName, Js::Var value);
  68. _refactor_ static void SetProperty(Js::DynamicObject *obj, Js::PropertyId id, Js::Var value);
  69. #undef _refactor_
  70. static Var FunctionInfoObjectBuilder(ScriptContext *scriptContext, const wchar_t *file,
  71. const wchar_t *function, ULONG lineNum, ULONG colNum,
  72. uint funcId, Js::Utf8SourceInfo *utf8SrcInfo, Js::Var source);
  73. static Var EntryFunctionList(RecyclableObject *function, CallInfo callInfo, ...);
  74. static Var EntryRejitFunction(RecyclableObject *function, CallInfo callInfo, ...);
  75. #endif /* IR_VIEWER */
  76. static void ValidateSyntax(ScriptContext* scriptContext, const wchar_t *source, int sourceLength, bool isGenerator, void (Parser::*validateSyntax)());
  77. static void UpdateThisForEval(Var &varThis, ModuleID moduleID, ScriptContext *scriptContext, BOOL strictMode) ;
  78. static ScriptFunction* DefaultEvalHelper(ScriptContext* scriptContext, const wchar_t *source, int sourceLength, ModuleID moduleID, ulong grfscr, LPCOLESTR pszTitle, BOOL registerDocument, BOOL isIndirect, BOOL strictMode);
  79. static ScriptFunction* ProfileModeEvalHelper(ScriptContext* scriptContext, const wchar_t *source, int sourceLength, ModuleID moduleID, ulong grfscr, LPCOLESTR pszTitle, BOOL registerDocument, BOOL isIndirect, BOOL strictMode);
  80. #ifdef IR_VIEWER
  81. static Var IRDumpEvalHelper(ScriptContext* scriptContext, const wchar_t *source,
  82. int sourceLength, ModuleID moduleID, ulong grfscr, LPCOLESTR pszTitle,
  83. BOOL registerDocument, BOOL isIndirect, BOOL strictMode);
  84. #endif /* IR_VIEWER */
  85. static bool Is(Var aValue);
  86. static GlobalObject* FromVar(Var aValue);
  87. typedef ScriptFunction* (*EvalHelperType)(ScriptContext* scriptContext, const wchar_t *source, int sourceLength, ModuleID moduleID, ulong grfscr, LPCOLESTR pszTitle, BOOL registerDocument, BOOL isIndirect, BOOL strictMode);
  88. EvalHelperType EvalHelper;
  89. static Var EntryEvalHelper(ScriptContext* scriptContext, RecyclableObject* function, CallInfo callInfo, Arguments& args);
  90. static Var VEval(JavascriptLibrary* library, FrameDisplay* environment, ModuleID moduleID, bool isStrictMode, bool isIndirect,
  91. Arguments& args, bool isLibraryCode, bool registerDocument, ulong additionalGrfscr);
  92. virtual BOOL HasProperty(PropertyId propertyId) override;
  93. virtual BOOL HasOwnProperty(PropertyId propertyId) override;
  94. virtual BOOL HasOwnPropertyNoHostObject(PropertyId propertyId) override;
  95. virtual BOOL UseDynamicObjectForNoHostObjectAccess() override { return TRUE; }
  96. virtual BOOL GetProperty(Var originalInstance, PropertyId propertyId, Var* value, PropertyValueInfo* info, ScriptContext* requestContext) override;
  97. virtual BOOL GetProperty(Var originalInstance, JavascriptString* propertyNameString, Var* value, PropertyValueInfo* info, ScriptContext* requestContext) override;
  98. virtual BOOL InitProperty(PropertyId propertyId, Var value, PropertyOperationFlags flags = PropertyOperation_None, PropertyValueInfo* info = NULL) override;
  99. virtual BOOL InitPropertyScoped(PropertyId propertyId, Var value) override;
  100. virtual BOOL InitFuncScoped(PropertyId propertyId, Var value) override;
  101. virtual BOOL SetProperty(PropertyId propertyId, Var value, PropertyOperationFlags flags, PropertyValueInfo* info) override;
  102. virtual BOOL SetProperty(JavascriptString* propertyNameString, Var value, PropertyOperationFlags flags, PropertyValueInfo* info) override;
  103. virtual BOOL DeleteProperty(PropertyId propertyId, PropertyOperationFlags flags) override;
  104. virtual BOOL GetPropertyReference(Var originalInstance, PropertyId propertyId, Var* value, PropertyValueInfo* info, ScriptContext* requestContext) override;
  105. virtual BOOL HasItem(uint32 index) override;
  106. virtual BOOL HasOwnItem(uint32 index) override sealed;
  107. virtual BOOL GetItemReference(Var originalInstance, uint32 index, Var* value, ScriptContext * requestContext) override;
  108. virtual BOOL GetItem(Var originalInstance, uint32 index, Var* value, ScriptContext * requestContext) override;
  109. virtual DescriptorFlags GetItemSetter(uint32 index, Var* setterValue, ScriptContext* requestContext) override;
  110. virtual BOOL GetAccessors(PropertyId propertyId, Var* getter, Var* setter, ScriptContext * requestContext) override;
  111. virtual BOOL SetItem(uint32 index, Var value, PropertyOperationFlags flags) override;
  112. virtual BOOL DeleteItem(uint32 index, PropertyOperationFlags flags) override;
  113. virtual BOOL SetAccessors(PropertyId propertyId, Var getter, Var setter, PropertyOperationFlags flags) override;
  114. virtual DescriptorFlags GetSetter(PropertyId propertyId, Var* setterValue, PropertyValueInfo* info, ScriptContext* requestContext) override;
  115. virtual DescriptorFlags GetSetter(JavascriptString* propertyNameString, Var* setterValue, PropertyValueInfo* info, ScriptContext* requestContext) override;
  116. virtual BOOL Equals(Var other, BOOL* value, ScriptContext * requestContext) override;
  117. virtual BOOL StrictEquals(Var other, BOOL* value, ScriptContext * requestContext) override;
  118. virtual BOOL GetDiagValueString(StringBuilder<ArenaAllocator>* stringBuilder, ScriptContext* requestContext) override;
  119. virtual BOOL GetDiagTypeString(StringBuilder<ArenaAllocator>* stringBuilder, ScriptContext* requestContext) override;
  120. virtual BOOL HasRootProperty(PropertyId propertyId) override;
  121. virtual BOOL GetRootProperty(Var originalInstance, PropertyId propertyId, Var* value, PropertyValueInfo* info, ScriptContext* requestContext) override;
  122. virtual BOOL GetRootPropertyReference(Var originalInstance, PropertyId propertyId, Var* value, PropertyValueInfo* info, ScriptContext* requestContext) override;
  123. virtual BOOL SetRootProperty(PropertyId propertyId, Var value, PropertyOperationFlags flags, PropertyValueInfo* info) override;
  124. virtual DescriptorFlags GetRootSetter(PropertyId propertyId, Var *setterValue, PropertyValueInfo* info, ScriptContext* requestContext) override;
  125. virtual BOOL DeleteRootProperty(PropertyId propertyId, PropertyOperationFlags flags) override;
  126. BOOL SetExistingProperty(PropertyId propertyId, Var value, PropertyValueInfo* info, BOOL *setAttempted);
  127. BOOL SetExistingRootProperty(PropertyId propertyId, Var value, PropertyValueInfo* info, BOOL *setAttempted);
  128. private:
  129. static BOOL MatchPatternHelper(JavascriptString *propertyName, JavascriptString *pattern, ScriptContext *scriptContext);
  130. private:
  131. RecyclableObject* directHostObject;
  132. RecyclableObject* secureDirectHostObject;
  133. typedef JsUtil::BaseHashSet<PropertyId, Recycler, PowerOf2SizePolicy> ReservedPropertiesHashSet;
  134. ReservedPropertiesHashSet * reservedProperties;
  135. };
  136. }