JavascriptObject.h 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  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 GetPrototypeOf;
  32. static FunctionInfo SetPrototypeOf;
  33. static FunctionInfo Keys;
  34. static FunctionInfo GetOwnPropertyNames;
  35. static FunctionInfo GetOwnPropertySymbols;
  36. static FunctionInfo Seal;
  37. static FunctionInfo Freeze;
  38. static FunctionInfo PreventExtensions;
  39. static FunctionInfo IsSealed;
  40. static FunctionInfo IsFrozen;
  41. static FunctionInfo IsExtensible;
  42. static FunctionInfo DefineGetter;
  43. static FunctionInfo DefineSetter;
  44. static FunctionInfo LookupGetter;
  45. static FunctionInfo LookupSetter;
  46. static FunctionInfo Is;
  47. static FunctionInfo Assign;
  48. };
  49. static Var NewInstance(RecyclableObject* function, CallInfo callInfo, ...);
  50. static Var EntryHasOwnProperty(RecyclableObject* function, CallInfo callInfo, ...);
  51. static Var EntryPropertyIsEnumerable(RecyclableObject* function, CallInfo callInfo, ...);
  52. static Var EntryIsPrototypeOf(RecyclableObject* function, CallInfo callInfo, ...);
  53. static Var EntryToLocaleString(RecyclableObject* function, CallInfo callInfo, ...);
  54. static Var EntryToString(RecyclableObject* function, CallInfo callInfo, ...);
  55. static Var EntryValueOf(RecyclableObject* function, CallInfo callInfo, ...);
  56. static Var EntryDefineProperty(RecyclableObject* function, CallInfo callInfo, ...);
  57. static Var EntryDefineProperties(RecyclableObject* function, CallInfo callInfo, ...);
  58. static Var EntryCreate(RecyclableObject* function, CallInfo callInfo, ...);
  59. static Var EntryGetOwnPropertyDescriptor(RecyclableObject* function, CallInfo callInfo, ...);
  60. static Var EntryGetPrototypeOf(RecyclableObject* function, CallInfo callInfo, ...);
  61. static Var EntrySetPrototypeOf(RecyclableObject* function, CallInfo callInfo, ...);
  62. static Var EntryKeys(RecyclableObject* function, CallInfo callInfo, ...);
  63. static Var EntryGetOwnPropertyNames(RecyclableObject* function, CallInfo callInfo, ...);
  64. static Var EntryGetOwnPropertySymbols(RecyclableObject* function, CallInfo callInfo, ...);
  65. static Var EntrySeal(RecyclableObject* function, CallInfo callInfo, ...);
  66. static Var EntryFreeze(RecyclableObject* function, CallInfo callInfo, ...);
  67. static Var EntryPreventExtensions(RecyclableObject* function, CallInfo callInfo, ...);
  68. static Var EntryIsSealed(RecyclableObject* function, CallInfo callInfo, ...);
  69. static Var EntryIsFrozen(RecyclableObject* function, CallInfo callInfo, ...);
  70. static Var EntryIsExtensible(RecyclableObject* function, CallInfo callInfo, ...);
  71. static Var EntryDefineGetter(RecyclableObject* function, CallInfo callInfo, ...);
  72. static Var EntryDefineSetter(RecyclableObject* function, CallInfo callInfo, ...);
  73. static Var EntryLookupGetter(RecyclableObject* function, CallInfo callInfo, ...);
  74. static Var EntryLookupSetter(RecyclableObject* function, CallInfo callInfo, ...);
  75. static Var EntryIs(RecyclableObject* function, CallInfo callInfo, ...);
  76. static Var EntryAssign(RecyclableObject* function, CallInfo callInfo, ...);
  77. static Var GetPrototypeOf(RecyclableObject* obj, ScriptContext* scriptContext);
  78. static BOOL ChangePrototype(RecyclableObject* object, RecyclableObject* newPrototype, bool validate, ScriptContext* scriptContext);
  79. static Var CreateOwnSymbolPropertiesHelper(RecyclableObject* object, ScriptContext* scriptContext);
  80. static Var CreateOwnStringPropertiesHelper(RecyclableObject* object, ScriptContext* scriptContext);
  81. static Var CreateOwnStringSymbolPropertiesHelper(RecyclableObject* object, ScriptContext* scriptContext);
  82. static Var CreateOwnEnumerableStringPropertiesHelper(RecyclableObject* object, ScriptContext* scriptContext);
  83. static Var CreateOwnEnumerableStringSymbolPropertiesHelper(RecyclableObject* object, ScriptContext* scriptContext);
  84. static Var GetOwnPropertyDescriptorHelper(RecyclableObject* obj, Var propertyKey, ScriptContext* scriptContext);
  85. static BOOL GetOwnPropertyDescriptorHelper(RecyclableObject* obj, PropertyId propertyId, ScriptContext* scriptContext, PropertyDescriptor& propertyDescriptor);
  86. // Presently used in the projection as a mechanism of calling the general object prototype toString.
  87. static JavascriptString* ToStringInternal(Var thisArg, ScriptContext* scriptContext)
  88. {
  89. return static_cast<JavascriptString*>(ToStringHelper(thisArg, scriptContext));
  90. }
  91. static BOOL DefineOwnPropertyHelper(RecyclableObject* obj, PropertyId propId, const PropertyDescriptor& descriptor, ScriptContext* scriptContext, bool throwOnError = true);
  92. static Var ToStringHelper(Var thisArg, ScriptContext* scriptContext);
  93. static Var LegacyToStringHelper(ScriptContext* scriptContext, TypeId type);
  94. static JavascriptString* ToStringTagHelper(Var thisArg, ScriptContext* scriptContext, TypeId type);
  95. private:
  96. static void AssignForGenericObjects(RecyclableObject* from, RecyclableObject* to, ScriptContext* scriptContext);
  97. static void AssignForProxyObjects(RecyclableObject* from, RecyclableObject* to, ScriptContext* scriptContext);
  98. static Var CreateKeysHelper(RecyclableObject* object, ScriptContext* scriptContext, BOOL enumNonEnumerable, bool includeSymbolProperties, bool includeStringProperties, bool includeSpecialProperties);
  99. static void ModifyGetterSetterFuncName(const PropertyRecord * propertyRecord, const PropertyDescriptor& descriptor, ScriptContext* scriptContext);
  100. static wchar_t * ConstructName(const PropertyRecord * propertyRecord, const wchar_t * getOrSetStr, ScriptContext* scriptContext);
  101. static wchar_t * ConstructAccessorNameES6(const PropertyRecord * propertyRecord, const wchar_t * getOrSetStr, ScriptContext* scriptContext);
  102. static Var DefinePropertiesHelper(RecyclableObject* object, RecyclableObject* properties, ScriptContext* scriptContext);
  103. static Var DefinePropertiesHelperForGenericObjects(RecyclableObject* object, RecyclableObject* properties, ScriptContext* scriptContext);
  104. static Var DefinePropertiesHelperForProxyObjects(RecyclableObject* object, RecyclableObject* properties, ScriptContext* scriptContext);
  105. static bool IsPrototypeOf(RecyclableObject* proto, RecyclableObject* obj, ScriptContext* scriptContext);
  106. };
  107. }