Index: src/api-arguments.h |
diff --git a/src/arguments.h b/src/api-arguments.h |
similarity index 59% |
copy from src/arguments.h |
copy to src/api-arguments.h |
index d781d8a353f40dde744b302672e72b98fa5eb00c..858404975877a50d33461f55b5a1e255974d1c80 100644 |
--- a/src/arguments.h |
+++ b/src/api-arguments.h |
@@ -1,77 +1,16 @@ |
-// Copyright 2012 the V8 project authors. All rights reserved. |
+// Copyright 2016 the V8 project authors. All rights reserved. |
// Use of this source code is governed by a BSD-style license that can be |
// found in the LICENSE file. |
-#ifndef V8_ARGUMENTS_H_ |
-#define V8_ARGUMENTS_H_ |
+#ifndef V8_API_ARGUMENTS_H_ |
+#define V8_API_ARGUMENTS_H_ |
-#include "src/allocation.h" |
#include "src/isolate.h" |
#include "src/tracing/trace-event.h" |
namespace v8 { |
namespace internal { |
-// Arguments provides access to runtime call parameters. |
-// |
-// It uses the fact that the instance fields of Arguments |
-// (length_, arguments_) are "overlayed" with the parameters |
-// (no. of parameters, and the parameter pointer) passed so |
-// that inside the C++ function, the parameters passed can |
-// be accessed conveniently: |
-// |
-// Object* Runtime_function(Arguments args) { |
-// ... use args[i] here ... |
-// } |
-// |
-// Note that length_ (whose value is in the integer range) is defined |
-// as intptr_t to provide endian-neutrality on 64-bit archs. |
- |
-class Arguments BASE_EMBEDDED { |
- public: |
- Arguments(int length, Object** arguments) |
- : length_(length), arguments_(arguments) { |
- DCHECK_GE(length_, 0); |
- } |
- |
- Object*& operator[] (int index) { |
- DCHECK_GE(index, 0); |
- DCHECK_LT(static_cast<uint32_t>(index), static_cast<uint32_t>(length_)); |
- return *(reinterpret_cast<Object**>(reinterpret_cast<intptr_t>(arguments_) - |
- index * kPointerSize)); |
- } |
- |
- template <class S> Handle<S> at(int index) { |
- Object** value = &((*this)[index]); |
- // This cast checks that the object we're accessing does indeed have the |
- // expected type. |
- S::cast(*value); |
- return Handle<S>(reinterpret_cast<S**>(value)); |
- } |
- |
- int smi_at(int index) { |
- return Smi::cast((*this)[index])->value(); |
- } |
- |
- double number_at(int index) { |
- return (*this)[index]->Number(); |
- } |
- |
- // Get the total number of arguments including the receiver. |
- int length() const { return static_cast<int>(length_); } |
- |
- Object** arguments() { return arguments_; } |
- |
- Object** lowest_address() { return &this->operator[](length() - 1); } |
- |
- Object** highest_address() { return &this->operator[](0); } |
- |
- private: |
- intptr_t length_; |
- Object** arguments_; |
-}; |
- |
- |
// For each type of callback, we have a list of arguments |
// They are used to generate the Call() functions below |
// These aren't included in the list as they have duplicate signatures |
@@ -95,21 +34,18 @@ class Arguments BASE_EMBEDDED { |
F(IndexedPropertySetterCallback, v8::Value, uint32_t, v8::Local<v8::Value>) |
#define FOR_EACH_CALLBACK_TABLE_MAPPING_2_VOID_RETURN(F) \ |
- F(AccessorNameSetterCallback, \ |
- void, \ |
- v8::Local<v8::Name>, \ |
- v8::Local<v8::Value>) \ |
- |
+ F(AccessorNameSetterCallback, void, v8::Local<v8::Name>, v8::Local<v8::Value>) |
// Custom arguments replicate a small segment of stack that can be |
// accessed through an Arguments object the same way the actual stack |
// can. |
-template<int kArrayLength> |
+template <int kArrayLength> |
class CustomArgumentsBase : public Relocatable { |
public: |
virtual inline void IterateInstance(ObjectVisitor* v) { |
v->VisitPointers(values_, values_ + kArrayLength); |
} |
+ |
protected: |
inline Object** begin() { return values_; } |
explicit inline CustomArgumentsBase(Isolate* isolate) |
@@ -117,8 +53,7 @@ class CustomArgumentsBase : public Relocatable { |
Object* values_[kArrayLength]; |
}; |
- |
-template<typename T> |
+template <typename T> |
class CustomArguments : public CustomArgumentsBase<T::kArgsLength> { |
public: |
static const int kReturnValueOffset = T::kReturnValueIndex; |
@@ -140,7 +75,6 @@ class CustomArguments : public CustomArgumentsBase<T::kArgsLength> { |
} |
}; |
- |
class PropertyCallbackArguments |
: public CustomArguments<PropertyCallbackInfo<Value> > { |
public: |
@@ -175,14 +109,14 @@ class PropertyCallbackArguments |
DCHECK(values[T::kIsolateIndex]->IsSmi()); |
} |
- /* |
- * The following Call functions wrap the calling of all callbacks to handle |
- * calling either the old or the new style callbacks depending on which one |
- * has been registered. |
- * For old callbacks which return an empty handle, the ReturnValue is checked |
- * and used if it's been set to anything inside the callback. |
- * New style callbacks always use the return value. |
- */ |
+/* |
+ * The following Call functions wrap the calling of all callbacks to handle |
+ * calling either the old or the new style callbacks depending on which one |
+ * has been registered. |
+ * For old callbacks which return an empty handle, the ReturnValue is checked |
+ * and used if it's been set to anything inside the callback. |
+ * New style callbacks always use the return value. |
+ */ |
#define WRITE_CALL_0(Function, ReturnValue) \ |
v8::Local<ReturnValue> Call(Function f); |
@@ -192,13 +126,13 @@ class PropertyCallbackArguments |
#define WRITE_CALL_2(Function, ReturnValue, Arg1, Arg2) \ |
v8::Local<ReturnValue> Call(Function f, Arg1 arg1, Arg2 arg2); |
-#define WRITE_CALL_2_VOID(Function, ReturnValue, Arg1, Arg2) \ |
- void Call(Function f, Arg1 arg1, Arg2 arg2); \ |
+#define WRITE_CALL_2_VOID(Function, ReturnValue, Arg1, Arg2) \ |
+ void Call(Function f, Arg1 arg1, Arg2 arg2); |
-FOR_EACH_CALLBACK_TABLE_MAPPING_0(WRITE_CALL_0) |
-FOR_EACH_CALLBACK_TABLE_MAPPING_1(WRITE_CALL_1) |
-FOR_EACH_CALLBACK_TABLE_MAPPING_2(WRITE_CALL_2) |
-FOR_EACH_CALLBACK_TABLE_MAPPING_2_VOID_RETURN(WRITE_CALL_2_VOID) |
+ FOR_EACH_CALLBACK_TABLE_MAPPING_0(WRITE_CALL_0) |
+ FOR_EACH_CALLBACK_TABLE_MAPPING_1(WRITE_CALL_1) |
+ FOR_EACH_CALLBACK_TABLE_MAPPING_2(WRITE_CALL_2) |
+ FOR_EACH_CALLBACK_TABLE_MAPPING_2_VOID_RETURN(WRITE_CALL_2_VOID) |
#undef WRITE_CALL_0 |
#undef WRITE_CALL_1 |
@@ -206,7 +140,6 @@ FOR_EACH_CALLBACK_TABLE_MAPPING_2_VOID_RETURN(WRITE_CALL_2_VOID) |
#undef WRITE_CALL_2_VOID |
}; |
- |
class FunctionCallbackArguments |
: public CustomArguments<FunctionCallbackInfo<Value> > { |
public: |
@@ -262,41 +195,7 @@ class FunctionCallbackArguments |
bool is_construct_call_; |
}; |
- |
-double ClobberDoubleRegisters(double x1, double x2, double x3, double x4); |
- |
- |
-#ifdef DEBUG |
-#define CLOBBER_DOUBLE_REGISTERS() ClobberDoubleRegisters(1, 2, 3, 4); |
-#else |
-#define CLOBBER_DOUBLE_REGISTERS() |
-#endif |
- |
-#define RUNTIME_FUNCTION_RETURNS_TYPE(Type, Name) \ |
- static INLINE(Type __RT_impl_##Name(Arguments args, Isolate* isolate)); \ |
- Type Name(int args_length, Object** args_object, Isolate* isolate) { \ |
- CLOBBER_DOUBLE_REGISTERS(); \ |
- Arguments args(args_length, args_object); \ |
- Type value; \ |
- TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8.runtime"), "V8." #Name); \ |
- if (FLAG_runtime_call_stats) { \ |
- RuntimeCallStats* stats = isolate->counters()->runtime_call_stats(); \ |
- RuntimeCallTimerScope timer(isolate, &stats->Name); \ |
- value = __RT_impl_##Name(args, isolate); \ |
- } else { \ |
- value = __RT_impl_##Name(args, isolate); \ |
- } \ |
- return value; \ |
- } \ |
- static Type __RT_impl_##Name(Arguments args, Isolate* isolate) |
- |
-#define RUNTIME_FUNCTION(Name) RUNTIME_FUNCTION_RETURNS_TYPE(Object*, Name) |
-#define RUNTIME_FUNCTION_RETURN_PAIR(Name) \ |
- RUNTIME_FUNCTION_RETURNS_TYPE(ObjectPair, Name) |
-#define RUNTIME_FUNCTION_RETURN_TRIPLE(Name) \ |
- RUNTIME_FUNCTION_RETURNS_TYPE(ObjectTriple, Name) |
- |
} // namespace internal |
} // namespace v8 |
-#endif // V8_ARGUMENTS_H_ |
+#endif // V8_API_ARGUMENTS_H_ |