Browse Source

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 <trev.norris@gmail.com>
v1.8.0-commit
Ben Noordhuis 10 years ago
parent
commit
826cde8661
  1. 9
      src/string_bytes.cc

9
src/string_bytes.cc

@ -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);
}

Loading…
Cancel
Save