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.

Reply via email to