Chromium Code Reviews| Index: Source/bindings/core/v8/custom/V8WebGLRenderingContextCustom.cpp |
| diff --git a/Source/bindings/core/v8/custom/V8WebGLRenderingContextCustom.cpp b/Source/bindings/core/v8/custom/V8WebGLRenderingContextCustom.cpp |
| index cf7a3e4ba387949bf347385b6f7adbf7e7f05b2c..003ab694a6274491cbf691d8591ec1d2e8062c58 100644 |
| --- a/Source/bindings/core/v8/custom/V8WebGLRenderingContextCustom.cpp |
| +++ b/Source/bindings/core/v8/custom/V8WebGLRenderingContextCustom.cpp |
| @@ -292,12 +292,14 @@ static void getObjectParameter(const v8::FunctionCallbackInfo<v8::Value>& info, |
| } |
| WebGLRenderingContext* context = V8WebGLRenderingContext::toNative(info.Holder()); |
| - unsigned target = toInt32(info[0], exceptionState); |
|
Jens Widell
2014/07/11 12:24:30
These uses of toInt32() shared a common problem: i
|
| - if (exceptionState.throwIfNeeded()) |
| - return; |
| - unsigned pname = toInt32(info[1], exceptionState); |
| - if (exceptionState.throwIfNeeded()) |
| - return; |
| + unsigned target; |
| + unsigned pname; |
| + { |
| + v8::TryCatch block; |
| + V8RethrowTryCatchScope rethrow(block); |
| + TONATIVE_VOID_EXCEPTIONSTATE_INTERNAL(target, toUInt32(info[0], exceptionState), exceptionState); |
| + TONATIVE_VOID_EXCEPTIONSTATE_INTERNAL(pname, toUInt32(info[1], exceptionState), exceptionState); |
| + } |
| WebGLGetInfo args; |
| switch (objectType) { |
| case kBuffer: |
| @@ -388,13 +390,16 @@ void V8WebGLRenderingContext::getFramebufferAttachmentParameterMethodCustom(cons |
| } |
| WebGLRenderingContext* context = V8WebGLRenderingContext::toNative(info.Holder()); |
| - unsigned target = toInt32(info[0]); |
| - unsigned attachment = toInt32(info[1], exceptionState); |
| - if (exceptionState.throwIfNeeded()) |
| - return; |
| - unsigned pname = toInt32(info[2], exceptionState); |
| - if (exceptionState.throwIfNeeded()) |
| - return; |
| + unsigned target; |
| + unsigned attachment; |
| + unsigned pname; |
| + { |
| + v8::TryCatch block; |
| + V8RethrowTryCatchScope rethrow(block); |
| + TONATIVE_VOID_EXCEPTIONSTATE_INTERNAL(target, toUInt32(info[0], exceptionState), exceptionState); |
| + TONATIVE_VOID_EXCEPTIONSTATE_INTERNAL(attachment, toUInt32(info[1], exceptionState), exceptionState); |
| + TONATIVE_VOID_EXCEPTIONSTATE_INTERNAL(pname, toUInt32(info[2], exceptionState), exceptionState); |
| + } |
| WebGLGetInfo args = context->getFramebufferAttachmentParameter(target, attachment, pname); |
| v8SetReturnValue(info, toV8Object(args, info.Holder(), info.GetIsolate())); |
| } |
| @@ -409,9 +414,12 @@ void V8WebGLRenderingContext::getParameterMethodCustom(const v8::FunctionCallbac |
| } |
| WebGLRenderingContext* context = V8WebGLRenderingContext::toNative(info.Holder()); |
| - unsigned pname = toInt32(info[0], exceptionState); |
| - if (exceptionState.throwIfNeeded()) |
| - return; |
| + unsigned pname; |
| + { |
| + v8::TryCatch block; |
| + V8RethrowTryCatchScope rethrow(block); |
| + TONATIVE_VOID_EXCEPTIONSTATE_INTERNAL(pname, toUInt32(info[0], exceptionState), exceptionState); |
| + } |
| WebGLGetInfo args = context->getParameter(pname); |
| v8SetReturnValue(info, toV8Object(args, info.Holder(), info.GetIsolate())); |
| } |
| @@ -425,17 +433,20 @@ void V8WebGLRenderingContext::getProgramParameterMethodCustom(const v8::Function |
| return; |
| } |
| - const int programArgumentIndex = 0; |
| WebGLRenderingContext* context = V8WebGLRenderingContext::toNative(info.Holder()); |
| - if (info.Length() > 0 && !isUndefinedOrNull(info[programArgumentIndex]) && !V8WebGLProgram::hasInstance(info[programArgumentIndex], info.GetIsolate())) { |
| - exceptionState.throwTypeError(ExceptionMessages::argumentNullOrIncorrectType(programArgumentIndex + 1, "WebGLProgram")); |
| - exceptionState.throwIfNeeded(); |
| - return; |
| + WebGLProgram* program; |
| + unsigned pname; |
| + { |
| + v8::TryCatch block; |
| + V8RethrowTryCatchScope rethrow(block); |
| + if (info.Length() > 0 && !isUndefinedOrNull(info[0]) && !V8WebGLProgram::hasInstance(info[0], info.GetIsolate())) { |
| + exceptionState.throwTypeError("parameter 1 is not of type 'WebGLProgram'."); |
| + exceptionState.throwIfNeeded(); |
| + return; |
| + } |
| + TONATIVE_VOID_INTERNAL(program, V8WebGLProgram::toNativeWithTypeCheck(info.GetIsolate(), info[0])); |
| + TONATIVE_VOID_EXCEPTIONSTATE_INTERNAL(pname, toUInt32(info[1], exceptionState), exceptionState); |
| } |
| - WebGLProgram* program = V8WebGLProgram::toNativeWithTypeCheck(info.GetIsolate(), info[programArgumentIndex]); |
| - unsigned pname = toInt32(info[1], exceptionState); |
| - if (exceptionState.throwIfNeeded()) |
| - return; |
| WebGLGetInfo args = context->getProgramParameter(program, pname); |
| v8SetReturnValue(info, toV8Object(args, info.Holder(), info.GetIsolate())); |
| } |
| @@ -455,17 +466,20 @@ void V8WebGLRenderingContext::getShaderParameterMethodCustom(const v8::FunctionC |
| return; |
| } |
| - const int shaderArgumentIndex = 0; |
| WebGLRenderingContext* context = V8WebGLRenderingContext::toNative(info.Holder()); |
| - if (info.Length() > 0 && !isUndefinedOrNull(info[shaderArgumentIndex]) && !V8WebGLShader::hasInstance(info[shaderArgumentIndex], info.GetIsolate())) { |
| - exceptionState.throwTypeError(ExceptionMessages::argumentNullOrIncorrectType(shaderArgumentIndex + 1, "WebGLShader")); |
| - exceptionState.throwIfNeeded(); |
| - return; |
| + WebGLShader* shader; |
| + unsigned pname; |
| + { |
| + v8::TryCatch block; |
| + V8RethrowTryCatchScope rethrow(block); |
| + if (info.Length() > 0 && !isUndefinedOrNull(info[0]) && !V8WebGLShader::hasInstance(info[0], info.GetIsolate())) { |
| + exceptionState.throwTypeError("parameter 1 is not of type 'WebGLShader'."); |
| + exceptionState.throwIfNeeded(); |
| + return; |
| + } |
| + TONATIVE_VOID_INTERNAL(shader, V8WebGLShader::toNativeWithTypeCheck(info.GetIsolate(), info[0])); |
| + TONATIVE_VOID_EXCEPTIONSTATE_INTERNAL(pname, toUInt32(info[1], exceptionState), exceptionState); |
| } |
| - WebGLShader* shader = V8WebGLShader::toNativeWithTypeCheck(info.GetIsolate(), info[shaderArgumentIndex]); |
| - unsigned pname = toInt32(info[1], exceptionState); |
| - if (exceptionState.throwIfNeeded()) |
| - return; |
| WebGLGetInfo args = context->getShaderParameter(shader, pname); |
| v8SetReturnValue(info, toV8Object(args, info.Holder(), info.GetIsolate())); |
| } |
| @@ -485,24 +499,23 @@ void V8WebGLRenderingContext::getUniformMethodCustom(const v8::FunctionCallbackI |
| return; |
| } |
| - const int programArgumentIndex = 0; |
| WebGLRenderingContext* context = V8WebGLRenderingContext::toNative(info.Holder()); |
| - if (info.Length() > 0 && !isUndefinedOrNull(info[programArgumentIndex]) && !V8WebGLProgram::hasInstance(info[programArgumentIndex], info.GetIsolate())) { |
| - exceptionState.throwTypeError(ExceptionMessages::argumentNullOrIncorrectType(programArgumentIndex + 1, "WebGLProgram")); |
| - exceptionState.throwIfNeeded(); |
| - return; |
| - } |
| - WebGLProgram* program = V8WebGLProgram::toNativeWithTypeCheck(info.GetIsolate(), info[programArgumentIndex]); |
| - |
| - const int uniformArgumentIndex = 1; |
| - if (info.Length() > 1 && !isUndefinedOrNull(info[uniformArgumentIndex]) && !V8WebGLUniformLocation::hasInstance(info[uniformArgumentIndex], info.GetIsolate())) { |
| - exceptionState.throwTypeError(ExceptionMessages::argumentNullOrIncorrectType(uniformArgumentIndex + 1, "WebGLUniformLocation")); |
| - exceptionState.throwIfNeeded(); |
| - return; |
| + WebGLProgram* program; |
| + WebGLUniformLocation* location; |
| + { |
| + v8::TryCatch block; |
| + V8RethrowTryCatchScope rethrow(block); |
| + if (info.Length() > 0 && !isUndefinedOrNull(info[0]) && !V8WebGLProgram::hasInstance(info[0], info.GetIsolate())) { |
| + throwTypeError(ExceptionMessages::failedToExecute("getUniform", "WebGLRenderingContext", "parameter 1 is not of type 'WebGLProgram'."), info.GetIsolate()); |
| + return; |
| + } |
| + TONATIVE_VOID_INTERNAL(program, V8WebGLProgram::toNativeWithTypeCheck(info.GetIsolate(), info[0])); |
| + if (info.Length() > 1 && !isUndefinedOrNull(info[1]) && !V8WebGLUniformLocation::hasInstance(info[1], info.GetIsolate())) { |
| + throwTypeError(ExceptionMessages::failedToExecute("getUniform", "WebGLRenderingContext", "parameter 2 is not of type 'WebGLUniformLocation'."), info.GetIsolate()); |
| + return; |
| + } |
| + TONATIVE_VOID_INTERNAL(location, V8WebGLUniformLocation::toNativeWithTypeCheck(info.GetIsolate(), info[1])); |
| } |
| - const int uniformLocationArgumentIndex = 1; |
| - WebGLUniformLocation* location = toWebGLUniformLocation(info[uniformLocationArgumentIndex], info.GetIsolate()); |
| - |
| WebGLGetInfo args = context->getUniform(program, location); |
| v8SetReturnValue(info, toV8Object(args, info.Holder(), info.GetIsolate())); |
| } |