Chromium Code Reviews| Index: src/d8.cc |
| diff --git a/src/d8.cc b/src/d8.cc |
| index fcdf2b6e43e0a57f57520d904099e75a63ee7af0..406607a4f816c8e1e3a7046ad247a54bf3dcd40f 100644 |
| --- a/src/d8.cc |
| +++ b/src/d8.cc |
| @@ -2396,6 +2396,9 @@ bool Shell::SetOptions(int argc, char* argv[]) { |
| } else if (strcmp(argv[i], "--enable-inspector") == 0) { |
| options.enable_inspector = true; |
| argv[i] = NULL; |
| + } else if (strncmp(argv[i], "--max-serializer-memory-usage=", 30) == 0) { |
| + options.max_serializer_memory_usage = atoi(argv[i] + 30); |
| + argv[i] = NULL; |
| } |
| } |
| @@ -2490,8 +2493,11 @@ void Shell::EmptyMessageQueues(Isolate* isolate) { |
| class Serializer : public ValueSerializer::Delegate { |
| public: |
| - explicit Serializer(Isolate* isolate) |
| - : isolate_(isolate), serializer_(isolate, this) {} |
| + Serializer(Isolate* isolate, size_t max_memory_usage) |
| + : isolate_(isolate), |
| + serializer_(isolate, this), |
| + max_memory_usage_(max_memory_usage), |
| + current_memory_usage_(0) {} |
| Maybe<bool> WriteValue(Local<Context> context, Local<Value> value, |
| Local<Value> transfer) { |
| @@ -2542,6 +2548,10 @@ class Serializer : public ValueSerializer::Delegate { |
| void* ReallocateBufferMemory(void* old_buffer, size_t size, |
| size_t* actual_size) override { |
| + current_memory_usage_ += size; |
|
Michael Achenbach
2017/02/15 09:35:24
You could nest the addition within a condition abo
binji
2017/02/15 20:31:55
Right, I added a comment about that.
|
| + if (max_memory_usage_ != 0 && current_memory_usage_ > max_memory_usage_) |
| + return nullptr; |
| + |
| void* result = realloc(old_buffer, size); |
| *actual_size = result ? size : 0; |
| return result; |
| @@ -2619,6 +2629,8 @@ class Serializer : public ValueSerializer::Delegate { |
| std::unique_ptr<SerializationData> data_; |
| std::vector<Global<ArrayBuffer>> array_buffers_; |
| std::vector<Global<SharedArrayBuffer>> shared_array_buffers_; |
| + size_t max_memory_usage_; /* For testing when memory exhaustion. */ |
|
Michael Achenbach
2017/02/15 09:35:24
nit: remove "when"?
binji
2017/02/15 20:31:55
Done.
|
| + size_t current_memory_usage_; |
| DISALLOW_COPY_AND_ASSIGN(Serializer); |
| }; |
| @@ -2667,7 +2679,7 @@ std::unique_ptr<SerializationData> Shell::SerializeValue( |
| Isolate* isolate, Local<Value> value, Local<Value> transfer) { |
| bool ok; |
| Local<Context> context = isolate->GetCurrentContext(); |
| - Serializer serializer(isolate); |
| + Serializer serializer(isolate, options.max_serializer_memory_usage); |
| if (serializer.WriteValue(context, value, transfer).To(&ok)) { |
| std::unique_ptr<SerializationData> data = serializer.Release(); |
| base::LockGuard<base::Mutex> lock_guard(workers_mutex_.Pointer()); |