Reviewers: Jakob,
Description:
Add basic support for STL containers allocated in Zones
[email protected]
Please review this at https://codereview.chromium.org/157443002/
SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge
Affected files (+72, -26 lines):
M src/list.h
M src/utils.h
A + src/zone-allocator.h
A + src/zone-containers.h
Index: src/list.h
diff --git a/src/list.h b/src/list.h
index
65645c9a53cee473d183d8f40efc9fc9bfcbbc21..71aa821959faa7c9a6948c336fc02cf3271c8d9d
100644
--- a/src/list.h
+++ b/src/list.h
@@ -91,6 +91,10 @@ class List {
inline T& last() const { return at(length_ - 1); }
inline T& first() const { return at(0); }
+ typedef T* iterator;
+ inline iterator begin() const { return &data_[0]; }
+ inline iterator end() const { return &data_[length_]; }
+
INLINE(bool is_empty() const) { return length_ == 0; }
INLINE(int length() const) { return length_; }
INLINE(int capacity() const) { return capacity_; }
Index: src/utils.h
diff --git a/src/utils.h b/src/utils.h
index
b11d756b8a97281135590147102e2e4536a8197a..c56468bae483c95070dc495c2641e7411c94c043
100644
--- a/src/utils.h
+++ b/src/utils.h
@@ -1140,6 +1140,20 @@ class BailoutId {
int id_;
};
+template <class C>
+class ContainerPointerWrapper {
+ public:
+ typedef typename C::iterator iterator;
+ typedef typename C::reverse_iterator reverse_iterator;
+ explicit ContainerPointerWrapper(C* container) : container_(container) {}
+ iterator begin() { return container_->begin(); }
+ iterator end() { return container_->end(); }
+ reverse_iterator rbegin() { return container_->rbegin(); }
+ reverse_iterator rend() { return container_->rend(); }
+ private:
+ C* container_;
+};
+
} } // namespace v8::internal
#endif // V8_UTILS_H_
Index: src/zone-allocator.h
diff --git a/test/cctest/trace-extension.h b/src/zone-allocator.h
similarity index 55%
copy from test/cctest/trace-extension.h
copy to src/zone-allocator.h
index
b80b3d45dc81579629ddccb6761cfa709b17e4e9..22f73aec064e3e20208b83cb185bd0e00909104d
100644
--- a/test/cctest/trace-extension.h
+++ b/src/zone-allocator.h
@@ -25,32 +25,56 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#ifndef V8_TEST_CCTEST_TRACE_EXTENSION_H_
-#define V8_TEST_CCTEST_TRACE_EXTENSION_H_
+#ifndef V8_ZONE_ALLOCATOR_H_
+#define V8_ZONE_ALLOCATOR_H_
-#include "v8.h"
+#include "zone.h"
namespace v8 {
namespace internal {
-class TraceExtension : public v8::Extension {
+template<typename T>
+class zone_allocator {
public:
- TraceExtension() : v8::Extension("v8/trace", kSource) { }
- virtual v8::Handle<v8::FunctionTemplate> GetNativeFunctionTemplate(
- v8::Isolate* isolate,
- v8::Handle<v8::String> name);
- static void Trace(const v8::FunctionCallbackInfo<v8::Value>& args);
- static void JSTrace(const v8::FunctionCallbackInfo<v8::Value>& args);
- static void JSEntrySP(const v8::FunctionCallbackInfo<v8::Value>& args);
- static void JSEntrySPLevel2(const v8::FunctionCallbackInfo<v8::Value>&
args);
- static Address GetJsEntrySp();
- static void InitTraceEnv(TickSample* sample);
- static void DoTrace(Address fp);
+ typedef T* pointer;
+ typedef const T* const_pointer;
+ typedef T& reference;
+ typedef const T& const_reference;
+ typedef T value_type;
+ typedef size_t size_type;
+ typedef ptrdiff_t difference_type;
+ template<class O> struct rebind {
+ typedef zone_allocator<O> other;
+ };
+
+ explicit zone_allocator(Zone* zone) throw() : zone_(zone) {}
+ explicit zone_allocator(const zone_allocator& other) throw()
+ : zone_(other.zone_) {}
+ template<typename U> zone_allocator(const zone_allocator<U>&) throw() {}
+
+ pointer address(reference x) const {return &x;}
+ const_pointer address(const_reference x) const {return &x;}
+
+ pointer allocate(size_type count, const void* hint = 0) {
+ size_t size = count * sizeof(value_type);
+ size = RoundUp(size, kPointerSize);
+ return static_cast<pointer>(zone_->New(size));
+ }
+ void deallocate(pointer p, size_type) { /* noop for Zones */ }
+
+ size_type max_size() const throw() {
+ size_type max = static_cast<size_type>(-1) / sizeof(T);
+ return (max > 0 ? max : 1);
+ }
+ void construct(pointer p, const T& val) {
+ new(static_cast<void*>(p)) T(val);
+ }
+ void destroy(pointer p) { (static_cast<T*>(p))->~T(); }
+
private:
- static Address GetFP(const v8::FunctionCallbackInfo<v8::Value>& args);
- static const char* kSource;
+ Zone* zone_;
};
} } // namespace v8::internal
-#endif
+#endif // V8_ZONE_ALLOCATOR_H_
Index: src/zone-containers.h
diff --git a/src/icu_util.h b/src/zone-containers.h
similarity index 80%
copy from src/icu_util.h
copy to src/zone-containers.h
index
478abce508cc69a74b83028e19ddc66f9ea1d641..31672b62dbf0b4a2926f8354a4bc1b4da6c534ca
100644
--- a/src/icu_util.h
+++ b/src/zone-containers.h
@@ -1,4 +1,4 @@
-// Copyright 2013 the V8 project authors. All rights reserved.
+// Copyright 2014 the V8 project authors. All rights reserved.
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
@@ -25,18 +25,22 @@
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#ifndef V8_ZONE_CONTAINERS_H_
+#define V8_ZONE_CONTAINERS_H_
-#ifndef V8_ICU_UTIL_H_
-#define V8_ICU_UTIL_H_
+#include <vector>
+#include <set>
-namespace v8 {
+#include "zone.h"
+namespace v8 {
namespace internal {
-// Call this function to load ICU's data tables for the current process.
This
-// function should be called before ICU is used.
-bool InitializeICU();
+typedef zone_allocator<int> ZoneIntAllocator;
+typedef std::vector<int, ZoneIntAllocator> IntVector;
+typedef IntVector::iterator IntVectorIter;
+typedef IntVector::reverse_iterator IntVectorRIter;
} } // namespace v8::internal
-#endif // V8_ICU_UTIL_H_
+#endif // V8_ZONE_CONTAINERS_H_
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/groups/opt_out.