1659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org// Copyright 2012 the V8 project authors. All rights reserved.
243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// Redistribution and use in source and binary forms, with or without
343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// modification, are permitted provided that the following conditions are
443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// met:
543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//
643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//     * Redistributions of source code must retain the above copyright
743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//       notice, this list of conditions and the following disclaimer.
843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//     * Redistributions in binary form must reproduce the above
943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//       copyright notice, this list of conditions and the following
1043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//       disclaimer in the documentation and/or other materials provided
1143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//       with the distribution.
1243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//     * Neither the name of Google Inc. nor the names of its
1343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//       contributors may be used to endorse or promote products derived
1443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//       from this software without specific prior written permission.
1543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen//
1643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
2843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#ifndef V8_ACCESSORS_H_
2943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define V8_ACCESSORS_H_
3043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
311c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org#include "allocation.h"
32659ceec4628056d3c6e7076c850fba1c412cbb8ayangguo@chromium.org#include "v8globals.h"
331c09276ce2ac5214e81ca554360b9f101187893blrn@chromium.org
3471affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace v8 {
3571affb54842da76b24f0bb3184e9f0960523f89dkasperl@chromium.orgnamespace internal {
3643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
3743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// The list of accessor descriptors. This is a second-order macro
3843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen// taking a macro to be applied to all accessor descriptor names.
3943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define ACCESSOR_DESCRIPTOR_LIST(V) \
40e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org  V(FunctionPrototype)              \
41e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org  V(FunctionLength)                 \
42e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org  V(FunctionName)                   \
43e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org  V(FunctionArguments)              \
44e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org  V(FunctionCaller)                 \
45e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org  V(ArrayLength)                    \
46e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org  V(StringLength)                   \
47e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org  V(ScriptSource)                   \
48e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org  V(ScriptName)                     \
49e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org  V(ScriptId)                       \
50e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org  V(ScriptLineOffset)               \
51e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org  V(ScriptColumnOffset)             \
52e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org  V(ScriptData)                     \
53e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org  V(ScriptType)                     \
54e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org  V(ScriptCompilationType)          \
55e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org  V(ScriptLineEnds)                 \
56e2902be65446e26fd63a3b4eab2f14257cf4ebafager@chromium.org  V(ScriptContextData)              \
579818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org  V(ScriptEvalFromScript)           \
589818059c4eaba109c3ab9b45f9608d938872d75csgjesse@chromium.org  V(ScriptEvalFromScriptPosition)   \
59e27d617298263725e8a48c2aa14029759b952623mstarzinger@chromium.org  V(ScriptEvalFromFunctionName)
6043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
619a4089a092cad9ff23b6416b92cd5d818dc101d1mads.s.ager@gmail.com// Accessors contains all predefined proxy accessors.
6243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
6343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansenclass Accessors : public AllStatic {
6443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen public:
6543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Accessor descriptors.
6643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define ACCESSOR_DESCRIPTOR_DECLARATION(name) \
6743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  static const AccessorDescriptor name;
6843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ACCESSOR_DESCRIPTOR_LIST(ACCESSOR_DESCRIPTOR_DECLARATION)
6943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#undef ACCESSOR_DESCRIPTOR_DECLARATION
7043d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
7143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  enum DescriptorId {
7243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#define ACCESSOR_DESCRIPTOR_DECLARATION(name) \
7343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    k##name,
7443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  ACCESSOR_DESCRIPTOR_LIST(ACCESSOR_DESCRIPTOR_DECLARATION)
7543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#undef ACCESSOR_DESCRIPTOR_DECLARATION
7643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen    descriptorCount
7743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  };
7843d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
7943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Accessor functions called directly from the runtime system.
8077ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org  static Handle<Object> FunctionGetPrototype(Handle<Object> object);
81ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  static Handle<Object> FunctionGetArguments(Handle<Object> object);
8277ca49ac05d25684c89442029c22f5b2bce94395ulan@chromium.org
83303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org  MUST_USE_RESULT static MaybeObject* FunctionSetPrototype(JSObject* object,
84a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org                                                      Object* value,
85a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org                                                      void*);
86a55512615f5adc085d23bc8589d155c4b579fb7bkasperl@chromium.org
8781cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org  // Accessor infos.
8881cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org  static Handle<AccessorInfo> MakeModuleExport(
8981cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org      Handle<String> name, int index, PropertyAttributes attributes);
9081cac2ba397bd57f2967c8b4b677bef08a869991danno@chromium.org
9143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen private:
9243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Accessor functions only used through the descriptor.
93ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  static MaybeObject* FunctionGetPrototype(Object* object, void*);
94303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org  static MaybeObject* FunctionGetLength(Object* object, void*);
95303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org  static MaybeObject* FunctionGetName(Object* object, void*);
96ba72ec861b69b67139c93fc6dd56f4a73c9b3135jkummerow@chromium.org  static MaybeObject* FunctionGetArguments(Object* object, void*);
97303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org  static MaybeObject* FunctionGetCaller(Object* object, void*);
98303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org  MUST_USE_RESULT static MaybeObject* ArraySetLength(JSObject* object,
99303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org                                                     Object* value, void*);
100303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org  static MaybeObject* ArrayGetLength(Object* object, void*);
101303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org  static MaybeObject* StringGetLength(Object* object, void*);
102303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org  static MaybeObject* ScriptGetName(Object* object, void*);
103303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org  static MaybeObject* ScriptGetId(Object* object, void*);
104303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org  static MaybeObject* ScriptGetSource(Object* object, void*);
105303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org  static MaybeObject* ScriptGetLineOffset(Object* object, void*);
106303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org  static MaybeObject* ScriptGetColumnOffset(Object* object, void*);
107303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org  static MaybeObject* ScriptGetData(Object* object, void*);
108303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org  static MaybeObject* ScriptGetType(Object* object, void*);
109303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org  static MaybeObject* ScriptGetCompilationType(Object* object, void*);
110303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org  static MaybeObject* ScriptGetLineEnds(Object* object, void*);
111303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org  static MaybeObject* ScriptGetContextData(Object* object, void*);
112303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org  static MaybeObject* ScriptGetEvalFromScript(Object* object, void*);
113303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org  static MaybeObject* ScriptGetEvalFromScriptPosition(Object* object, void*);
114303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org  static MaybeObject* ScriptGetEvalFromFunctionName(Object* object, void*);
11543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
11643d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  // Helper functions.
11743d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  static Object* FlattenNumber(Object* value);
118303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org  static MaybeObject* IllegalSetter(JSObject*, Object*, void*);
11943d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen  static Object* IllegalGetAccessor(Object* object, void*);
120303ada708275d2d425b846fb237f1ba7598ee239lrn@chromium.org  static MaybeObject* ReadOnlySetAccessor(JSObject*, Object* value, void*);
12143d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen};
12243d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
12343d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen} }  // namespace v8::internal
12443d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen
12543d26ecc3563a46f62a0224030667c8f8f3f6cebchristian.plesner.hansen#endif  // V8_ACCESSORS_H_
126