JavascriptObject.h 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  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. namespace Js
  8. {
  9. class JavascriptObject : public DynamicObject
  10. {
  11. private:
  12. DEFINE_VTABLE_CTOR(JavascriptObject, DynamicObject);
  13. DEFINE_MARSHAL_OBJECT_TO_SCRIPT_CONTEXT(JavascriptObject);
  14. public:
  15. JavascriptObject(DynamicType* type) : DynamicObject(type)
  16. {
  17. }
  18. class EntryInfo
  19. {
  20. public:
  21. static FunctionInfo NewInstance;
  22. static FunctionInfo HasOwnProperty;
  23. static FunctionInfo HasOwn;
  24. static FunctionInfo PropertyIsEnumerable;
  25. static FunctionInfo IsPrototypeOf;
  26. static FunctionInfo ToLocaleString;
  27. static FunctionInfo ToString;
  28. static FunctionInfo ValueOf;
  29. static FunctionInfo DefineProperty;
  30. static FunctionInfo DefineProperties;
  31. static FunctionInfo Create;
  32. static FunctionInfo GetOwnPropertyDescriptor;
  33. static FunctionInfo GetOwnPropertyDescriptors;
  34. static FunctionInfo GetPrototypeOf;
  35. static FunctionInfo SetPrototypeOf;
  36. static FunctionInfo Keys;
  37. static FunctionInfo GetOwnPropertyNames;
  38. static FunctionInfo GetOwnPropertySymbols;
  39. static FunctionInfo Seal;
  40. static FunctionInfo Freeze;
  41. static FunctionInfo PreventExtensions;
  42. static FunctionInfo IsSealed;
  43. static FunctionInfo IsFrozen;
  44. static FunctionInfo IsExtensible;
  45. static FunctionInfo DefineGetter;
  46. static FunctionInfo DefineSetter;
  47. static FunctionInfo LookupGetter;
  48. static FunctionInfo LookupSetter;
  49. static FunctionInfo Is;
  50. static FunctionInfo Assign;
  51. static FunctionInfo Values;
  52. static FunctionInfo Entries;
  53. };
  54. static Var NewInstance(RecyclableObject* function, CallInfo callInfo, ...);
  55. static Var EntryHasOwnProperty(RecyclableObject* function, CallInfo callInfo, ...);
  56. static Var EntryHasOwn(RecyclableObject* function, CallInfo callInfo, ...);
  57. static Var EntryPropertyIsEnumerable(RecyclableObject* function, CallInfo callInfo, ...);
  58. static Var EntryIsPrototypeOf(RecyclableObject* function, CallInfo callInfo, ...);
  59. static Var EntryToLocaleString(RecyclableObject* function, CallInfo callInfo, ...);
  60. static Var EntryToString(RecyclableObject* function, CallInfo callInfo, ...);
  61. static Var EntryValueOf(RecyclableObject* function, CallInfo callInfo, ...);
  62. static Var EntryDefineProperty(RecyclableObject* function, CallInfo callInfo, ...);
  63. static Var EntryDefineProperties(RecyclableObject* function, CallInfo callInfo, ...);
  64. static Var EntryCreate(RecyclableObject* function, CallInfo callInfo, ...);
  65. static Var EntryGetOwnPropertyDescriptor(RecyclableObject* function, CallInfo callInfo, ...);
  66. static Var EntryGetOwnPropertyDescriptors(RecyclableObject* function, CallInfo callInfo, ...);
  67. static Var EntryGetPrototypeOf(RecyclableObject* function, CallInfo callInfo, ...);
  68. static Var EntrySetPrototypeOf(RecyclableObject* function, CallInfo callInfo, ...);
  69. static Var EntryKeys(RecyclableObject* function, CallInfo callInfo, ...);
  70. static Var EntryGetOwnPropertyNames(RecyclableObject* function, CallInfo callInfo, ...);
  71. static Var EntryGetOwnPropertySymbols(RecyclableObject* function, CallInfo callInfo, ...);
  72. static Var EntrySeal(RecyclableObject* function, CallInfo callInfo, ...);
  73. static Var EntryFreeze(RecyclableObject* function, CallInfo callInfo, ...);
  74. static Var EntryPreventExtensions(RecyclableObject* function, CallInfo callInfo, ...);
  75. static Var EntryIsSealed(RecyclableObject* function, CallInfo callInfo, ...);
  76. static Var EntryIsFrozen(RecyclableObject* function, CallInfo callInfo, ...);
  77. static Var EntryIsExtensible(RecyclableObject* function, CallInfo callInfo, ...);
  78. static Var EntryDefineGetter(RecyclableObject* function, CallInfo callInfo, ...);
  79. static Var EntryDefineSetter(RecyclableObject* function, CallInfo callInfo, ...);
  80. static Var EntryLookupGetter(RecyclableObject* function, CallInfo callInfo, ...);
  81. static Var EntryLookupSetter(RecyclableObject* function, CallInfo callInfo, ...);
  82. static Var EntryIs(RecyclableObject* function, CallInfo callInfo, ...);
  83. static Var EntryAssign(RecyclableObject* function, CallInfo callInfo, ...);
  84. static Var EntryValues(RecyclableObject* function, CallInfo callInfo, ...);
  85. static Var EntryEntries(RecyclableObject* function, CallInfo callInfo, ...);
  86. static Var GetPrototypeOf(RecyclableObject* obj, ScriptContext* scriptContext);
  87. static BOOL ChangePrototype(RecyclableObject* object, RecyclableObject* newPrototype, bool validate, ScriptContext* scriptContext);
  88. static JavascriptArray* CreateOwnSymbolPropertiesHelper(RecyclableObject* object, ScriptContext* scriptContext);
  89. static JavascriptArray* CreateOwnStringPropertiesHelper(RecyclableObject* object, ScriptContext* scriptContext);
  90. static JavascriptArray* CreateOwnStringSymbolPropertiesHelper(RecyclableObject* object, ScriptContext* scriptContext);
  91. static JavascriptArray* CreateOwnEnumerableStringPropertiesHelper(RecyclableObject* object, ScriptContext* scriptContext);
  92. static JavascriptArray* CreateOwnEnumerableStringSymbolPropertiesHelper(RecyclableObject* object, ScriptContext* scriptContext);
  93. static Var GetOwnPropertyDescriptorHelper(RecyclableObject* obj, Var propertyKey, ScriptContext* scriptContext);
  94. static BOOL GetOwnPropertyDescriptorHelper(RecyclableObject* obj, PropertyId propertyId, ScriptContext* scriptContext, PropertyDescriptor& propertyDescriptor);
  95. // Param valuesToReturn should be set to true when we are looking for values from an object otherwise entries will be returned
  96. static Var GetValuesOrEntries(RecyclableObject* object, bool valuesToReturn, ScriptContext* scriptContext);
  97. // Presently used in the projection as a mechanism of calling the general object prototype toString.
  98. static JavascriptString* ToStringInternal(Var thisArg, ScriptContext* scriptContext)
  99. {
  100. return static_cast<JavascriptString*>(ToStringHelper(thisArg, scriptContext));
  101. }
  102. static BOOL DefineOwnPropertyHelper(RecyclableObject* obj, PropertyId propId, const PropertyDescriptor& descriptor, ScriptContext* scriptContext, bool throwOnError = true);
  103. static Var ToStringHelper(Var thisArg, ScriptContext* scriptContext);
  104. static JavascriptString* ToStringTagHelper(Var thisArg, ScriptContext* scriptContext, TypeId type);
  105. static bool IsPrototypeOf(RecyclableObject* proto, RecyclableObject* obj, ScriptContext* scriptContext);
  106. static bool IsPrototypeOfStopAtProxy(RecyclableObject* proto, RecyclableObject* obj, ScriptContext* scriptContext);
  107. static void SpreadObjectLiteral(Var source, Var to, ScriptContext* scriptContext);
  108. static void Restify(Var source, Var to, void* excludedStatic, void* excludedComputed, ScriptContext* scriptContext);
  109. private:
  110. template <bool tryCopy, bool assign>
  111. static void CopyDataPropertiesHelper(Var source, RecyclableObject* to, ScriptContext* scriptContext, const BVSparse<Recycler>* excluded = nullptr);
  112. template <bool assign>
  113. static void CopyDataPropertiesForGenericObjects(RecyclableObject* from, RecyclableObject* to, const BVSparse<Recycler>* excluded, ScriptContext* scriptContext);
  114. template <bool assign>
  115. static void CopyDataPropertiesForProxyObjects(RecyclableObject* from, RecyclableObject* to, const BVSparse<Recycler>* excluded, ScriptContext* scriptContext);
  116. static BOOL CreateDataProperty(RecyclableObject* obj, PropertyId key, Var value, ScriptContext* scriptContext);
  117. static JavascriptArray* CreateKeysHelper(RecyclableObject* object, ScriptContext* scriptContext, BOOL enumNonEnumerable, bool includeSymbolProperties, bool includeStringProperties, bool includeSpecialProperties);
  118. static void ModifyGetterSetterFuncName(const PropertyRecord * propertyRecord, const PropertyDescriptor& descriptor, ScriptContext* scriptContext);
  119. static char16 * ConstructName(const PropertyRecord * propertyRecord, const char16 * getOrSetStr, ScriptContext* scriptContext);
  120. static Var DefinePropertiesHelper(RecyclableObject* object, RecyclableObject* properties, ScriptContext* scriptContext);
  121. static Var DefinePropertiesHelperForGenericObjects(RecyclableObject* object, RecyclableObject* properties, ScriptContext* scriptContext);
  122. static Var DefinePropertiesHelperForProxyObjects(RecyclableObject* object, RecyclableObject* properties, ScriptContext* scriptContext);
  123. static Var GetToStringTagValue(RecyclableObject *thisArg, ScriptContext *scriptContext);
  124. };
  125. }