blob: ea9fb09afdb7b497ed0ed5680a77c1c9d528b91c [file] [log] [blame]
Ben Murdoch097c5b22016-05-18 11:27:45 +01001// Copyright 2016 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "test/fuzzer/fuzzer-support.h"
6
7#include <stdio.h>
8#include <stdlib.h>
9#include <string.h>
10
11#include "include/libplatform/libplatform.h"
12
Ben Murdochc5610432016-08-08 18:44:38 +010013#include "src/flags.h"
14
Ben Murdoch097c5b22016-05-18 11:27:45 +010015namespace v8_fuzzer {
16
17namespace {
18
19FuzzerSupport* g_fuzzer_support = nullptr;
20
21void DeleteFuzzerSupport() {
22 if (g_fuzzer_support) {
23 delete g_fuzzer_support;
24 g_fuzzer_support = nullptr;
25 }
26}
27
28} // namespace
29
30class FuzzerSupport::ArrayBufferAllocator : public v8::ArrayBuffer::Allocator {
31 public:
32 virtual void* Allocate(size_t length) {
33 void* data = AllocateUninitialized(length);
34 return data == NULL ? data : memset(data, 0, length);
35 }
36 virtual void* AllocateUninitialized(size_t length) { return malloc(length); }
37 virtual void Free(void* data, size_t) { free(data); }
38};
39
40FuzzerSupport::FuzzerSupport(int* argc, char*** argv) {
Ben Murdochc5610432016-08-08 18:44:38 +010041 v8::internal::FLAG_expose_gc = true;
Ben Murdoch097c5b22016-05-18 11:27:45 +010042 v8::V8::SetFlagsFromCommandLine(argc, *argv, true);
Ben Murdoch61f157c2016-09-16 13:49:30 +010043 v8::V8::InitializeICUDefaultLocation((*argv)[0]);
Ben Murdoch097c5b22016-05-18 11:27:45 +010044 v8::V8::InitializeExternalStartupData((*argv)[0]);
45 platform_ = v8::platform::CreateDefaultPlatform();
46 v8::V8::InitializePlatform(platform_);
47 v8::V8::Initialize();
48
49 allocator_ = new ArrayBufferAllocator;
50 v8::Isolate::CreateParams create_params;
51 create_params.array_buffer_allocator = allocator_;
52 isolate_ = v8::Isolate::New(create_params);
53
54 {
55 v8::Isolate::Scope isolate_scope(isolate_);
56 v8::HandleScope handle_scope(isolate_);
57 context_.Reset(isolate_, v8::Context::New(isolate_));
58 }
59}
60
61FuzzerSupport::~FuzzerSupport() {
62 {
63 v8::Isolate::Scope isolate_scope(isolate_);
64 while (v8::platform::PumpMessageLoop(platform_, isolate_)) /* empty */
65 ;
66
67 v8::HandleScope handle_scope(isolate_);
68 context_.Reset();
69 }
70
Ben Murdochc5610432016-08-08 18:44:38 +010071 isolate_->LowMemoryNotification();
Ben Murdoch097c5b22016-05-18 11:27:45 +010072 isolate_->Dispose();
73 isolate_ = nullptr;
74
75 delete allocator_;
76 allocator_ = nullptr;
77
78 v8::V8::Dispose();
79 v8::V8::ShutdownPlatform();
80
81 delete platform_;
82 platform_ = nullptr;
83}
84
85// static
86FuzzerSupport* FuzzerSupport::Get() { return g_fuzzer_support; }
87
88v8::Isolate* FuzzerSupport::GetIsolate() { return isolate_; }
89
90v8::Local<v8::Context> FuzzerSupport::GetContext() {
91 v8::Isolate::Scope isolate_scope(isolate_);
92 v8::EscapableHandleScope handle_scope(isolate_);
93 v8::Local<v8::Context> context =
94 v8::Local<v8::Context>::New(isolate_, context_);
95 return handle_scope.Escape(context);
96}
97
98} // namespace v8_fuzzer
99
100extern "C" int LLVMFuzzerInitialize(int* argc, char*** argv) {
101 v8_fuzzer::g_fuzzer_support = new v8_fuzzer::FuzzerSupport(argc, argv);
102 atexit(&v8_fuzzer::DeleteFuzzerSupport);
103 return 0;
104}