From 826cde866170918fbeeeffc8612d4f4e0a923869 Mon Sep 17 00:00:00 2001 From: Ben Noordhuis Date: Tue, 3 Mar 2015 01:42:18 +0100 Subject: [PATCH] src: fix gc heuristic for external twobyte strings 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 --- src/string_bytes.cc | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/string_bytes.cc b/src/string_bytes.cc index 7b07c6b7da..c828363da6 100644 --- a/src/string_bytes.cc +++ b/src/string_bytes.cc @@ -28,8 +28,7 @@ class ExternString: public ResourceType { public: ~ExternString() override { delete[] data_; - int64_t change_in_bytes = -static_cast(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 NewFromCopy(Isolate* isolate, const TypeName* data, size_t length) { @@ -69,7 +72,7 @@ class ExternString: public ResourceType { data, length); Local str = String::NewExternal(isolate, h_str); - isolate->AdjustAmountOfExternalAllocatedMemory(length); + isolate->AdjustAmountOfExternalAllocatedMemory(h_str->byte_length()); return scope.Escape(str); }