accessors.h 3.88 KB
Newer Older
1
// Copyright 2012 the V8 project authors. All rights reserved.
2 3
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
4 5 6 7

#ifndef V8_ACCESSORS_H_
#define V8_ACCESSORS_H_

8 9
#include "src/allocation.h"
#include "src/globals.h"
10

11 12
namespace v8 {
namespace internal {
13 14 15

// The list of accessor descriptors. This is a second-order macro
// taking a macro to be applied to all accessor descriptor names.
16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
#define ACCESSOR_INFO_LIST(V)     \
  V(ArgumentsIterator)            \
  V(ArrayLength)                  \
  V(FunctionArguments)            \
  V(FunctionCaller)               \
  V(FunctionName)                 \
  V(FunctionLength)               \
  V(FunctionPrototype)            \
  V(ScriptColumnOffset)           \
  V(ScriptCompilationType)        \
  V(ScriptContextData)            \
  V(ScriptEvalFromScript)         \
  V(ScriptEvalFromScriptPosition) \
  V(ScriptEvalFromFunctionName)   \
  V(ScriptId)                     \
  V(ScriptLineEnds)               \
  V(ScriptLineOffset)             \
  V(ScriptName)                   \
  V(ScriptSource)                 \
  V(ScriptType)                   \
  V(ScriptSourceUrl)              \
  V(ScriptSourceMappingUrl)       \
38
  V(ScriptIsEmbedderDebugScript)  \
39
  V(StringLength)
40

41
// Accessors contains all predefined proxy accessors.
42 43 44 45

class Accessors : public AllStatic {
 public:
  // Accessor descriptors.
46 47
#define ACCESSOR_INFO_DECLARATION(name)                   \
  static void name##Getter(                               \
48
      v8::Local<v8::Name> name,                           \
49 50
      const v8::PropertyCallbackInfo<v8::Value>& info);   \
  static void name##Setter(                               \
51
      v8::Local<v8::Name> name,                           \
52 53 54 55 56 57 58 59
      v8::Local<v8::Value> value,                         \
      const v8::PropertyCallbackInfo<void>& info);   \
  static Handle<AccessorInfo> name##Info(                 \
      Isolate* isolate,                                   \
      PropertyAttributes attributes);
  ACCESSOR_INFO_LIST(ACCESSOR_INFO_DECLARATION)
#undef ACCESSOR_INFO_DECLARATION

60
  enum DescriptorId {
61 62 63 64 65
#define ACCESSOR_INFO_DECLARATION(name) \
    k##name##Getter, \
    k##name##Setter,
  ACCESSOR_INFO_LIST(ACCESSOR_INFO_DECLARATION)
#undef ACCESSOR_INFO_DECLARATION
66 67 68 69
    descriptorCount
  };

  // Accessor functions called directly from the runtime system.
70 71
  MUST_USE_RESULT static MaybeHandle<Object> FunctionSetPrototype(
      Handle<JSFunction> object, Handle<Object> value);
72
  static Handle<Object> FunctionGetArguments(Handle<JSFunction> object);
73

74 75 76 77
  // Accessor infos.
  static Handle<AccessorInfo> MakeModuleExport(
      Handle<String> name, int index, PropertyAttributes attributes);

78 79
  // Returns true for properties that are accessors to object fields.
  // If true, *object_offset contains offset of object field.
80
  static bool IsJSObjectFieldAccessor(Handle<Map> map, Handle<Name> name,
81
                                      int* object_offset);
82

83 84 85 86 87 88 89 90
  // Returns true for properties that are accessors to ArrayBufferView and
  // derived classes fields. If true, *object_offset contains offset of
  // object field. The caller still has to check whether the underlying
  // buffer was neutered.
  static bool IsJSArrayBufferViewFieldAccessor(Handle<Map> map,
                                               Handle<Name> name,
                                               int* object_offset);

91 92
  static Handle<AccessorInfo> MakeAccessor(
      Isolate* isolate,
93 94 95
      Handle<Name> name,
      AccessorNameGetterCallback getter,
      AccessorNameSetterCallback setter,
96
      PropertyAttributes attributes);
97

98 99 100 101 102
  static Handle<ExecutableAccessorInfo> CloneAccessor(
      Isolate* isolate,
      Handle<ExecutableAccessorInfo> accessor);


103
 private:
104
  // Helper functions.
105
  static Handle<Object> FlattenNumber(Isolate* isolate, Handle<Object> value);
106 107 108 109 110
};

} }  // namespace v8::internal

#endif  // V8_ACCESSORS_H_