| Index: gin/converter.cc | 
| diff --git a/gin/converter.cc b/gin/converter.cc | 
| index d870bebc4bb816e49612b15df3039c43286b4998..9a3462d5a2dd44b2734ea7731b445f9feb471a64 100644 | 
| --- a/gin/converter.cc | 
| +++ b/gin/converter.cc | 
| @@ -10,14 +10,30 @@ using v8::ArrayBuffer; | 
| using v8::Boolean; | 
| using v8::External; | 
| using v8::Function; | 
| +using v8::Int32; | 
| using v8::Integer; | 
| using v8::Isolate; | 
| using v8::Local; | 
| +using v8::Maybe; | 
| +using v8::MaybeLocal; | 
| using v8::Number; | 
| using v8::Object; | 
| using v8::String; | 
| +using v8::Uint32; | 
| using v8::Value; | 
|  | 
| +namespace { | 
| + | 
| +template <typename T, typename U> | 
| +bool FromMaybe(Maybe<T> maybe, U* out) { | 
| +  if (maybe.IsNothing()) | 
| +    return false; | 
| +  *out = static_cast<U>(maybe.FromJust()); | 
| +  return true; | 
| +} | 
| + | 
| +}  // namespace | 
| + | 
| namespace gin { | 
|  | 
| Local<Value> Converter<bool>::ToV8(Isolate* isolate, bool val) { | 
| @@ -25,8 +41,7 @@ Local<Value> Converter<bool>::ToV8(Isolate* isolate, bool val) { | 
| } | 
|  | 
| bool Converter<bool>::FromV8(Isolate* isolate, Local<Value> val, bool* out) { | 
| -  *out = val->BooleanValue(); | 
| -  return true; | 
| +  return FromMaybe(val->BooleanValue(isolate->GetCurrentContext()), out); | 
| } | 
|  | 
| Local<Value> Converter<int32_t>::ToV8(Isolate* isolate, int32_t val) { | 
| @@ -38,7 +53,7 @@ bool Converter<int32_t>::FromV8(Isolate* isolate, | 
| int32_t* out) { | 
| if (!val->IsInt32()) | 
| return false; | 
| -  *out = val->Int32Value(); | 
| +  *out = val.As<Int32>()->Value(); | 
| return true; | 
| } | 
|  | 
| @@ -51,7 +66,7 @@ bool Converter<uint32_t>::FromV8(Isolate* isolate, | 
| uint32_t* out) { | 
| if (!val->IsUint32()) | 
| return false; | 
| -  *out = val->Uint32Value(); | 
| +  *out = val.As<Uint32>()->Value(); | 
| return true; | 
| } | 
|  | 
| @@ -66,8 +81,7 @@ bool Converter<int64_t>::FromV8(Isolate* isolate, | 
| return false; | 
| // Even though IntegerValue returns int64_t, JavaScript cannot represent | 
| // the full precision of int64_t, which means some rounding might occur. | 
| -  *out = val->IntegerValue(); | 
| -  return true; | 
| +  return FromMaybe(val->IntegerValue(isolate->GetCurrentContext()), out); | 
| } | 
|  | 
| Local<Value> Converter<uint64_t>::ToV8(Isolate* isolate, uint64_t val) { | 
| @@ -79,8 +93,7 @@ bool Converter<uint64_t>::FromV8(Isolate* isolate, | 
| uint64_t* out) { | 
| if (!val->IsNumber()) | 
| return false; | 
| -  *out = static_cast<uint64_t>(val->IntegerValue()); | 
| -  return true; | 
| +  return FromMaybe(val->IntegerValue(isolate->GetCurrentContext()), out); | 
| } | 
|  | 
| Local<Value> Converter<float>::ToV8(Isolate* isolate, float val) { | 
| @@ -90,7 +103,7 @@ Local<Value> Converter<float>::ToV8(Isolate* isolate, float val) { | 
| bool Converter<float>::FromV8(Isolate* isolate, Local<Value> val, float* out) { | 
| if (!val->IsNumber()) | 
| return false; | 
| -  *out = static_cast<float>(val->NumberValue()); | 
| +  *out = static_cast<float>(val.As<Number>()->Value()); | 
| return true; | 
| } | 
|  | 
| @@ -103,14 +116,16 @@ bool Converter<double>::FromV8(Isolate* isolate, | 
| double* out) { | 
| if (!val->IsNumber()) | 
| return false; | 
| -  *out = val->NumberValue(); | 
| +  *out = val.As<Number>()->Value(); | 
| return true; | 
| } | 
|  | 
| Local<Value> Converter<base::StringPiece>::ToV8(Isolate* isolate, | 
| const base::StringPiece& val) { | 
| -  return String::NewFromUtf8(isolate, val.data(), String::kNormalString, | 
| -                             static_cast<uint32_t>(val.length())); | 
| +  return String::NewFromUtf8(isolate, val.data(), | 
| +                             v8::NewStringType::kNormal, | 
| +                             static_cast<uint32_t>(val.length())) | 
| +      .ToLocalChecked(); | 
| } | 
|  | 
| Local<Value> Converter<std::string>::ToV8(Isolate* isolate, | 
| @@ -194,10 +209,10 @@ bool Converter<Local<Value>>::FromV8(Isolate* isolate, | 
|  | 
| v8::Local<v8::String> StringToSymbol(v8::Isolate* isolate, | 
| const base::StringPiece& val) { | 
| -  return String::NewFromUtf8(isolate, | 
| -                             val.data(), | 
| -                             String::kInternalizedString, | 
| -                             static_cast<uint32_t>(val.length())); | 
| +  return String::NewFromUtf8(isolate, val.data(), | 
| +                             v8::NewStringType::kInternalized, | 
| +                             static_cast<uint32_t>(val.length())) | 
| +      .ToLocalChecked(); | 
| } | 
|  | 
| std::string V8ToString(v8::Local<v8::Value> value) { | 
|  |