summaryrefslogtreecommitdiff
path: root/deps/v8/src/arguments.h
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/arguments.h')
-rw-r--r--deps/v8/src/arguments.h69
1 files changed, 42 insertions, 27 deletions
diff --git a/deps/v8/src/arguments.h b/deps/v8/src/arguments.h
index db1ee5467c..920ef7c65d 100644
--- a/deps/v8/src/arguments.h
+++ b/deps/v8/src/arguments.h
@@ -6,7 +6,9 @@
#define V8_ARGUMENTS_H_
#include "src/allocation.h"
+#include "src/handles.h"
#include "src/objects.h"
+#include "src/objects/slots.h"
#include "src/tracing/trace-event.h"
namespace v8 {
@@ -20,7 +22,7 @@ namespace internal {
// that inside the C++ function, the parameters passed can
// be accessed conveniently:
//
-// Object* Runtime_function(Arguments args) {
+// Object Runtime_function(Arguments args) {
// ... use args[i] here ...
// }
//
@@ -29,17 +31,12 @@ namespace internal {
class Arguments {
public:
- Arguments(int length, Object** arguments)
+ Arguments(int length, Address* 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));
- }
+ Object operator[](int index) { return Object(*address_of_arg_at(index)); }
template <class S = Object>
inline Handle<S> at(int index);
@@ -48,24 +45,35 @@ class Arguments {
inline double number_at(int index);
- // Get the total number of arguments including the receiver.
- int length() const { return static_cast<int>(length_); }
+ inline void set_at(int index, Object value) {
+ *address_of_arg_at(index) = value->ptr();
+ }
- Object** arguments() { return arguments_; }
+ inline FullObjectSlot slot_at(int index) {
+ return FullObjectSlot(address_of_arg_at(index));
+ }
- Object** lowest_address() { return &this->operator[](length() - 1); }
+ inline Address* address_of_arg_at(int index) {
+ DCHECK_LT(static_cast<uint32_t>(index), static_cast<uint32_t>(length_));
+ return reinterpret_cast<Address*>(reinterpret_cast<Address>(arguments_) -
+ index * kSystemPointerSize);
+ }
+
+ // Get the total number of arguments including the receiver.
+ int length() const { return static_cast<int>(length_); }
- Object** highest_address() { return &this->operator[](0); }
+ // Arguments on the stack are in reverse order (compared to an array).
+ FullObjectSlot first_slot() { return slot_at(length() - 1); }
+ FullObjectSlot last_slot() { return slot_at(0); }
private:
intptr_t length_;
- Object** arguments_;
+ Address* arguments_;
};
template <>
inline Handle<Object> Arguments::at(int index) {
- Object** value = &((*this)[index]);
- return Handle<Object>(value);
+ return Handle<Object>(address_of_arg_at(index));
}
double ClobberDoubleRegisters(double x1, double x2, double x3, double x4);
@@ -78,33 +86,40 @@ double ClobberDoubleRegisters(double x1, double x2, double x3, double x4);
// TODO(cbruni): add global flag to check whether any tracing events have been
// enabled.
-#define RUNTIME_FUNCTION_RETURNS_TYPE(Type, Name) \
- static V8_INLINE Type __RT_impl_##Name(Arguments args, Isolate* isolate); \
+#define RUNTIME_FUNCTION_RETURNS_TYPE(Type, InternalType, Convert, Name) \
+ static V8_INLINE InternalType __RT_impl_##Name(Arguments args, \
+ Isolate* isolate); \
\
- V8_NOINLINE static Type Stats_##Name(int args_length, Object** args_object, \
+ V8_NOINLINE static Type Stats_##Name(int args_length, Address* args_object, \
Isolate* isolate) { \
RuntimeCallTimerScope timer(isolate, RuntimeCallCounterId::k##Name); \
TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("v8.runtime"), \
"V8.Runtime_" #Name); \
Arguments args(args_length, args_object); \
- return __RT_impl_##Name(args, isolate); \
+ return Convert(__RT_impl_##Name(args, isolate)); \
} \
\
- Type Name(int args_length, Object** args_object, Isolate* isolate) { \
- DCHECK(isolate->context() == nullptr || isolate->context()->IsContext()); \
+ Type Name(int args_length, Address* args_object, Isolate* isolate) { \
+ DCHECK(isolate->context().is_null() || isolate->context()->IsContext()); \
CLOBBER_DOUBLE_REGISTERS(); \
if (V8_UNLIKELY(FLAG_runtime_stats)) { \
return Stats_##Name(args_length, args_object, isolate); \
} \
Arguments args(args_length, args_object); \
- return __RT_impl_##Name(args, isolate); \
+ return Convert(__RT_impl_##Name(args, isolate)); \
} \
\
- static Type __RT_impl_##Name(Arguments args, Isolate* isolate)
+ static InternalType __RT_impl_##Name(Arguments args, Isolate* isolate)
+
+#define CONVERT_OBJECT(x) (x)->ptr()
+#define CONVERT_OBJECTPAIR(x) (x)
+
+#define RUNTIME_FUNCTION(Name) \
+ RUNTIME_FUNCTION_RETURNS_TYPE(Address, Object, CONVERT_OBJECT, Name)
-#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_PAIR(Name) \
+ RUNTIME_FUNCTION_RETURNS_TYPE(ObjectPair, ObjectPair, CONVERT_OBJECTPAIR, \
+ Name)
} // namespace internal
} // namespace v8