Mercurial > hg > truffle
diff src/share/vm/utilities/array.hpp @ 20804:7848fc12602b
Merge with jdk8u40-b25
author | Gilles Duboscq <gilles.m.duboscq@oracle.com> |
---|---|
date | Tue, 07 Apr 2015 14:58:49 +0200 |
parents | 52b4284cb496 870c03421152 |
children |
line wrap: on
line diff
--- a/src/share/vm/utilities/array.hpp Tue Apr 07 11:20:51 2015 +0200 +++ b/src/share/vm/utilities/array.hpp Tue Apr 07 14:58:49 2015 +0200 @@ -28,6 +28,7 @@ #include "memory/allocation.hpp" #include "memory/allocation.inline.hpp" #include "memory/metaspace.hpp" +#include "runtime/orderAccess.hpp" // correct linkage required to compile w/o warnings // (must be on file level - cannot be local) @@ -304,6 +305,7 @@ friend class MetadataFactory; friend class VMStructs; friend class MethodHandleCompiler; // special case + friend class WhiteBox; protected: int _length; // the number of array elements T _data[1]; // the array memory @@ -325,6 +327,31 @@ static size_t byte_sizeof(int length) { return sizeof(Array<T>) + MAX2(length - 1, 0) * sizeof(T); } + // WhiteBox API helper. + // Can't distinguish between array of length 0 and length 1, + // will always return 0 in those cases. + static int bytes_to_length(size_t bytes) { + assert(is_size_aligned(bytes, BytesPerWord), "Must be, for now"); + + if (sizeof(Array<T>) >= bytes) { + return 0; + } + + size_t left = bytes - sizeof(Array<T>); + assert(is_size_aligned(left, sizeof(T)), "Must be"); + + size_t elements = left / sizeof(T); + assert(elements <= (size_t)INT_MAX, err_msg("number of elements " SIZE_FORMAT "doesn't fit into an int.", elements)); + + int length = (int)elements; + + assert((size_t)size(length) * BytesPerWord == bytes, + err_msg("Expected: " SIZE_FORMAT " got: " SIZE_FORMAT, + bytes, (size_t)size(length) * BytesPerWord)); + + return length; + } + explicit Array(int length) : _length(length) { assert(length >= 0, "illegal length"); }