Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(40)

Side by Side Diff: Source/bindings/v8/V8StringResource.h

Issue 242913002: [ABANDONED] Add exception handling options to V8StringResource<T>::prepare. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2009 Google Inc. All rights reserved. 2 * Copyright (C) 2009 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 1. Redistributions of source code must retain the above copyright 7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright 9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after
151 151
152 enum ExternalMode { 152 enum ExternalMode {
153 Externalize, 153 Externalize,
154 DoNotExternalize 154 DoNotExternalize
155 }; 155 };
156 156
157 template <typename StringType> 157 template <typename StringType>
158 StringType v8StringToWebCoreString(v8::Handle<v8::String>, ExternalMode); 158 StringType v8StringToWebCoreString(v8::Handle<v8::String>, ExternalMode);
159 String int32ToWebCoreString(int value); 159 String int32ToWebCoreString(int value);
160 160
161 enum V8StringResourceInitMode {
162 V8StringResourceDoNotCatchException,
163 V8StringResourceRethrowException,
164 V8StringResourceStoreException,
165 };
166
167 template<V8StringResourceInitMode>
168 struct V8StringResourceToString;
yhirano 2014/04/24 06:52:51 I know this is a bit complex, but It is needed to
169
170 template<>
171 struct V8StringResourceToString<V8StringResourceDoNotCatchException> {
172 typedef V8StringResourceToString<V8StringResourceDoNotCatchException> ThisCl ass;
173 static bool call(ThisClass*, v8::Handle<v8::Value>* value)
174 {
175 *value = (*value)->ToString();
176 return !value->IsEmpty();
177 }
178 };
179
180 template<>
181 struct V8StringResourceToString<V8StringResourceRethrowException> {
182 typedef V8StringResourceToString<V8StringResourceRethrowException> ThisClass ;
183 static bool call(ThisClass*, v8::Handle<v8::Value>* value)
184 {
185 v8::TryCatch block;
186 *value = (*value)->ToString();
187 if (block.HasCaught()) {
188 block.ReThrow();
189 return false;
190 }
191 return true;
192 }
193 };
194
195 template<>
196 struct V8StringResourceToString<V8StringResourceStoreException> {
yhirano 2014/04/24 06:52:51 Nobody uses this class yet, but I wrote it as a pr
197 typedef V8StringResourceToString<V8StringResourceStoreException> ThisClass;
198 bool call(ThisClass* context, v8::Handle<v8::Value>* value)
199 {
200 v8::TryCatch block;
201 *value = (*value)->ToString();
202 if (block.HasCaught()) {
203 context->exception = block.Exception();
204 return false;
205 }
206 return true;
207 }
208 v8::Handle<v8::Value> exception;
209 };
210
161 // V8StringResource is an adapter class that converts V8 values to Strings 211 // V8StringResource is an adapter class that converts V8 values to Strings
162 // or AtomicStrings as appropriate, using multiple typecast operators. 212 // or AtomicStrings as appropriate, using multiple typecast operators.
163 enum V8StringResourceMode { 213 enum V8StringResourceMode {
164 DefaultMode, 214 DefaultMode,
165 WithNullCheck, 215 WithNullCheck,
166 WithUndefinedOrNullCheck 216 WithUndefinedOrNullCheck
167 }; 217 };
168 218
169 template <V8StringResourceMode Mode = DefaultMode> 219 template <V8StringResourceMode Mode = DefaultMode>
170 class V8StringResource { 220 class V8StringResource {
171 public: 221 public:
172 V8StringResource(v8::Handle<v8::Value> object) 222 V8StringResource(v8::Handle<v8::Value> object)
173 : m_v8Object(object) 223 : m_v8Object(object)
174 , m_mode(Externalize) 224 , m_mode(Externalize)
175 , m_string() 225 , m_string()
176 { 226 {
177 } 227 }
178 228
179 bool prepare(); 229 // Initializes this object, which means sets m_v8Object, m_mode and
180 operator String() const { return toString<String>(); } 230 // m_string appropriately.
181 operator AtomicString() const { return toString<AtomicString>(); } 231 // This function returns true if intialization is done successfully.
182 232 template<V8StringResourceInitMode initMode>
183 private: 233 bool init(V8StringResourceToString<initMode>* stringifier)
184 bool prepareBase()
185 { 234 {
186 if (m_v8Object.IsEmpty()) 235 if (m_v8Object.IsEmpty())
187 return true; 236 return true;
188 237
238 if (!isValid()) {
239 setString(String());
240 return true;
241 }
242
189 if (LIKELY(m_v8Object->IsString())) 243 if (LIKELY(m_v8Object->IsString()))
190 return true; 244 return true;
191 245
192 if (LIKELY(m_v8Object->IsInt32())) { 246 if (LIKELY(m_v8Object->IsInt32())) {
193 setString(int32ToWebCoreString(m_v8Object->Int32Value())); 247 setString(int32ToWebCoreString(m_v8Object->Int32Value()));
194 return true; 248 return true;
195 } 249 }
250 m_mode = DoNotExternalize;
251 return V8StringResourceToString<initMode>::call(stringifier, &m_v8Object );
252 }
196 253
197 m_mode = DoNotExternalize; 254 operator String() const { return toString<String>(); }
198 v8::TryCatch block; 255 operator AtomicString() const { return toString<AtomicString>(); }
199 m_v8Object = m_v8Object->ToString(); 256
200 // Handle the case where an exception is thrown as part of invoking toSt ring on the object. 257 private:
201 if (block.HasCaught()) { 258 bool isValid();
202 block.ReThrow();
203 return false;
204 }
205 return true;
206 }
207 259
208 void setString(const String& string) 260 void setString(const String& string)
209 { 261 {
210 m_string = string; 262 m_string = string;
211 m_v8Object.Clear(); // To signal that String is ready. 263 m_v8Object.Clear(); // To signal that String is ready.
212 } 264 }
213 265
214 template <class StringType> 266 template <class StringType>
215 StringType toString() const 267 StringType toString() const
216 { 268 {
217 if (LIKELY(!m_v8Object.IsEmpty())) 269 if (LIKELY(!m_v8Object.IsEmpty()))
218 return v8StringToWebCoreString<StringType>(const_cast<v8::Handle<v8: :Value>*>(&m_v8Object)->As<v8::String>(), m_mode); 270 return v8StringToWebCoreString<StringType>(const_cast<v8::Handle<v8: :Value>*>(&m_v8Object)->As<v8::String>(), m_mode);
219 271
220 return StringType(m_string); 272 return StringType(m_string);
221 } 273 }
222 274
223 v8::Handle<v8::Value> m_v8Object; 275 v8::Handle<v8::Value> m_v8Object;
224 ExternalMode m_mode; 276 ExternalMode m_mode;
225 String m_string; 277 String m_string;
226 }; 278 };
227 279
228 template<> inline bool V8StringResource<DefaultMode>::prepare() 280 template<> inline bool V8StringResource<DefaultMode>::isValid()
229 { 281 {
230 return prepareBase(); 282 return true;
231 } 283 }
232 284
233 template<> inline bool V8StringResource<WithNullCheck>::prepare() 285 template<> inline bool V8StringResource<WithNullCheck>::isValid()
234 { 286 {
235 if (m_v8Object.IsEmpty() || m_v8Object->IsNull()) { 287 return !m_v8Object->IsNull();
236 setString(String());
237 return true;
238 }
239 return prepareBase();
240 } 288 }
241 289
242 template<> inline bool V8StringResource<WithUndefinedOrNullCheck>::prepare() 290 template<> inline bool V8StringResource<WithUndefinedOrNullCheck>::isValid()
243 { 291 {
244 if (m_v8Object.IsEmpty() || m_v8Object->IsNull() || m_v8Object->IsUndefined( )) { 292 return !m_v8Object->IsNull() && !m_v8Object->IsUndefined();
245 setString(String());
246 return true;
247 }
248 return prepareBase();
249 } 293 }
250 294
251 } // namespace WebCore 295 } // namespace WebCore
252 296
253 #endif // V8StringResource_h 297 #endif // V8StringResource_h
OLDNEW
« Source/bindings/v8/V8Binding.h ('K') | « Source/bindings/v8/V8BindingMacros.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698