accessors.h 3.57 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(StringLength)
39

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

class Accessors : public AllStatic {
 public:
  // Accessor descriptors.
45 46
#define ACCESSOR_INFO_DECLARATION(name)                   \
  static void name##Getter(                               \
47
      v8::Local<v8::Name> name,                           \
48 49
      const v8::PropertyCallbackInfo<v8::Value>& info);   \
  static void name##Setter(                               \
50
      v8::Local<v8::Name> name,                           \
51 52 53 54 55 56 57 58
      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

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

  // Accessor functions called directly from the runtime system.
69 70 71 72
  static Handle<Object> FunctionSetPrototype(Handle<JSFunction> object,
                                             Handle<Object> value);
  static Handle<Object> FunctionGetPrototype(Handle<JSFunction> object);
  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 81
  template <class T>
  static bool IsJSObjectFieldAccessor(typename T::TypeHandle type,
82
                                      Handle<Name> name,
83
                                      int* object_offset);
84

85 86
  static Handle<AccessorInfo> MakeAccessor(
      Isolate* isolate,
87 88 89
      Handle<Name> name,
      AccessorNameGetterCallback getter,
      AccessorNameSetterCallback setter,
90
      PropertyAttributes attributes);
91

92 93 94 95 96
  static Handle<ExecutableAccessorInfo> CloneAccessor(
      Isolate* isolate,
      Handle<ExecutableAccessorInfo> accessor);


97
 private:
98
  // Helper functions.
99
  static Handle<Object> FlattenNumber(Isolate* isolate, Handle<Object> value);
100 101 102 103 104
};

} }  // namespace v8::internal

#endif  // V8_ACCESSORS_H_