From 88cb8fb2487cd24b42643a14ac828e8be02728ff Mon Sep 17 00:00:00 2001 From: "danno@chromium.org" Date: Fri, 6 Jun 2014 09:57:08 +0000 Subject: [PATCH] Field layout in class Arguments is incompatible w\ 64-bit archs. The length_ field must be defined as intptr_t rather than int. This is due to the fact that we place native argc/argv values into stack slots (via SetFrameSlot) and then interpret the slots as a an instance of Arguments class. Little endian architectures get 'lucky' that the layout happens to work with implicit padding. Big endian is not as lucky. See Runtime_ArrayConstructor for an example. Based on https://github.com/andrewlow/v8/commit/d8c3570f71c0be9914e79139740124bd1ca711a7 BUG=v8:3366 LOG=N R=danno@chromium.org Review URL: https://codereview.chromium.org/314123003 Patch from Andrew Low . git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@21711 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/arguments.h | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/arguments.h b/src/arguments.h index 7a6f533e19..320b6ad6d7 100644 --- a/src/arguments.h +++ b/src/arguments.h @@ -21,6 +21,9 @@ namespace internal { // 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: @@ -50,12 +53,12 @@ class Arguments BASE_EMBEDDED { } // Get the total number of arguments including the receiver. - int length() const { return length_; } + int length() const { return static_cast(length_); } Object** arguments() { return arguments_; } private: - int length_; + intptr_t length_; Object** arguments_; };