JavascriptOperators.h 57 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653
  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 IR
  7. {
  8. class LabelInstr;
  9. }
  10. enum JsNativeValueType: int;
  11. namespace Js
  12. {
  13. struct ResumeYieldData;
  14. #define DeclareExceptionPointer(ep) \
  15. EXCEPTION_RECORD ep##er; \
  16. CONTEXT ep##c; \
  17. EXCEPTION_POINTERS ep = {&ep##er, &ep##c};
  18. #define TYPEOF_ERROR_HANDLER_CATCH(scriptContext, var) \
  19. } \
  20. catch (Js::JavascriptExceptionObject *exceptionObject) \
  21. { \
  22. Js::Var errorObject = exceptionObject->GetThrownObject(nullptr); \
  23. if (errorObject != nullptr && Js::JavascriptError::Is(errorObject)) \
  24. { \
  25. HRESULT hr = Js::JavascriptError::GetRuntimeError(Js::RecyclableObject::FromVar(errorObject), nullptr); \
  26. if (JavascriptError::GetErrorNumberFromResourceID(JSERR_Property_CannotGet_NullOrUndefined) == (long)hr \
  27. || JavascriptError::GetErrorNumberFromResourceID(JSERR_UseBeforeDeclaration) == (long)hr) \
  28. { \
  29. if (scriptContext->IsScriptContextInDebugMode()) \
  30. { \
  31. JavascriptExceptionOperators::ThrowExceptionObject(exceptionObject, scriptContext, true); \
  32. } \
  33. else \
  34. { \
  35. throw exceptionObject; \
  36. } \
  37. } \
  38. } \
  39. var = scriptContext->GetLibrary()->GetUndefined();
  40. #define TYPEOF_ERROR_HANDLER_THROW(scriptContext, var) \
  41. } \
  42. if (scriptContext->IsUndeclBlockVar(var)) \
  43. { \
  44. JavascriptError::ThrowReferenceError(scriptContext, JSERR_UseBeforeDeclaration); \
  45. }
  46. #define BEGIN_TYPEOF_ERROR_HANDLER(scriptContext) \
  47. try { \
  48. Js::JavascriptExceptionOperators::AutoCatchHandlerExists autoCatchHandlerExists(scriptContext); \
  49. class AutoCleanup \
  50. { \
  51. private: \
  52. ScriptContext *const scriptContext; \
  53. public: \
  54. AutoCleanup(ScriptContext *const scriptContext) : scriptContext(scriptContext) \
  55. { \
  56. if (scriptContext->IsScriptContextInDebugMode()) \
  57. { \
  58. scriptContext->GetDebugContext()->GetProbeContainer()->SetThrowIsInternal(true); \
  59. } \
  60. } \
  61. ~AutoCleanup() \
  62. { \
  63. if (scriptContext->IsScriptContextInDebugMode()) \
  64. { \
  65. scriptContext->GetDebugContext()->GetProbeContainer()->SetThrowIsInternal(false); \
  66. } \
  67. } \
  68. } autoCleanup(scriptContext);
  69. #define END_TYPEOF_ERROR_HANDLER(scriptContext, var) \
  70. TYPEOF_ERROR_HANDLER_CATCH(scriptContext, var) \
  71. TYPEOF_ERROR_HANDLER_THROW(scriptContext, var)
  72. #define BEGIN_PROFILED_TYPEOF_ERROR_HANDLER(scriptContext) \
  73. BEGIN_TYPEOF_ERROR_HANDLER(scriptContext)
  74. #define END_PROFILED_TYPEOF_ERROR_HANDLER(scriptContext, var, functionBody, inlineCacheIndex) \
  75. TYPEOF_ERROR_HANDLER_CATCH(scriptContext, var) \
  76. functionBody->GetDynamicProfileInfo()->RecordFieldAccess(functionBody, inlineCacheIndex, var, FldInfo_NoInfo); \
  77. TYPEOF_ERROR_HANDLER_THROW(scriptContext, var)
  78. class JavascriptOperators /* All static */
  79. {
  80. // Methods
  81. public:
  82. static void FreeTemp(Var aValue);
  83. static BOOL IsArray(Var instanceVar);
  84. static BOOL IsConstructor(Var instanceVar);
  85. static BOOL IsConcatSpreadable(Var instanceVar);
  86. static Var ToObject(Var aRight,ScriptContext* scriptContext);
  87. static Var ToWithObject(Var aRight, ScriptContext* scriptContext);
  88. static Var OP_LdCustomSpreadIteratorList(Var aRight, ScriptContext* scriptContext);
  89. static Var ToNumber(Var aRight,ScriptContext* scriptContext);
  90. static Var ToNumberInPlace(Var aRight,ScriptContext* scriptContext, JavascriptNumber* result);
  91. #ifdef _M_IX86
  92. static Var Int32ToVar(int32 value, ScriptContext* scriptContext);
  93. static Var Int32ToVarInPlace(int32 value, ScriptContext* scriptContext, JavascriptNumber *result);
  94. static Var UInt32ToVar(uint32 value, ScriptContext* scriptContext);
  95. static Var UInt32ToVarInPlace(uint32 value, ScriptContext* scriptContext, JavascriptNumber *result);
  96. #endif
  97. static Var OP_FinishOddDivBy2(uint32 value, ScriptContext *scriptContext);
  98. static Var OP_ApplyArgs(Var func,Var instance,__in_xcount(8)void** stackPtr,CallInfo callInfo,ScriptContext* scriptContext);
  99. static Var Typeof(Var var, ScriptContext* scriptContext);
  100. static Var TypeofFld(Var instance, PropertyId propertyId, ScriptContext* scriptContext);
  101. static Var TypeofRootFld(Var instance, PropertyId propertyId, ScriptContext* scriptContext);
  102. static Var TypeofElem(Var instance, Var index, ScriptContext* scriptContext);
  103. static Var TypeofElem_UInt32(Var instance, uint32 index, ScriptContext* scriptContext);
  104. static Var TypeofElem_Int32(Var instance, int32 index, ScriptContext* scriptContext);
  105. static Var Delete(Var var, ScriptContext* scriptContext);
  106. static JavascriptString * Concat3(Var aLeft, Var aCenter, Var aRight, ScriptContext * scriptContext);
  107. static JavascriptString * NewConcatStrMulti(Var a1, Var a2, uint count, ScriptContext * scriptContext);
  108. static void SetConcatStrMultiItem(Var concatStr, Var str, uint index, ScriptContext * scriptContext);
  109. static void SetConcatStrMultiItem2(Var concatStr, Var str1, Var str2, uint index, ScriptContext * scriptContext);
  110. static BOOL Equal(Var aLeft, Var aRight,ScriptContext* scriptContext);
  111. static BOOL Equal_Full(Var aLeft, Var aRight,ScriptContext* scriptContext);
  112. static BOOL Greater(Var aLeft, Var aRight,ScriptContext* scriptContext);
  113. static BOOL Greater_Full(Var aLeft, Var aRight,ScriptContext* scriptContext);
  114. static BOOL GreaterEqual(Var aLeft, Var aRight,ScriptContext* scriptContext);
  115. static BOOL GreaterEqual_Full(Var aLeft, Var aRight,ScriptContext* scriptContext);
  116. static BOOL Less(Var aLeft, Var aRight,ScriptContext* scriptContext);
  117. static BOOL Less_Full(Var aLeft, Var aRight,ScriptContext* scriptContext);
  118. static BOOL LessEqual(Var aLeft, Var aRight,ScriptContext* scriptContext);
  119. static BOOL LessEqual_Full(Var aLeft, Var aRight,ScriptContext* scriptContext);
  120. static BOOL NotEqual(Var aLeft, Var aRight,ScriptContext* scriptContext);
  121. static BOOL NotEqual_Full(Var aLeft, Var aRight,ScriptContext* scriptContext);
  122. static BOOL StrictEqual(Var aLeft, Var aRight,ScriptContext* scriptContext);
  123. static BOOL StrictEqualString(Var aLeft, Var aRight);
  124. static BOOL StrictEqualEmptyString(Var aLeft);
  125. static BOOL NotStrictEqual(Var aLeft, Var aRight,ScriptContext* scriptContext);
  126. static BOOL HasOwnProperty(Var instance, PropertyId propertyId, ScriptContext * requestContext);
  127. static BOOL GetOwnProperty(Var instance, PropertyId propertyId, Var* value, ScriptContext* requestContext);
  128. static BOOL GetOwnAccessors(Var instance, PropertyId propertyId, Var* getter, Var* setter, ScriptContext * requestContext);
  129. static BOOL EnsureProperty(Var instance, PropertyId propertyId);
  130. static void OP_EnsureNoRootProperty(Var instance, PropertyId propertyId);
  131. static void OP_EnsureNoRootRedeclProperty(Var instance, PropertyId propertyId);
  132. static void OP_ScopedEnsureNoRedeclProperty(FrameDisplay *pDisplay, PropertyId propertyId, Var instanceDefault);
  133. static Var GetOwnPropertyNames(Var instance, ScriptContext *scriptContext);
  134. static Var GetOwnPropertySymbols(Var instance, ScriptContext *scriptContext);
  135. static Var GetOwnPropertyKeys(Var instance, ScriptContext *scriptContext);
  136. static Var GetOwnEnumerablePropertyNames(Var instance, ScriptContext *scriptContext);
  137. static Var GetOwnEnumerablePropertyNamesSymbols(Var instance, ScriptContext *scriptContext);
  138. static BOOL GetOwnPropertyDescriptor(RecyclableObject* obj, PropertyId propertyId, ScriptContext* scriptContext, PropertyDescriptor* propertyDescriptor);
  139. static BOOL GetOwnPropertyDescriptor(RecyclableObject* obj, JavascriptString* propertyKey, ScriptContext* scriptContext, PropertyDescriptor* propertyDescriptor);
  140. static BOOL IsPropertyUnscopable (Var instanceVar, PropertyId propertyId);
  141. static BOOL IsPropertyUnscopable (Var instanceVar, JavascriptString *propertyString);
  142. template<bool unscopables>
  143. static BOOL HasProperty_Impl(RecyclableObject* instance, PropertyId propertyId);
  144. static BOOL HasPropertyUnscopables(RecyclableObject* instance, PropertyId propertyId);
  145. static BOOL HasProperty(RecyclableObject* instance, PropertyId propertyId);
  146. static BOOL HasRootProperty(RecyclableObject* instance, PropertyId propertyId);
  147. static BOOL HasProxyOrPrototypeInlineCacheProperty(RecyclableObject* instance, PropertyId propertyId);
  148. static BOOL HasProxyInPrototypeChain(RecyclableObject* instance);
  149. template<typename PropertyKeyType>
  150. static BOOL GetPropertyWPCache(Var instance, RecyclableObject* propertyObject, PropertyKeyType propertyKey, Var* value, ScriptContext* requestContext, PropertyString * propertyString);
  151. static BOOL GetPropertyUnscopable(Var instance, RecyclableObject* propertyObject, PropertyId propertyId, Var* value, ScriptContext* requestContext, PropertyValueInfo* info=NULL);
  152. static Var GetProperty(RecyclableObject* instance, PropertyId propertyId, ScriptContext* requestContext, PropertyValueInfo* info = NULL);
  153. static BOOL GetProperty(RecyclableObject* instance, PropertyId propertyId, Var* value, ScriptContext* requestContext, PropertyValueInfo* info = NULL);
  154. static Var GetProperty(Var instance, RecyclableObject* propertyObject, PropertyId propertyId, ScriptContext* requestContext, PropertyValueInfo* info = NULL);
  155. static BOOL GetProperty(Var instance, RecyclableObject* propertyObject, PropertyId propertyId, Var* value, ScriptContext* requestContext, PropertyValueInfo* info = NULL);
  156. static BOOL GetPropertyObject(Var instance, ScriptContext * scriptContext, RecyclableObject** propertyObject);
  157. static BOOL GetRootProperty(Var instance, PropertyId propertyId, Var* value, ScriptContext* requestContext, PropertyValueInfo* info = NULL);
  158. static Var GetRootProperty(RecyclableObject* instance, PropertyId propertyId, ScriptContext* requestContext, PropertyValueInfo* info = NULL);
  159. static Var GetPropertyReference(RecyclableObject* instance, PropertyId propertyId, ScriptContext* requestContext);
  160. static BOOL GetPropertyReference(RecyclableObject* instance, PropertyId propertyId, Var* value,ScriptContext* requestContext, PropertyValueInfo* info = NULL);
  161. static BOOL GetPropertyReference(Var instance, RecyclableObject* propertyObject, PropertyId propertyId, Var* value,ScriptContext* requestContext, PropertyValueInfo* info = NULL);
  162. static BOOL GetRootPropertyReference(RecyclableObject* instance, PropertyId propertyId, Var* value,ScriptContext* requestContext, PropertyValueInfo* info = NULL);
  163. template<typename PropertyKeyType>
  164. static BOOL SetPropertyWPCache(Var instance, RecyclableObject* object, PropertyKeyType propertyKey, Var newValue, ScriptContext* requestContext, PropertyString * propertyString, PropertyOperationFlags flags);
  165. static BOOL SetPropertyUnscopable(Var instance, RecyclableObject* receiver, PropertyId propertyId, Var newValue, PropertyValueInfo * info, ScriptContext* requestContext, PropertyOperationFlags flags = PropertyOperation_None);
  166. static BOOL SetProperty(Var instance, RecyclableObject* object, PropertyId propertyId, Var newValue, ScriptContext* requestContext, PropertyOperationFlags flags = PropertyOperation_None);
  167. static BOOL SetProperty(Var instance, RecyclableObject* receiver, PropertyId propertyId, Var newValue, PropertyValueInfo * info, ScriptContext* requestContext, PropertyOperationFlags flags = PropertyOperation_None);
  168. static BOOL SetRootProperty(RecyclableObject* instance, PropertyId propertyId, Var newValue, PropertyValueInfo * info, ScriptContext* requestContext, PropertyOperationFlags flags = PropertyOperation_None);
  169. static BOOL GetAccessors(RecyclableObject* instance, PropertyId propertyId, ScriptContext* requestContext, Var* getter, Var* setter);
  170. static BOOL SetAccessors(RecyclableObject* instance, PropertyId propertyId, Var getter, Var setter, PropertyOperationFlags flags = PropertyOperation_None);
  171. static BOOL InitProperty(RecyclableObject* instance, PropertyId propertyId, Var newValue, PropertyOperationFlags flags = PropertyOperation_None);
  172. static BOOL DeleteProperty(RecyclableObject* instance, PropertyId propertyId, PropertyOperationFlags propertyOperationFlags = PropertyOperation_None);
  173. static BOOL DeletePropertyUnscopables(RecyclableObject* instance, PropertyId propertyId, PropertyOperationFlags propertyOperationFlags = PropertyOperation_None);
  174. template<bool unscopables>
  175. static BOOL DeleteProperty_Impl(RecyclableObject* instance, PropertyId propertyId, PropertyOperationFlags propertyOperationFlags = PropertyOperation_None);
  176. static TypeId GetTypeId(Var instance);
  177. static BOOL IsObject(Var instance);
  178. static BOOL IsExposedType(TypeId typeId);
  179. static BOOL IsObjectType(TypeId typeId);
  180. static BOOL IsObjectOrNull(Var instance);
  181. static BOOL IsUndefinedOrNullType(TypeId);
  182. static BOOL IsUndefinedOrNull(Var instance);
  183. static BOOL IsSpecialObjectType(TypeId typeId);
  184. static BOOL IsJsNativeObject(Var instance);
  185. static BOOL IsUndefinedObject(Var instance);
  186. static BOOL IsUndefinedObject(Var instance, ScriptContext *scriptContext);
  187. static BOOL IsUndefinedObject(Var instance, RecyclableObject *libraryUndefined);
  188. static BOOL IsUndefinedObject(Var instance, JavascriptLibrary* library);
  189. static BOOL IsAnyNumberValue(Var instance);
  190. static BOOL IsIterable(RecyclableObject* instance, ScriptContext* scriptContext);
  191. static BOOL IsClassConstructor(Var instance);
  192. static BOOL HasOwnItem(RecyclableObject* instance, uint32 index);
  193. static BOOL HasItem(RecyclableObject* instance, uint32 index);
  194. static BOOL HasItem(RecyclableObject* instance, uint64 index);
  195. static BOOL GetOwnItem(RecyclableObject* instance, uint32 index, Var* value, ScriptContext* requestContext);
  196. static BOOL GetItem(RecyclableObject* instance, uint64 index, Var* value, ScriptContext* requestContext);
  197. static BOOL GetItem(RecyclableObject* instance, uint32 index, Var* value, ScriptContext* requestContext);
  198. static BOOL GetItem(Var instance, RecyclableObject* propertyObject, uint32 index, Var* value, ScriptContext* requestContext);
  199. static BOOL GetItemReference(RecyclableObject* instance, uint32 index, Var* value, ScriptContext* requestContext);
  200. static BOOL GetItemReference(Var instance, RecyclableObject* propertyObject, uint32 index, Var* value, ScriptContext* requestContext);
  201. static BOOL SetItem(Var instance, RecyclableObject* object, uint64 index, Var value, ScriptContext* scriptContext, PropertyOperationFlags flags = PropertyOperation_None);
  202. static BOOL SetItem(Var instance, RecyclableObject* object, uint32 index, Var value, ScriptContext* scriptContext, PropertyOperationFlags flags = PropertyOperation_None, BOOL skipPrototypeCheck = FALSE);
  203. static BOOL DeleteItem(RecyclableObject* instance, uint32 index, PropertyOperationFlags propertyOperationFlags = PropertyOperation_None);
  204. static BOOL DeleteItem(RecyclableObject* instance, uint64 index, PropertyOperationFlags propertyOperationFlags = PropertyOperation_None);
  205. static Var Construct(RecyclableObject* constructor, const Arguments args, ScriptContext* scriptContext);
  206. static RecyclableObject* CreateFromConstructor(RecyclableObject* constructor, ScriptContext* scriptContext);
  207. static RecyclableObject* OrdinaryCreateFromConstructor(RecyclableObject* constructor, RecyclableObject* obj, DynamicObject* intrinsicProto, ScriptContext* scriptContext);
  208. template<typename PropertyKeyType>
  209. static BOOL CheckPrototypesForAccessorOrNonWritablePropertySlow(RecyclableObject* instance, PropertyKeyType propertyKey, Var* setterValueOrProxy, DescriptorFlags* flags, bool isRoot, ScriptContext* scriptContext);
  210. static BOOL CheckPrototypesForAccessorOrNonWritableProperty(RecyclableObject* instance, PropertyId propertyId, Var* setterValueOrProxy, DescriptorFlags* flags, PropertyValueInfo* info, ScriptContext* scriptContext);
  211. static BOOL CheckPrototypesForAccessorOrNonWritableProperty(RecyclableObject* instance, JavascriptString* propertyNameString, Var* setterValueOrProxy, DescriptorFlags* flags, PropertyValueInfo* info, ScriptContext* scriptContext);
  212. static BOOL CheckPrototypesForAccessorOrNonWritableRootProperty(RecyclableObject* instance, PropertyId propertyId, Var* setterValueOrProxy, DescriptorFlags* flags, PropertyValueInfo* info, ScriptContext* scriptContext);
  213. static BOOL CheckPrototypesForAccessorOrNonWritableItem(RecyclableObject* instance, uint32 index, Var* setterValueOrProxy, DescriptorFlags* flags, ScriptContext* scriptContext, BOOL skipPrototypeCheck = FALSE);
  214. template <typename PropertyKeyType, bool unscopable>
  215. static DescriptorFlags GetterSetter_Impl(RecyclableObject* instance, PropertyKeyType propertyKey, Var* setterValue, PropertyValueInfo* info, ScriptContext* scriptContext);
  216. static DescriptorFlags GetterSetterUnscopable(RecyclableObject* instance, PropertyId propertyId, Var* setterValue, PropertyValueInfo* info, ScriptContext* scriptContext);
  217. static DescriptorFlags GetterSetter(RecyclableObject* instance, PropertyId propertyId, Var* setterValue, PropertyValueInfo* info, ScriptContext* scriptContext);
  218. static DescriptorFlags GetterSetter(RecyclableObject* instance, JavascriptString * propertyName, Var* setterValue, PropertyValueInfo* info, ScriptContext* scriptContext);
  219. static void OP_InvalidateProtoCaches(PropertyId propertyId, ScriptContext *scriptContext);
  220. static BOOL SetGlobalPropertyNoHost(wchar_t const * propertyName, charcount_t propertyLength, Var value, ScriptContext * scriptContext);
  221. static RecyclableObject* GetPrototype(RecyclableObject* instance);
  222. static RecyclableObject* OP_GetPrototype(Var instance, ScriptContext* scriptContext);
  223. static BOOL OP_HasProperty(Var instance, PropertyId propertyId, ScriptContext* scriptContext);
  224. static BOOL OP_HasOwnProperty(Var instance, PropertyId propertyId, ScriptContext* scriptContext);
  225. static BOOL HasOwnPropertyNoHostObject(Var instance, PropertyId propertyId);
  226. static BOOL HasOwnPropertyNoHostObjectForHeapEnum(Var instance, PropertyId propertyId, ScriptContext* scriptContext, Var& getter, Var& setter);
  227. static Var GetOwnPropertyNoHostObjectForHeapEnum(Var instance, PropertyId propertyId, ScriptContext* scriptContext, Var& getter, Var &setter);
  228. static BOOL OP_HasOwnPropScoped(Var instance, PropertyId propertyId, Var defaultInstance, ScriptContext* scriptContext);
  229. static Var OP_GetProperty(Var instance, PropertyId propertyId, ScriptContext* scriptContext);
  230. static Var OP_GetRootProperty(Var instance, PropertyId propertyId, PropertyValueInfo * info, ScriptContext* scriptContext);
  231. static BOOL OP_SetProperty(Var instance, PropertyId propertyId, Var newValue, ScriptContext* scriptContext, PropertyValueInfo * info = nullptr, PropertyOperationFlags flags = PropertyOperation_None, Var thisInstance = nullptr);
  232. static BOOL SetPropertyOnTaggedNumber(Var instance, RecyclableObject* object, PropertyId propertyId, Var newValue, ScriptContext* requestContext, PropertyOperationFlags flags);
  233. static BOOL SetItemOnTaggedNumber(Var instance, RecyclableObject* object, uint32 index, Var newValue, ScriptContext* requestContext, PropertyOperationFlags propertyOperationFlags);
  234. static BOOL OP_StFunctionExpression(Var instance, PropertyId propertyId, Var newValue);
  235. static BOOL OP_InitProperty(Var instance, PropertyId propertyId, Var newValue);
  236. static Var OP_DeleteProperty(Var instance, PropertyId propertyId, ScriptContext* scriptContext, PropertyOperationFlags propertyOperationFlags = PropertyOperation_None);
  237. static Var OP_DeleteRootProperty(Var instance, PropertyId propertyId, ScriptContext* scriptContext, PropertyOperationFlags propertyOperationFlags = PropertyOperation_None);
  238. static BOOL OP_InitLetProperty(Var instance, PropertyId propertyId, Var newValue);
  239. static BOOL OP_InitConstProperty(Var instance, PropertyId propertyId, Var newValue);
  240. static BOOL OP_InitUndeclRootLetProperty(Var instance, PropertyId propertyId);
  241. static BOOL OP_InitUndeclRootConstProperty(Var instance, PropertyId propertyId);
  242. static BOOL OP_InitUndeclConsoleLetProperty(Var instance, PropertyId propertyId);
  243. static BOOL OP_InitUndeclConsoleConstProperty(Var instance, PropertyId propertyId);
  244. static BOOL OP_InitClassMember(Var instance, PropertyId propertyId, Var newValue);
  245. static void OP_InitClassMemberComputedName(Var object, Var elementName, Var value, ScriptContext* scriptContext, PropertyOperationFlags flags = PropertyOperation_None);
  246. static void OP_InitClassMemberGet(Var object, PropertyId propertyId, Var getter);
  247. static void OP_InitClassMemberGetComputedName(Var object, Var elementName, Var getter, ScriptContext* scriptContext, PropertyOperationFlags flags = PropertyOperation_None);
  248. static void OP_InitClassMemberSet(Var object, PropertyId propertyId, Var setter);
  249. static void OP_InitClassMemberSetComputedName(Var object, Var elementName, Var getter, ScriptContext* scriptContext, PropertyOperationFlags flags = PropertyOperation_None);
  250. static Js::PropertyId GetPropertyId(Var propertyName, ScriptContext* scriptContext);
  251. static BOOL OP_HasItem(Var instance, Var aElementIndex, ScriptContext* scriptContext);
  252. static Var OP_GetElementI(Var instance, Var aElementIndex, ScriptContext* scriptContext);
  253. static Var OP_GetElementI_JIT(Var instance, Var index, ScriptContext *scriptContext);
  254. #if ENABLE_NATIVE_CODEGEN
  255. static Var OP_GetElementI_JIT_ExpectingNativeFloatArray(Var instance, Var index, ScriptContext *scriptContext);
  256. static Var OP_GetElementI_JIT_ExpectingVarArray(Var instance, Var index, ScriptContext *scriptContext);
  257. #endif
  258. static Var OP_GetElementI_UInt32(Var instance, uint32 aElementIndex, ScriptContext* scriptContext);
  259. static Var OP_GetElementI_UInt32_ExpectingNativeFloatArray(Var instance, uint32 aElementIndex, ScriptContext* scriptContext);
  260. static Var OP_GetElementI_UInt32_ExpectingVarArray(Var instance, uint32 aElementIndex, ScriptContext* scriptContext);
  261. static Var OP_GetElementI_Int32(Var instance, int32 aElementIndex, ScriptContext* scriptContext);
  262. static Var OP_GetElementI_Int32_ExpectingNativeFloatArray(Var instance, int32 aElementIndex, ScriptContext* scriptContext);
  263. static Var OP_GetElementI_Int32_ExpectingVarArray(Var instance, int32 aElementIndex, ScriptContext* scriptContext);
  264. static Var GetElementIHelper(Var instance, Var index, Var receiver, ScriptContext* scriptContext);
  265. static int32 OP_GetNativeIntElementI(Var instance, Var index);
  266. static int32 OP_GetNativeIntElementI_Int32(Var instance, int32 index, ScriptContext *scriptContext);
  267. static int32 OP_GetNativeIntElementI_UInt32(Var instance, uint32 index, ScriptContext *scriptContext);
  268. static double OP_GetNativeFloatElementI(Var instance, Var index);
  269. static double OP_GetNativeFloatElementI_Int32(Var instance, int32 index, ScriptContext *scriptContext);
  270. static double OP_GetNativeFloatElementI_UInt32(Var instance, uint32 index, ScriptContext *scriptContext);
  271. static Var OP_GetMethodElement(Var instance, Var aElementIndex, ScriptContext* scriptContext);
  272. static Var OP_GetMethodElement_UInt32(Var instance, uint32 aElementIndex, ScriptContext* scriptContext);
  273. static Var OP_GetMethodElement_Int32(Var instance, int32 aElementIndex, ScriptContext* scriptContext);
  274. static BOOL OP_SetElementI(Var instance, Var aElementIndex, Var aValue, ScriptContext* scriptContext, PropertyOperationFlags flags = PropertyOperation_None);
  275. static BOOL OP_SetElementI_JIT(Var instance, Var aElementIndex, Var aValue, ScriptContext* scriptContext, PropertyOperationFlags flags = PropertyOperation_None);
  276. static BOOL OP_SetElementI_UInt32(Var instance, uint32 aElementIndex, Var aValue, ScriptContext* scriptContext, PropertyOperationFlags flags = PropertyOperation_None);
  277. static BOOL OP_SetElementI_Int32(Var instance, int aElementIndex, Var aValue, ScriptContext* scriptContext, PropertyOperationFlags flags = PropertyOperation_None);
  278. static BOOL SetElementIHelper(Var receiver, RecyclableObject* object, Var index, Var value, ScriptContext* scriptContext, PropertyOperationFlags flags);
  279. static BOOL OP_SetNativeIntElementI(Var instance, Var aElementIndex, int32 aValue, ScriptContext* scriptContext, PropertyOperationFlags flags = PropertyOperation_None);
  280. static BOOL OP_SetNativeIntElementI_UInt32(Var instance, uint32 aElementIndex, int32 aValue, ScriptContext* scriptContext, PropertyOperationFlags flags = PropertyOperation_None);
  281. static BOOL OP_SetNativeIntElementI_Int32(Var instance, int aElementIndex, int32 aValue, ScriptContext* scriptContext, PropertyOperationFlags flags = PropertyOperation_None);
  282. static BOOL OP_SetNativeFloatElementI(Var instance, Var aElementIndex, ScriptContext* scriptContext, PropertyOperationFlags flags, double value);
  283. static BOOL OP_SetNativeFloatElementI_UInt32(Var instance, uint32 aElementIndex, ScriptContext* scriptContext, PropertyOperationFlags flags, double value);
  284. static BOOL OP_SetNativeFloatElementI_Int32(Var instance, int aElementIndex, ScriptContext* scriptContext, PropertyOperationFlags flags, double value);
  285. static Var OP_DeleteElementI(Var instance, Var aElementIndex, ScriptContext* scriptContext, PropertyOperationFlags propertyOperationFlags = PropertyOperation_None);
  286. static Var OP_DeleteElementI_UInt32(Var instance, uint32 aElementIndex, ScriptContext* scriptContext, PropertyOperationFlags propertyOperationFlags = PropertyOperation_None);
  287. static Var OP_DeleteElementI_Int32(Var instance, int aElementIndex, ScriptContext* scriptContext, PropertyOperationFlags propertyOperationFlags = PropertyOperation_None);
  288. static BOOL OP_Memset(Var instance, int32 start, Var value, int32 length, ScriptContext* scriptContext);
  289. static BOOL OP_Memcopy(Var dstInstance, int32 dstStart, Var srcInstance, int32 srcStart, int32 length, ScriptContext* scriptContext);
  290. static Var OP_GetLength(Var instance, ScriptContext* scriptContext);
  291. static Var OP_GetThis(Var thisVar, int moduleID, ScriptContext* scriptContext);
  292. static Var OP_GetThisNoFastPath(Var thisVar, int moduleID, ScriptContext* scriptContext);
  293. static Var OP_StrictGetThis(Var thisVar, ScriptContext* scriptContext);
  294. static bool IsThisSelf(TypeId typeId);
  295. static Var GetThisHelper(Var thisVar, TypeId typeId, int moduleID, ScriptContext *scriptContext);
  296. static Var GetThisFromModuleRoot(Var thisVar);
  297. static Var OP_GetThisScoped(FrameDisplay *pScope, Var defaultInstance, ScriptContext* scriptContext);
  298. static Var OP_UnwrapWithObj(Var aValue);
  299. static Var OP_GetInstanceScoped(FrameDisplay *pScope, PropertyId propertyId, Var rootObject, Var* result2, ScriptContext* scriptContext);
  300. static BOOL OP_InitPropertyScoped(FrameDisplay *pScope, PropertyId propertyId, Var newValue, Var defaultInstance, ScriptContext* scriptContext);
  301. static BOOL OP_InitFuncScoped(FrameDisplay *pScope, PropertyId propertyId, Var newValue, Var defaultInstance, ScriptContext* scriptContext);
  302. static Var OP_DeletePropertyScoped(
  303. FrameDisplay *pScope,
  304. PropertyId propertyId,
  305. Var defaultInstance,
  306. ScriptContext* scriptContext,
  307. PropertyOperationFlags propertyOperationFlags = PropertyOperation_None);
  308. static Var OP_TypeofPropertyScoped(FrameDisplay *pScope, PropertyId propertyId, Var defaultInstance, ScriptContext* scriptContext);
  309. static void OP_InitGetter(Var object, PropertyId propertyId, Var getter);
  310. static Js::PropertyId OP_InitElemGetter(Var object, Var elementName, Var getter, ScriptContext* scriptContext, PropertyOperationFlags flags = PropertyOperation_None);
  311. static void OP_InitSetter(Var object, PropertyId propertyId, Var setter);
  312. static Js::PropertyId OP_InitElemSetter(Var object, Var elementName, Var getter, ScriptContext* scriptContext, PropertyOperationFlags flags = PropertyOperation_None);
  313. static void OP_InitComputedProperty(Var object, Var elementName, Var value, ScriptContext* scriptContext, PropertyOperationFlags flags = PropertyOperation_None);
  314. static void OP_InitProto(Var object, PropertyId propertyId, Var value);
  315. static ForInObjectEnumerator * OP_GetForInEnumerator(Var enumerable, ScriptContext* scriptContext);
  316. static void OP_ReleaseForInEnumerator(ForInObjectEnumerator * enumerator, ScriptContext* scriptContext);
  317. static Var OP_BrOnEmpty(ForInObjectEnumerator * enumerator);
  318. static BOOL OP_BrHasSideEffects(int se,ScriptContext* scriptContext);
  319. static BOOL OP_BrNotHasSideEffects(int se,ScriptContext* scriptContext);
  320. static BOOL OP_BrFncEqApply(Var instance,ScriptContext* scriptContext);
  321. static BOOL OP_BrFncNeqApply(Var instance,ScriptContext* scriptContext);
  322. static Var OP_CmEq_A(Js::Var a,Js::Var b,ScriptContext* scriptContext);
  323. static Var OP_CmNeq_A(Js::Var a,Js::Var b,ScriptContext* scriptContext);
  324. static Var OP_CmSrEq_A(Js::Var a,Js::Var b,ScriptContext* scriptContext);
  325. static Var OP_CmSrEq_String(Var a, Var b, ScriptContext *scriptContext);
  326. static Var OP_CmSrEq_EmptyString(Var a, ScriptContext *scriptContext);
  327. static Var OP_CmSrNeq_A(Js::Var a,Js::Var b,ScriptContext* scriptContext);
  328. static Var OP_CmLt_A(Js::Var a,Js::Var b,ScriptContext* scriptContext);
  329. static Var OP_CmLe_A(Js::Var a,Js::Var b,ScriptContext* scriptContext);
  330. static Var OP_CmGt_A(Js::Var a,Js::Var b,ScriptContext* scriptContext);
  331. static Var OP_CmGe_A(Js::Var a,Js::Var b,ScriptContext* scriptContext);
  332. static FunctionInfo * JavascriptOperators::GetConstructorFunctionInfo(Var instance, ScriptContext * scriptContext);
  333. // Detach the type array buffer, if possible, and returns the state of the object which can be used to initialize another object
  334. static DetachedStateBase* DetachVarAndGetState(Var var);
  335. static bool IsObjectDetached(Var var);
  336. // This will return a new object from the state returned by the above operation
  337. static Var NewVarFromDetachedState(DetachedStateBase* state, JavascriptLibrary *library);
  338. static Var NewScObjectLiteral(ScriptContext* scriptContext, const Js::PropertyIdArray *propIds, DynamicType ** literalType);
  339. static DynamicType * EnsureObjectLiteralType(ScriptContext* scriptContext, const Js::PropertyIdArray *propIds, DynamicType ** literalType);
  340. static uint GetLiteralSlotCapacity(Js::PropertyIdArray const * propIds, ScriptContext *const scriptContext);
  341. static uint GetLiteralInlineSlotCapacity(Js::PropertyIdArray const * propIds, ScriptContext *const scriptContext);
  342. static Var NewJavascriptObjectNoArg(ScriptContext* requestContext);
  343. static Var NewJavascriptArrayNoArg(ScriptContext* requestContext);
  344. static Var NewScObjectNoCtorCommon(Var instance, ScriptContext* requestContext, bool isBaseClassConstructorNewScObject = false);
  345. static Var NewScObjectNoCtor(Var instance, ScriptContext* requestContext);
  346. static Var NewScObjectNoCtorFull(Var instance, ScriptContext* requestContext);
  347. static Var NewScObjectNoArgNoCtorCommon(Var instance, ScriptContext* requestContext, bool isBaseClassConstructorNewScObject = false);
  348. static Var NewScObjectNoArgNoCtor(Var instance, ScriptContext* requestContext);
  349. static Var NewScObjectNoArgNoCtorFull(Var instance, ScriptContext* requestContext);
  350. static Var NewScObjectNoArg(Var instance, ScriptContext* requestContext);
  351. static Var NewScObject(const Var callee, const Arguments args, ScriptContext *const scriptContext, const Js::AuxArray<uint32> *spreadIndices = nullptr);
  352. static Var AddVarsToArraySegment(SparseArraySegment<Var> * segment, const Js::VarArray *vars);
  353. static void AddIntsToArraySegment(SparseArraySegment<int32> * segment, const Js::AuxArray<int32> *ints);
  354. static void AddFloatsToArraySegment(SparseArraySegment<double> * segment, const Js::AuxArray<double> *doubles);
  355. static void UpdateNewScObjectCache(Var function, Var instance, ScriptContext* requestContext);
  356. static RecyclableObject* GetIteratorFunction(Var iterable, ScriptContext* scriptContext);
  357. static RecyclableObject* GetIteratorFunction(RecyclableObject* instance, ScriptContext * scriptContext);
  358. static RecyclableObject* GetIterator(Var instance, ScriptContext* scriptContext);
  359. static RecyclableObject* GetIterator(RecyclableObject* instance, ScriptContext* scriptContext);
  360. static RecyclableObject* IteratorNext(RecyclableObject* iterator, ScriptContext* scriptContext, Var value = nullptr);
  361. static bool IteratorComplete(RecyclableObject* iterResult, ScriptContext* scriptContext);
  362. static Var IteratorValue(RecyclableObject* iterResult, ScriptContext* scriptContext);
  363. static bool IteratorStep(RecyclableObject* iterator, ScriptContext* scriptContext, RecyclableObject** result);
  364. static bool IteratorStepAndValue(RecyclableObject* iterator, ScriptContext* scriptContext, Var* resultValue);
  365. static void TraceUseConstructorCache(const ConstructorCache* ctorCache, const JavascriptFunction* ctor, bool isHit);
  366. static void TraceUpdateConstructorCache(const ConstructorCache* ctorCache, const FunctionBody* ctorBody, bool updated, const wchar_t* reason);
  367. static Var ConvertToUnmappedArguments(HeapArgumentsObject *argumentsObject, uint32 paramCount, Var *paramAddr, DynamicObject* frameObject, Js::PropertyIdArray *propIds, uint32 formalsCount, ScriptContext* scriptContext);
  368. static Js::GlobalObject * OP_LdRoot(ScriptContext* scriptContext);
  369. static Js::ModuleRoot * GetModuleRoot(int moduleID, ScriptContext* scriptContext);
  370. static Js::Var OP_LoadModuleRoot(int moduleID, ScriptContext* scriptContext);
  371. static Var OP_LdNull(ScriptContext* scriptContext);
  372. static Var OP_LdUndef(ScriptContext* scriptContext);
  373. static Var OP_LdNaN(ScriptContext* scriptContext);
  374. static Var OP_LdInfinity(ScriptContext* scriptContext);
  375. static FrameDisplay* OP_LdHandlerScope(Var argThis, ScriptContext* scriptContext);
  376. static FrameDisplay* OP_LdFrameDisplay(void *argHead, void *argEnv, ScriptContext* scriptContext);
  377. static FrameDisplay* OP_LdFrameDisplayNoParent(void *argHead, ScriptContext* scriptContext);
  378. static FrameDisplay* OP_LdStrictFrameDisplay(void *argHead, void *argEnv, ScriptContext* scriptContext);
  379. static FrameDisplay* OP_LdStrictFrameDisplayNoParent(void *argHead, ScriptContext* scriptContext);
  380. static FrameDisplay* OP_LdInnerFrameDisplay(void *argHead, void *argEnv, ScriptContext* scriptContext);
  381. static FrameDisplay* OP_LdInnerFrameDisplayNoParent(void *argHead, ScriptContext* scriptContext);
  382. static FrameDisplay* OP_LdStrictInnerFrameDisplay(void *argHead, void *argEnv, ScriptContext* scriptContext);
  383. static FrameDisplay* OP_LdStrictInnerFrameDisplayNoParent(void *argHead, ScriptContext* scriptContext);
  384. static void CheckInnerFrameDisplayArgument(void *argHead);
  385. static Var LoadHeapArguments(JavascriptFunction *funcCallee, unsigned int count, Var *pParams, Var frameObj, Var vArray, ScriptContext* scriptContext, bool nonSimpleParamList);
  386. static Var LoadHeapArgsCached(JavascriptFunction *funcCallee, uint32 actualsCount, uint32 formalsCount, Var *pParams, Var frameObj, ScriptContext* scriptContext, bool nonSimpleParamList);
  387. static HeapArgumentsObject *CreateHeapArguments(JavascriptFunction *funcCallee, uint32 actualsCount, uint32 formalsCount, Var frameObj, ScriptContext* scriptContext);
  388. static Var OP_InitCachedScope(Var varFunc, const PropertyIdArray *propIds, DynamicType ** literalType, bool formalsAreLetDecls, ScriptContext *scriptContext);
  389. static void OP_InvalidateCachedScope(Var varEnv, int32 envIndex);
  390. static void OP_InitCachedFuncs(Var varScope, FrameDisplay *pDisplay, const FuncInfoArray *info, ScriptContext *scriptContext);
  391. static Var OP_NewScopeObject(ScriptContext*scriptContext);
  392. static Var* OP_NewScopeSlots(unsigned int count, ScriptContext *scriptContext, Var scope);
  393. static Var* OP_NewScopeSlotsWithoutPropIds(unsigned int count, int index, ScriptContext *scriptContext, FunctionBody *functionBody);
  394. static Var* OP_CloneScopeSlots(Var *scopeSlots, ScriptContext *scriptContext);
  395. static Var OP_NewPseudoScope(ScriptContext *scriptContext);
  396. static Var OP_NewBlockScope(ScriptContext *scriptContext);
  397. static Var OP_CloneBlockScope(BlockActivationObject *blockScope, ScriptContext *scriptContext);
  398. static void OP_InitClass(Var constructor, Var extends, ScriptContext * scriptContext);
  399. static void OP_LoadUndefinedToElement(Var instance, PropertyId propertyId);
  400. static void OP_LoadUndefinedToElementDynamic(Var instance, PropertyId propertyId, ScriptContext* scriptContext);
  401. static void OP_LoadUndefinedToElementScoped(FrameDisplay *pScope, PropertyId propertyId, Var defaultInstance, ScriptContext* scriptContext);
  402. static Var OP_IsInst(Var instance, Var aClass, ScriptContext* scriptContext, IsInstInlineCache *inlineCache);
  403. static Var IsIn(Var argProperty, Var instance, ScriptContext* scriptContext);
  404. static BOOL GetRemoteTypeId(Var instance, TypeId* typeId);
  405. static FunctionProxy* GetDeferredDeserializedFunctionProxy(JavascriptFunction* func);
  406. template <bool IsFromFullJit, class TInlineCache> static Var PatchGetValue(FunctionBody *const functionBody, TInlineCache *const inlineCache, const InlineCacheIndex inlineCacheIndex, Var instance, PropertyId propertyId);
  407. template <bool IsFromFullJit, class TInlineCache> static Var PatchGetValueWithThisPtr(FunctionBody *const functionBody, TInlineCache *const inlineCache, const InlineCacheIndex inlineCacheIndex, Var instance, PropertyId propertyId, Var thisInstance);
  408. template <bool IsFromFullJit, class TInlineCache> static Var PatchGetValueForTypeOf(FunctionBody *const functionBody, TInlineCache *const inlineCache, const InlineCacheIndex inlineCacheIndex, Var instance, PropertyId propertyId);
  409. static Var PatchGetValueUsingSpecifiedInlineCache(InlineCache * inlineCache, Var instance, RecyclableObject * object, PropertyId propertyId, ScriptContext* scriptContext);
  410. static Var PatchGetValueNoFastPath(FunctionBody *const functionBody, InlineCache *const inlineCache, const InlineCacheIndex inlineCacheIndex, Var instance, PropertyId propertyId);
  411. static Var PatchGetValueWithThisPtrNoFastPath(FunctionBody *const functionBody, InlineCache *const inlineCache, const InlineCacheIndex inlineCacheIndex, Var instance, PropertyId propertyId, Var thisInstance);
  412. template <bool IsFromFullJit, class TInlineCache> static Var PatchGetRootValue(FunctionBody *const functionBody, TInlineCache *const inlineCache, const InlineCacheIndex inlineCacheIndex, DynamicObject* object, PropertyId propertyId);
  413. template <bool IsFromFullJit, class TInlineCache> static Var PatchGetRootValueForTypeOf(FunctionBody *const functionBody, TInlineCache *const inlineCache, const InlineCacheIndex inlineCacheIndex, DynamicObject* object, PropertyId propertyId);
  414. static Var PatchGetRootValueNoFastPath_Var(FunctionBody *const functionBody, InlineCache *const inlineCache, const InlineCacheIndex inlineCacheIndex, Var instance, PropertyId propertyId);
  415. static Var PatchGetRootValueNoFastPath(FunctionBody *const functionBody, InlineCache *const inlineCache, const InlineCacheIndex inlineCacheIndex, DynamicObject* object, PropertyId propertyId);
  416. template <bool IsFromFullJit, class TInlineCache> static Var PatchGetPropertyScoped(FunctionBody *const functionBody, TInlineCache *const inlineCache, const InlineCacheIndex inlineCacheIndex, FrameDisplay *pScope, PropertyId propertyId, Var defaultInstance);
  417. template <bool IsFromFullJit, class TInlineCache> static void PatchSetPropertyScoped(FunctionBody *const functionBody, TInlineCache *const inlineCache, const InlineCacheIndex inlineCacheIndex, FrameDisplay *pScope, PropertyId propertyId, Var newValue, Var defaultInstance, PropertyOperationFlags flags = PropertyOperation_None);
  418. template <bool IsFromFullJit, class TInlineCache> static Var PatchGetPropertyForTypeOfScoped(FunctionBody *const functionBody, TInlineCache *const inlineCache, const InlineCacheIndex inlineCacheIndex, FrameDisplay *pScope, PropertyId propertyId, Var defaultInstance);
  419. template <bool IsFromFullJit, class TInlineCache> static void PatchPutValue(FunctionBody *const functionBody, TInlineCache *const inlineCache, const InlineCacheIndex inlineCacheIndex, Var obj, PropertyId propertyId, Var newValue, PropertyOperationFlags flags = PropertyOperation_None);
  420. template <bool IsFromFullJit, class TInlineCache> static void PatchPutValueWithThisPtr(FunctionBody *const functionBody, TInlineCache *const inlineCache, const InlineCacheIndex inlineCacheIndex, Var obj, PropertyId propertyId, Var newValue, Var thisInstance, PropertyOperationFlags flags = PropertyOperation_None);
  421. template <bool IsFromFullJit, class TInlineCache> static void PatchPutRootValue(FunctionBody *const functionBody, TInlineCache *const inlineCache, const InlineCacheIndex inlineCacheIndex, Var obj, PropertyId propertyId, Var newValue, PropertyOperationFlags flags = PropertyOperation_None);
  422. template <bool IsFromFullJit, class TInlineCache> static void PatchPutValueNoLocalFastPath(FunctionBody *const functionBody, TInlineCache *const inlineCache, const InlineCacheIndex inlineCacheIndex, Var instance, PropertyId propertyId, Var newValue, PropertyOperationFlags flags = PropertyOperation_None);
  423. template <bool IsFromFullJit, class TInlineCache> static void PatchPutValueWithThisPtrNoLocalFastPath(FunctionBody *const functionBody, TInlineCache *const inlineCache, const InlineCacheIndex inlineCacheIndex, Var instance, PropertyId propertyId, Var newValue, Var thisInstance, PropertyOperationFlags flags = PropertyOperation_None);
  424. template <bool IsFromFullJit, class TInlineCache> static void PatchPutRootValueNoLocalFastPath(FunctionBody *const functionBody, TInlineCache *const inlineCache, const InlineCacheIndex inlineCacheIndex, Var instance, PropertyId propertyId, Var newValue, PropertyOperationFlags flags = PropertyOperation_None);
  425. static void PatchPutValueNoFastPath(FunctionBody *const functionBody, InlineCache *const inlineCache, const InlineCacheIndex inlineCacheIndex, Var obj, PropertyId propertyId, Var newValue, PropertyOperationFlags flags = PropertyOperation_None);
  426. static void PatchPutValueWithThisPtrNoFastPath(FunctionBody *const functionBody, InlineCache *const inlineCache, const InlineCacheIndex inlineCacheIndex, Var obj, PropertyId propertyId, Var newValue, Var thisInstance, PropertyOperationFlags flags = PropertyOperation_None);
  427. static void PatchPutRootValueNoFastPath(FunctionBody *const functionBody, InlineCache *const inlineCache, const InlineCacheIndex inlineCacheIndex, Var obj, PropertyId propertyId, Var newValue, PropertyOperationFlags flags = PropertyOperation_None);
  428. template <bool IsFromFullJit, class TInlineCache> static void PatchInitValue(FunctionBody *const functionBody, TInlineCache *const inlineCache, const InlineCacheIndex inlineCacheIndex, RecyclableObject* object, PropertyId propertyId, Var newValue);
  429. static void PatchInitValueNoFastPath(FunctionBody *const functionBody, InlineCache *const inlineCache, const InlineCacheIndex inlineCacheIndex, RecyclableObject* object, PropertyId propertyId, Var newValue);
  430. template <bool IsFromFullJit, class TInlineCache> static Var PatchGetMethod(FunctionBody *const functionBody, TInlineCache *const inlineCache, const InlineCacheIndex inlineCacheIndex, Var instance, PropertyId propertyId);
  431. template <bool IsFromFullJit, class TInlineCache> static Var PatchGetRootMethod(FunctionBody *const functionBody, TInlineCache *const inlineCache, const InlineCacheIndex inlineCacheIndex, DynamicObject* object, PropertyId propertyId);
  432. template <bool IsFromFullJit, class TInlineCache> static Var PatchScopedGetMethod(FunctionBody *const functionBody, TInlineCache *const inlineCache, const InlineCacheIndex inlineCacheIndex, Var instance, PropertyId propertyId);
  433. static Var PatchGetMethodNoFastPath(FunctionBody *const functionBody, InlineCache *const inlineCache, const InlineCacheIndex inlineCacheIndex, Var instance, PropertyId propertyId);
  434. static Var PatchGetRootMethodNoFastPath_Var(FunctionBody *const functionBody, InlineCache *const inlineCache, const InlineCacheIndex inlineCacheIndex, Var instance, PropertyId propertyId);
  435. static Var PatchGetRootMethodNoFastPath(FunctionBody *const functionBody, InlineCache *const inlineCache, const InlineCacheIndex inlineCacheIndex, DynamicObject* object, PropertyId propertyId);
  436. static Var PatchGetMethodFromObject(Var instance, RecyclableObject * propertyObject, PropertyId propertyId, PropertyValueInfo * info, ScriptContext * scriptContext, bool isRootLd);
  437. #if ENABLE_DEBUG_CONFIG_OPTIONS
  438. static void TracePropertyEquivalenceCheck(const JitEquivalentTypeGuard* guard, const Type* type, const Type* refType, bool isEquivalent, uint failedPropertyIndex);
  439. #endif
  440. static bool IsStaticTypeObjTypeSpecEquivalent(const TypeEquivalenceRecord& equivalenceRecord, uint& failedIndex);
  441. static bool IsStaticTypeObjTypeSpecEquivalent(const EquivalentPropertyEntry *entry);
  442. static bool CheckIfTypeIsEquivalent(Type* type, JitEquivalentTypeGuard* guard);
  443. static void GetPropertyIdForInt(uint64 value, ScriptContext* scriptContext, PropertyRecord const ** propertyRecord);
  444. static void GetPropertyIdForInt(uint32 value, ScriptContext* scriptContext, PropertyRecord const ** propertyRecord);
  445. static BOOL TryConvertToUInt32(const wchar_t* str, int length, uint32* value);
  446. static BOOL ToPropertyDescriptor(Var propertySpec, PropertyDescriptor* descriptor, ScriptContext* scriptContext);
  447. static Var FromPropertyDescriptor(PropertyDescriptor descriptor, ScriptContext* scriptContext);
  448. static void CompletePropertyDescriptor(PropertyDescriptor* resultDescriptor, PropertyDescriptor* likePropertyDescriptor, ScriptContext* requestContext);
  449. static BOOL SetPropertyDescriptor(RecyclableObject* object, PropertyId propId, PropertyDescriptor descriptor);
  450. static BOOL DefineOwnPropertyDescriptor(RecyclableObject* object, PropertyId propId, const PropertyDescriptor& descriptor, bool throwOnError, ScriptContext* scriptContext);
  451. static BOOL DefineOwnPropertyForArray(JavascriptArray* arr, PropertyId propId, const PropertyDescriptor& descriptor, bool throwOnError, ScriptContext* scriptContext);
  452. static BOOL IsCompatiblePropertyDescriptor(const PropertyDescriptor& descriptor, PropertyDescriptor* currentDescriptor, bool isExtensible, bool throwOnError, ScriptContext* scriptContext);
  453. template <bool needToSetProperty>
  454. static BOOL ValidateAndApplyPropertyDescriptor(RecyclableObject* obj, PropertyId propId, const PropertyDescriptor& descriptor,
  455. PropertyDescriptor* currentPropertyDescriptor, bool isExtensible, bool throwOnError, ScriptContext* scriptContext);
  456. template <bool isAccessor>
  457. static PropertyDescriptor FillMissingPropertyDescriptorFields(PropertyDescriptor descriptor, ScriptContext* scriptContext);
  458. static Var OP_InvokePut(Js::ScriptContext *scriptContext, Var function, CallInfo callInfo, ...);
  459. static Var DefaultAccessor(RecyclableObject* function, CallInfo callInfo, ...);
  460. static bool IsUndefinedAccessor(Var accessor, ScriptContext* scriptContext);
  461. static void SetAttributes(RecyclableObject* object, PropertyId propId, const PropertyDescriptor& descriptor, bool force);
  462. static void OP_ClearAttributes(Var instance, PropertyId propertyId);
  463. static void OP_Freeze(Var instance);
  464. static Var RootToThisObject(const Var object, ScriptContext * const scriptContext);
  465. static Var CallGetter(RecyclableObject * const function, Var const object, ScriptContext * const scriptContext);
  466. static void CallSetter(RecyclableObject * const function, Var const object, Var const value, ScriptContext * const scriptContext);
  467. static bool CheckIfObjectAndPrototypeChainHasOnlyWritableDataProperties(RecyclableObject* object);
  468. static bool CheckIfPrototypeChainHasOnlyWritableDataProperties(RecyclableObject* prototype);
  469. static bool DoCheckIfPrototypeChainHasOnlyWritableDataProperties(RecyclableObject* prototype);
  470. static void OP_SetComputedNameVar(Var method, Var computedNameVar);
  471. static void OP_SetHomeObj(Var method, Var homeObj);
  472. static Var OP_LdSuper(Var scriptFunction, ScriptContext * scriptContext);
  473. static Var OP_LdSuperCtor(Var scriptFunction, ScriptContext * scriptContext);
  474. static Var OP_ScopedLdSuper(Var scriptFunction, ScriptContext * scriptContext);
  475. static Var OP_ScopedLdSuperCtor(Var scriptFunction, ScriptContext * scriptContext);
  476. static Var ScopedLdSuperHelper(Var scriptFunction, Js::PropertyId propertyId, ScriptContext * scriptContext);
  477. static Var OP_ResumeYield(ResumeYieldData* yieldData, RecyclableObject* iterator);
  478. static Var OP_AsyncSpawn(Js::Var aGenerator, Js::Var aThis, ScriptContext* scriptContext);
  479. template <typename T>
  480. static void * JitRecyclerAlloc(size_t size, Recycler* recycler)
  481. {
  482. TRACK_ALLOC_INFO(recycler, T, Recycler, size - sizeof(T), (size_t)-1);
  483. return recycler->AllocZero(size);
  484. }
  485. static void * AllocMemForVarArray(size_t size, Recycler* recycler);
  486. static void * AllocUninitializedNumber(RecyclerJavascriptNumberAllocator * allocator);
  487. static void ScriptAbort();
  488. class EntryInfo
  489. {
  490. public:
  491. static FunctionInfo DefaultAccessor;
  492. };
  493. template <BOOL stopAtProxy, class Func>
  494. static void MapObjectAndPrototypes(RecyclableObject* object, Func func);
  495. template <BOOL stopAtProxy, class Func>
  496. static bool MapObjectAndPrototypesUntil(RecyclableObject* object, Func func);
  497. #if ENABLE_PROFILE_INFO
  498. static void UpdateNativeArrayProfileInfoToCreateVarArray(Var instance, const bool expectingNativeFloatArray, const bool expectingVarArray);
  499. static bool SetElementMayHaveImplicitCalls(ScriptContext *const scriptContext);
  500. #endif
  501. static RecyclableObject *GetCallableObjectOrThrow(const Var callee, ScriptContext *const scriptContext);
  502. static Js::Var BoxStackInstance(Js::Var value, ScriptContext * scriptContext, bool allowStackFunction = false);
  503. static BOOL PropertyReferenceWalkUnscopable(Var instance, RecyclableObject** propertyObject, PropertyId propertyId, Var* value, PropertyValueInfo* info, ScriptContext* requestContext);
  504. static BOOL PropertyReferenceWalk(Var instance, RecyclableObject** propertyObject, PropertyId propertyId, Var* value, PropertyValueInfo* info, ScriptContext* requestContext);
  505. static void VarToNativeArray(Var arrayObject,
  506. JsNativeValueType valueType,
  507. __in UINT length,
  508. __in UINT elementSize,
  509. __out_bcount(length*elementSize) byte* contentBuffer,
  510. Js::ScriptContext* scriptContext);
  511. static Var SpeciesConstructor(RecyclableObject* object, Var defaultConstructor, ScriptContext* scriptContext);
  512. static Var GetSpecies(RecyclableObject* constructor, ScriptContext* scriptContext);
  513. private:
  514. static BOOL RelationalComparisonHelper(Var aLeft, Var aRight, ScriptContext* scriptContext, bool leftFirst, bool undefinedAs);
  515. template <typename ArrayType>
  516. static void ObjectToNativeArray(ArrayType* arrayObject,
  517. JsNativeValueType valueType,
  518. __in UINT length,
  519. __in UINT elementSize,
  520. __out_bcount(length*elementSize) byte* contentBuffer,
  521. Js::ScriptContext* scriptContext);
  522. template <typename ArrayType>
  523. static Js::Var GetElementAtIndex(ArrayType* arrayObject, UINT index, Js::ScriptContext* scriptContext);
  524. #if DBG
  525. static BOOL IsPropertyObject(RecyclableObject * instance);
  526. #endif
  527. template<typename PropertyKeyType, bool doFastProtoChainCheck, bool isRoot>
  528. static BOOL CheckPrototypesForAccessorOrNonWritablePropertyCore(RecyclableObject* instance,
  529. PropertyKeyType propertyKey, Var* setterValue, DescriptorFlags* flags, PropertyValueInfo* info, ScriptContext* scriptContext);
  530. static RecyclableObject * GetPrototypeObject(RecyclableObject * constructorFunction, ScriptContext * scriptContext);
  531. static RecyclableObject * GetPrototypeObjectForConstructorCache(RecyclableObject * constructor, ScriptContext * scriptContext, bool& canBeCached);
  532. static bool PrototypeObject(Var prototypeProperty, RecyclableObject * constructorFunction, ScriptContext * scriptContext, RecyclableObject** prototypeObject);
  533. static Var NewScObjectHostDispatchOrProxy(RecyclableObject * function, ScriptContext * requestContext);
  534. static Var NewScObjectCommon(RecyclableObject * functionObject, FunctionInfo * functionInfo, ScriptContext * scriptContext, bool isBaseClassConstructorNewScObject = false);
  535. static BOOL Reject(bool throwOnError, ScriptContext* scriptContext, long errorCode, PropertyId propertyId);
  536. static bool AreSamePropertyDescriptors(const PropertyDescriptor* x, const PropertyDescriptor* y, ScriptContext* scriptContext);
  537. static Var CanonicalizeAccessor(Var accessor, ScriptContext* scriptContext);
  538. static void BuildHandlerScope(Var argThis, RecyclableObject * hostObject, FrameDisplay * pScopes, ScriptContext * scriptContext);
  539. static void TryLoadRoot(Var& thisVar, TypeId typeId, int moduleID, ScriptContext* scriptContext);
  540. template <bool unscopables>
  541. static BOOL GetProperty_Internal(Var instance, RecyclableObject* propertyObject, const bool isRoot, PropertyId propertyId, Var* value, ScriptContext* requestContext, PropertyValueInfo* info);
  542. static RecyclableObject* GetPrototypeNoTrap(RecyclableObject* instance);
  543. static BOOL GetPropertyReference_Internal(Var instance, RecyclableObject* propertyObject, const bool isRoot, PropertyId propertyId, Var* value,ScriptContext* requestContext, PropertyValueInfo* info);
  544. template <bool unscopables>
  545. static BOOL PropertyReferenceWalk_Impl(Var instance, RecyclableObject** propertyObject, PropertyId propertyId, Var* value, PropertyValueInfo* info, ScriptContext* requestContext);
  546. static Var TypeofFld_Internal(Var instance, const bool isRoot, PropertyId propertyId, ScriptContext* scriptContext);
  547. template <bool unscopables>
  548. static BOOL SetProperty_Internal(Var instance, RecyclableObject* object, const bool isRoot, PropertyId propertyId, Var newValue, PropertyValueInfo * info, ScriptContext* requestContext, PropertyOperationFlags flags);
  549. template <typename TPropertyKey>
  550. static DescriptorFlags GetRootSetter(RecyclableObject* instance, TPropertyKey propertyKey, Var *setterValue, PropertyValueInfo* info, ScriptContext* requestContext);
  551. static BOOL IsNumberFromNativeArray(Var instance, uint32 index, ScriptContext* scriptContext);
  552. static BOOL GetItemFromArrayPrototype(JavascriptArray * arr, int32 indexInt, Var * result, ScriptContext * scriptContext);
  553. template <typename T>
  554. static BOOL OP_GetElementI_ArrayFastPath(T * arr, int indexInt, Var * result, ScriptContext * scriptContext);
  555. static ImplicitCallFlags CacheAndClearImplicitBit(ScriptContext* scriptContext);
  556. static ImplicitCallFlags CheckAndUpdateFunctionBodyWithImplicitFlag(FunctionBody* functionBody);
  557. static void RestoreImplicitFlag(ScriptContext* scriptContext, ImplicitCallFlags prevImplicitCallFlags, ImplicitCallFlags currImplicitCallFlags);
  558. static BOOL ToPropertyDescriptorForProxyObjects(Var propertySpec, PropertyDescriptor* descriptor, ScriptContext* scriptContext);
  559. static BOOL ToPropertyDescriptorForGenericObjects(Var propertySpec, PropertyDescriptor* descriptor, ScriptContext* scriptContext);
  560. };
  561. } // namespace Js