Fix #2473
authorRyan Dahl <ry@tinyclouds.org>
Mon, 9 Jan 2012 23:29:15 +0000 (15:29 -0800)
committerRyan Dahl <ry@tinyclouds.org>
Tue, 10 Jan 2012 18:49:38 +0000 (10:49 -0800)
Tested in production.

See also http://code.google.com/p/v8/issues/detail?id=1889

src/node_buffer.h
src/stream_wrap.cc

index ea33112..ef7cf4f 100644 (file)
@@ -65,6 +65,7 @@ namespace node {
 
 class NODE_EXTERN Buffer: public ObjectWrap {
  public:
+  static v8::Persistent<v8::FunctionTemplate> constructor_template;
 
   static bool HasInstance(v8::Handle<v8::Value> val);
 
@@ -99,8 +100,6 @@ class NODE_EXTERN Buffer: public ObjectWrap {
                      free_callback callback, void *hint); // public constructor
 
   private:
-  static v8::Persistent<v8::FunctionTemplate> constructor_template;
-
   static v8::Handle<v8::Value> New(const v8::Arguments &args);
   static v8::Handle<v8::Value> BinarySlice(const v8::Arguments &args);
   static v8::Handle<v8::Value> AsciiSlice(const v8::Arguments &args);
index 95a19c7..b363049 100644 (file)
@@ -149,13 +149,17 @@ Handle<Value> StreamWrap::ReadStop(const Arguments& args) {
 }
 
 
-inline char* StreamWrap::NewSlab(Handle<Object> global,
-                                        Handle<Object> wrap_obj) {
-  Buffer* b = Buffer::New(SLAB_SIZE);
-  global->SetHiddenValue(slab_sym, b->handle_);
+char* StreamWrap::NewSlab(Handle<Object> global,
+                          Handle<Object> wrap_obj) {
+  HandleScope scope;
+  Local<Value> arg = Integer::NewFromUnsigned(SLAB_SIZE);
+  Local<Object> b = Buffer::constructor_template->GetFunction()->
+    NewInstance(1, &arg);
+  if (b.IsEmpty()) return NULL;
+  global->SetHiddenValue(slab_sym, b);
   assert(Buffer::Length(b) == SLAB_SIZE);
   slab_used = 0;
-  wrap_obj->SetHiddenValue(slab_sym, b->handle_);
+  wrap_obj->SetHiddenValue(slab_sym, b);
   return Buffer::Data(b);
 }