JavascriptObject.h 8.2 KB

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