Chromium Code Reviews| Index: gin/converter.h |
| diff --git a/gin/converter.h b/gin/converter.h |
| index fa3367dff46eed3a87f5912fd493f0961b88027f..f882980d8b2f5207c50e58195dd9f5dd13ae5290 100644 |
| --- a/gin/converter.h |
| +++ b/gin/converter.h |
| @@ -14,6 +14,15 @@ |
| namespace gin { |
| +template<typename KeyType> |
| +bool SetProperty(v8::Isolate* isolate, |
| + v8::Local<v8::Object> object, |
| + KeyType key, |
| + v8::Local<v8::Value> value) { |
| + auto maybe = object->Set(isolate->GetCurrentContext(), key, value); |
| + return !maybe.IsNothing() && maybe.FromJust(); |
| +} |
| + |
| template<typename T, typename Enable = void> |
| struct Converter {}; |
| @@ -145,12 +154,16 @@ struct GIN_EXPORT Converter<v8::Handle<v8::Value> > { |
| template<typename T> |
| struct Converter<std::vector<T> > { |
| + // If this function fails to set an element due to an exception, this returns |
| + // an empty handle. |
| static v8::Handle<v8::Value> ToV8(v8::Isolate* isolate, |
| const std::vector<T>& val) { |
| v8::Handle<v8::Array> result( |
| v8::Array::New(isolate, static_cast<int>(val.size()))); |
| for (size_t i = 0; i < val.size(); ++i) { |
| - result->Set(static_cast<int>(i), Converter<T>::ToV8(isolate, val[i])); |
| + if (!SetProperty(isolate, result, static_cast<int>(i), |
| + Converter<T>::ToV8(isolate, val[i]))) |
| + return v8::Handle<v8::Value>(); |
|
jochen (gone - plz use gerrit)
2015/04/28 11:14:20
we shouldn't return empty handles but MaybeLocal<>
bashi
2015/05/01 03:50:35
Changing return type requires 3-way CLs.
1. Add Ma
|
| } |
| return result; |
| } |