| Index: Source/bindings/core/v8/V8Binding.h
 | 
| diff --git a/Source/bindings/core/v8/V8Binding.h b/Source/bindings/core/v8/V8Binding.h
 | 
| index 79ea8a9ce8f5e0c03dcab8a20c715d96e73aac26..d4c9550fa9fe4316d7c4e5cd7010626ce222edd2 100644
 | 
| --- a/Source/bindings/core/v8/V8Binding.h
 | 
| +++ b/Source/bindings/core/v8/V8Binding.h
 | 
| @@ -34,6 +34,7 @@
 | 
|  
 | 
|  #include "bindings/core/v8/DOMWrapperWorld.h"
 | 
|  #include "bindings/core/v8/ExceptionMessages.h"
 | 
| +#include "bindings/core/v8/ExceptionState.h"
 | 
|  #include "bindings/core/v8/ScriptValue.h"
 | 
|  #include "bindings/core/v8/ScriptWrappable.h"
 | 
|  #include "bindings/core/v8/V8BindingMacros.h"
 | 
| @@ -535,6 +536,9 @@ inline float toFloat(v8::Local<v8::Value> value)
 | 
|      return static_cast<float>(value->NumberValue());
 | 
|  }
 | 
|  
 | 
| +bool toBoolean(v8::Handle<v8::Value>, ExceptionState&);
 | 
| +double toDouble(v8::Handle<v8::Value>, ExceptionState&);
 | 
| +
 | 
|  // Converts a value to a String, throwing if any code unit is outside 0-255.
 | 
|  String toByteString(v8::Handle<v8::Value>, ExceptionState&);
 | 
|  
 | 
| @@ -568,12 +572,47 @@ PassRefPtrWillBeRawPtr<XPathNSResolver> toXPathNSResolver(v8::Handle<v8::Value>,
 | 
|  template<class T> struct NativeValueTraits;
 | 
|  
 | 
|  template<>
 | 
| +struct NativeValueTraits<bool> {
 | 
| +    static inline bool nativeValueMayFail(v8::Isolate* isolate, const v8::Handle<v8::Value>& value, ExceptionState& exceptionState)
 | 
| +    {
 | 
| +        return toBoolean(value, exceptionState);
 | 
| +    }
 | 
| +};
 | 
| +
 | 
| +template<>
 | 
|  struct NativeValueTraits<String> {
 | 
|      static inline String nativeValue(const v8::Handle<v8::Value>& value, v8::Isolate* isolate)
 | 
|      {
 | 
|          TOSTRING_DEFAULT(V8StringResource<>, stringValue, value, String());
 | 
|          return stringValue;
 | 
|      }
 | 
| +    static inline String nativeValueMayFail(v8::Isolate* isolate, const v8::Handle<v8::Value>& value, ExceptionState& exceptionState)
 | 
| +    {
 | 
| +        // FIXME: handle failure
 | 
| +        TOSTRING_DEFAULT(V8StringResource<>, stringValue, value, String());
 | 
| +        return stringValue;
 | 
| +    }
 | 
| +};
 | 
| +
 | 
| +template<>
 | 
| +struct NativeValueTraits<AtomicString> {
 | 
| +    static inline AtomicString nativeValueMayFail(v8::Isolate* isolate, const v8::Handle<v8::Value>& value, ExceptionState& exceptionState)
 | 
| +    {
 | 
| +        TOSTRING_DEFAULT(V8StringResource<>, stringValue, value, AtomicString());
 | 
| +        return stringValue;
 | 
| +    }
 | 
| +};
 | 
| +
 | 
| +template<>
 | 
| +struct NativeValueTraits<int> {
 | 
| +    static inline int nativeValue(const v8::Handle<v8::Value>& value, v8::Isolate* isolate)
 | 
| +    {
 | 
| +        return toInt32(value);
 | 
| +    }
 | 
| +    static inline int nativeValueMayFail(v8::Isolate* isolate, const v8::Handle<v8::Value>& value, ExceptionState& exceptionState)
 | 
| +    {
 | 
| +        return toInt32(value, NormalConversion, exceptionState);
 | 
| +    }
 | 
|  };
 | 
|  
 | 
|  template<>
 | 
| @@ -582,6 +621,58 @@ struct NativeValueTraits<unsigned> {
 | 
|      {
 | 
|          return toUInt32(value);
 | 
|      }
 | 
| +    static inline unsigned nativeValueMayFail(v8::Isolate* isolate, const v8::Handle<v8::Value>& value, ExceptionState& exceptionState)
 | 
| +    {
 | 
| +        return toUInt32(value, NormalConversion, exceptionState);
 | 
| +    }
 | 
| +};
 | 
| +
 | 
| +template<>
 | 
| +struct NativeValueTraits<unsigned long> {
 | 
| +    static inline unsigned long nativeValue(const v8::Handle<v8::Value>& value, v8::Isolate* isolate)
 | 
| +    {
 | 
| +        return toUInt32(value);
 | 
| +    }
 | 
| +    static inline unsigned long nativeValueMayFail(v8::Isolate* isolate, const v8::Handle<v8::Value>& value, ExceptionState& exceptionState)
 | 
| +    {
 | 
| +        return toUInt32(value, NormalConversion, exceptionState);
 | 
| +    }
 | 
| +};
 | 
| +
 | 
| +template<>
 | 
| +struct NativeValueTraits<unsigned long long> {
 | 
| +    static inline unsigned long long nativeValue(const v8::Handle<v8::Value>& value, v8::Isolate* isolate)
 | 
| +    {
 | 
| +        return toUInt64(value);
 | 
| +    }
 | 
| +    static inline unsigned long long nativeValueMayFail(v8::Isolate* isolate, const v8::Handle<v8::Value>& value, ExceptionState& exceptionState)
 | 
| +    {
 | 
| +        return toUInt64(value, NormalConversion, exceptionState);
 | 
| +    }
 | 
| +};
 | 
| +
 | 
| +template<>
 | 
| +struct NativeValueTraits<short> {
 | 
| +    static inline short nativeValue(const v8::Handle<v8::Value>& value, v8::Isolate* isolate)
 | 
| +    {
 | 
| +        return toInt16(value);
 | 
| +    }
 | 
| +    static inline short nativeValueMayFail(v8::Isolate* isolate, const v8::Handle<v8::Value>& value, ExceptionState& exceptionState)
 | 
| +    {
 | 
| +        return toInt16(value, NormalConversion, exceptionState);
 | 
| +    }
 | 
| +};
 | 
| +
 | 
| +template<>
 | 
| +struct NativeValueTraits<unsigned short> {
 | 
| +    static inline unsigned short nativeValue(const v8::Handle<v8::Value>& value, v8::Isolate* isolate)
 | 
| +    {
 | 
| +        return toUInt16(value);
 | 
| +    }
 | 
| +    static inline unsigned short nativeValueMayFail(v8::Isolate* isolate, const v8::Handle<v8::Value>& value, ExceptionState& exceptionState)
 | 
| +    {
 | 
| +        return toUInt16(value, NormalConversion, exceptionState);
 | 
| +    }
 | 
|  };
 | 
|  
 | 
|  template<>
 | 
| @@ -590,6 +681,10 @@ struct NativeValueTraits<float> {
 | 
|      {
 | 
|          return static_cast<float>(value->NumberValue());
 | 
|      }
 | 
| +    static inline float nativeValueMayFail(v8::Isolate* isolate, const v8::Handle<v8::Value>& value, ExceptionState& exceptionState)
 | 
| +    {
 | 
| +        return toFloat(value, exceptionState);
 | 
| +    }
 | 
|  };
 | 
|  
 | 
|  template<>
 | 
| @@ -598,6 +693,10 @@ struct NativeValueTraits<double> {
 | 
|      {
 | 
|          return static_cast<double>(value->NumberValue());
 | 
|      }
 | 
| +    static inline double nativeValueMayFail(v8::Isolate* isolate, const v8::Handle<v8::Value>& value, ExceptionState& exceptionState)
 | 
| +    {
 | 
| +        return toDouble(value, exceptionState);
 | 
| +    }
 | 
|  };
 | 
|  
 | 
|  template<>
 | 
| @@ -614,6 +713,10 @@ struct NativeValueTraits<ScriptValue> {
 | 
|      {
 | 
|          return ScriptValue(ScriptState::current(isolate), value);
 | 
|      }
 | 
| +    static inline ScriptValue nativeValueMayFail(v8::Isolate* isolate, const v8::Handle<v8::Value>& value, ExceptionState& exceptionState)
 | 
| +    {
 | 
| +        return ScriptValue(ScriptState::current(isolate), value);
 | 
| +    }
 | 
|  };
 | 
|  
 | 
|  v8::Handle<v8::Value> toV8Sequence(v8::Handle<v8::Value>, uint32_t& length, v8::Isolate*);
 | 
| @@ -676,17 +779,17 @@ Vector<RefPtr<T> > toRefPtrNativeArray(v8::Handle<v8::Value> value, const String
 | 
|  }
 | 
|  
 | 
|  template <class T, class V8T>
 | 
| -WillBeHeapVector<RefPtrWillBeMember<T> > toRefPtrWillBeMemberNativeArray(v8::Handle<v8::Value> value, int argumentIndex, v8::Isolate* isolate, bool* success = 0)
 | 
| +WillBeHeapVector<RefPtrWillBeMember<T> > toRefPtrWillBeMemberNativeArray(v8::Handle<v8::Value> value, int argumentIndex, v8::Isolate* isolate, ExceptionState* exceptionState = 0)
 | 
|  {
 | 
| -    if (success)
 | 
| -        *success = true;
 | 
| -
 | 
|      v8::Local<v8::Value> v8Value(v8::Local<v8::Value>::New(isolate, value));
 | 
|      uint32_t length = 0;
 | 
|      if (value->IsArray()) {
 | 
|          length = v8::Local<v8::Array>::Cast(v8Value)->Length();
 | 
|      } else if (toV8Sequence(value, length, isolate).IsEmpty()) {
 | 
| -        V8ThrowException::throwTypeError(ExceptionMessages::notAnArrayTypeArgumentOrValue(argumentIndex), isolate);
 | 
| +        if (exceptionState)
 | 
| +            exceptionState->throwTypeError(ExceptionMessages::notAnArrayTypeArgumentOrValue(argumentIndex));
 | 
| +        else
 | 
| +            V8ThrowException::throwTypeError(ExceptionMessages::notAnArrayTypeArgumentOrValue(argumentIndex), isolate);
 | 
|          return WillBeHeapVector<RefPtrWillBeMember<T> >();
 | 
|      }
 | 
|  
 | 
| @@ -699,9 +802,10 @@ WillBeHeapVector<RefPtrWillBeMember<T> > toRefPtrWillBeMemberNativeArray(v8::Han
 | 
|              v8::Handle<v8::Object> elementObject = v8::Handle<v8::Object>::Cast(element);
 | 
|              result.uncheckedAppend(V8T::toImpl(elementObject));
 | 
|          } else {
 | 
| -            if (success)
 | 
| -                *success = false;
 | 
| -            V8ThrowException::throwTypeError("Invalid Array element type", isolate);
 | 
| +            if (exceptionState)
 | 
| +                exceptionState->throwTypeError("Invalid Array element type");
 | 
| +            else
 | 
| +                V8ThrowException::throwTypeError("Invalid Array element type", isolate);
 | 
|              return WillBeHeapVector<RefPtrWillBeMember<T> >();
 | 
|          }
 | 
|      }
 | 
| @@ -709,17 +813,17 @@ WillBeHeapVector<RefPtrWillBeMember<T> > toRefPtrWillBeMemberNativeArray(v8::Han
 | 
|  }
 | 
|  
 | 
|  template <class T, class V8T>
 | 
| -WillBeHeapVector<RefPtrWillBeMember<T> > toRefPtrWillBeMemberNativeArray(v8::Handle<v8::Value> value, const String& propertyName, v8::Isolate* isolate, bool* success = 0)
 | 
| +WillBeHeapVector<RefPtrWillBeMember<T> > toRefPtrWillBeMemberNativeArray(v8::Handle<v8::Value> value, const String& propertyName, v8::Isolate* isolate, ExceptionState* exceptionState = 0)
 | 
|  {
 | 
| -    if (success)
 | 
| -        *success = true;
 | 
| -
 | 
|      v8::Local<v8::Value> v8Value(v8::Local<v8::Value>::New(isolate, value));
 | 
|      uint32_t length = 0;
 | 
|      if (value->IsArray()) {
 | 
|          length = v8::Local<v8::Array>::Cast(v8Value)->Length();
 | 
|      } else if (toV8Sequence(value, length, isolate).IsEmpty()) {
 | 
| -        V8ThrowException::throwTypeError(ExceptionMessages::notASequenceTypeProperty(propertyName), isolate);
 | 
| +        if (exceptionState)
 | 
| +            exceptionState->throwTypeError(ExceptionMessages::notASequenceTypeProperty(propertyName));
 | 
| +        else
 | 
| +            V8ThrowException::throwTypeError(ExceptionMessages::notASequenceTypeProperty(propertyName), isolate);
 | 
|          return WillBeHeapVector<RefPtrWillBeMember<T> >();
 | 
|      }
 | 
|  
 | 
| @@ -732,9 +836,10 @@ WillBeHeapVector<RefPtrWillBeMember<T> > toRefPtrWillBeMemberNativeArray(v8::Han
 | 
|              v8::Handle<v8::Object> elementObject = v8::Handle<v8::Object>::Cast(element);
 | 
|              result.uncheckedAppend(V8T::toImpl(elementObject));
 | 
|          } else {
 | 
| -            if (success)
 | 
| -                *success = false;
 | 
| -            V8ThrowException::throwTypeError("Invalid Array element type", isolate);
 | 
| +            if (exceptionState)
 | 
| +                exceptionState->throwTypeError("Invalid Array element type");
 | 
| +            else
 | 
| +                V8ThrowException::throwTypeError("Invalid Array element type", isolate);
 | 
|              return WillBeHeapVector<RefPtrWillBeMember<T> >();
 | 
|          }
 | 
|      }
 | 
| 
 |