src: fix gc heuristic for external twobyte strings
authorBen Noordhuis <info@bnoordhuis.nl>
Tue, 3 Mar 2015 00:42:18 +0000 (01:42 +0100)
committerBen Noordhuis <info@bnoordhuis.nl>
Thu, 5 Mar 2015 19:42:13 +0000 (20:42 +0100)
Large external two-byte strings reported their character length instead
of their byte length, throwing off the garbage collector heuristic by
a factor of two.

PR-URL: https://github.com/iojs/io.js/pull/1042
Reviewed-By: Trevor Norris <trev.norris@gmail.com>
src/string_bytes.cc

index 7b07c6b..c828363 100644 (file)
@@ -28,8 +28,7 @@ class ExternString: public ResourceType {
   public:
     ~ExternString() override {
       delete[] data_;
-      int64_t change_in_bytes = -static_cast<int64_t>(length_);
-      isolate()->AdjustAmountOfExternalAllocatedMemory(change_in_bytes);
+      isolate()->AdjustAmountOfExternalAllocatedMemory(-byte_length());
     }
 
     const TypeName* data() const override {
@@ -40,6 +39,10 @@ class ExternString: public ResourceType {
       return length_;
     }
 
+    int64_t byte_length() const {
+      return length() * sizeof(*data());
+    }
+
     static Local<String> NewFromCopy(Isolate* isolate,
                                      const TypeName* data,
                                      size_t length) {
@@ -69,7 +72,7 @@ class ExternString: public ResourceType {
                                                                      data,
                                                                      length);
       Local<String> str = String::NewExternal(isolate, h_str);
-      isolate->AdjustAmountOfExternalAllocatedMemory(length);
+      isolate->AdjustAmountOfExternalAllocatedMemory(h_str->byte_length());
 
       return scope.Escape(str);
     }