Changeset 154797 in webkit for trunk/Source/JavaScriptCore/API


Ignore:
Timestamp:
Aug 28, 2013, 5:28:42 PM (12 years ago)
Author:
[email protected]
Message:

Source/JavaScriptCore: https://bugs.webkit.org/show_bug.cgi?id=119548
Refactoring Exception throws.

Patch by Chris Curtis <[email protected]> on 2013-08-28
Reviewed by Geoffrey Garen.

Gardening of exception throws. The act of throwing an exception was being handled in
different ways depending on whether the code was running in the LLint, Baseline JIT,
or the DFG Jit. This made development in the vm exception and error objects difficult.

  • runtime/VM.cpp:

(JSC::appendSourceToError):
This function moved from the interpreter into the VM. It views the developers code
(if there is a codeBlock) to extract what was trying to be evaluated when the error
occurred.

(JSC::VM::throwException):
This function takes in the error object and sets the following:

1: The VM's exception stack
2: The VM's exception
3: Appends extra information on the error message(via appendSourceToError)
4: The error object's line number
5: The error object's column number
6: The error object's sourceURL
7: The error object's stack trace (unless it already exists because the developer

created the error object).

(JSC::VM::getExceptionInfo):
(JSC::VM::setExceptionInfo):
(JSC::VM::clearException):
(JSC::clearExceptionStack):

  • runtime/VM.h:

(JSC::VM::exceptionOffset):
(JSC::VM::exception):
(JSC::VM::addressOfException):
(JSC::VM::exceptionStack):
VM exception and exceptionStack are now private data members.

  • interpreter/Interpreter.h:

(JSC::ClearExceptionScope::ClearExceptionScope):
Created this structure to temporarily clear the exception within the VM. This
needed to see if addition errors occur when setting the debugger as we are
unwinding the stack.

  • interpreter/Interpreter.cpp:

(JSC::Interpreter::unwind):
Removed the code that would try to add error information if it did not exist.
All of this functionality has moved into the VM and all error information is set
at the time the error occurs.

The rest of these functions reference the new calling convention to throw an error.

  • API/APICallbackFunction.h:

(JSC::APICallbackFunction::call):

  • API/JSCallbackConstructor.cpp:

(JSC::constructJSCallback):

  • API/JSCallbackObjectFunctions.h:

(JSC::::getOwnPropertySlot):
(JSC::::defaultValue):
(JSC::::put):
(JSC::::putByIndex):
(JSC::::deleteProperty):
(JSC::::construct):
(JSC::::customHasInstance):
(JSC::::call):
(JSC::::getStaticValue):
(JSC::::staticFunctionGetter):
(JSC::::callbackGetter):

  • debugger/Debugger.cpp:

(JSC::evaluateInGlobalCallFrame):

  • debugger/DebuggerCallFrame.cpp:

(JSC::DebuggerCallFrame::evaluate):

  • dfg/DFGAssemblyHelpers.h:

(JSC::DFG::AssemblyHelpers::emitExceptionCheck):

  • dfg/DFGOperations.cpp:

(JSC::DFG::operationPutByValInternal):

  • ftl/FTLLowerDFGToLLVM.cpp:

(JSC::FTL::LowerDFGToLLVM::callCheck):

  • heap/Heap.cpp:

(JSC::Heap::markRoots):

  • interpreter/CallFrame.h:

(JSC::ExecState::clearException):
(JSC::ExecState::exception):
(JSC::ExecState::hadException):

  • interpreter/Interpreter.cpp:

(JSC::eval):
(JSC::loadVarargs):
(JSC::stackTraceAsString):
(JSC::Interpreter::execute):
(JSC::Interpreter::executeCall):
(JSC::Interpreter::executeConstruct):
(JSC::Interpreter::prepareForRepeatCall):

  • interpreter/Interpreter.h:

(JSC::ClearExceptionScope::ClearExceptionScope):

  • jit/JITCode.cpp:

(JSC::JITCode::execute):

  • jit/JITExceptions.cpp:

(JSC::genericThrow):

  • jit/JITOpcodes.cpp:

(JSC::JIT::emit_op_catch):

  • jit/JITOpcodes32_64.cpp:

(JSC::JIT::privateCompileCTINativeCall):
(JSC::JIT::emit_op_catch):

  • jit/JITStubs.cpp:

(JSC::returnToThrowTrampoline):
(JSC::throwExceptionFromOpCall):
(JSC::DEFINE_STUB_FUNCTION):
(JSC::jitCompileFor):
(JSC::lazyLinkFor):
(JSC::putByVal):
(JSC::cti_vm_handle_exception):

  • jit/SlowPathCall.h:

(JSC::JITSlowPathCall::call):

  • jit/ThunkGenerators.cpp:

(JSC::nativeForGenerator):

  • jsc.cpp:

(functionRun):
(functionLoad):
(functionCheckSyntax):

  • llint/LLIntExceptions.cpp:

(JSC::LLInt::doThrow):
(JSC::LLInt::returnToThrow):
(JSC::LLInt::callToThrow):

  • llint/LLIntSlowPaths.cpp:

(JSC::LLInt::LLINT_SLOW_PATH_DECL):

  • llint/LowLevelInterpreter.cpp:

(JSC::CLoop::execute):

  • llint/LowLevelInterpreter32_64.asm:
  • llint/LowLevelInterpreter64.asm:
  • runtime/ArrayConstructor.cpp:

(JSC::constructArrayWithSizeQuirk):

  • runtime/CommonSlowPaths.cpp:

(JSC::SLOW_PATH_DECL):

  • runtime/CommonSlowPaths.h:

(JSC::CommonSlowPaths::opIn):

  • runtime/CommonSlowPathsExceptions.cpp:

(JSC::CommonSlowPaths::interpreterThrowInCaller):

  • runtime/Completion.cpp:

(JSC::evaluate):

  • runtime/Error.cpp:

(JSC::addErrorInfo):
(JSC::throwTypeError):
(JSC::throwSyntaxError):

  • runtime/Error.h:

(JSC::throwVMError):

  • runtime/ExceptionHelpers.cpp:

(JSC::throwOutOfMemoryError):
(JSC::throwStackOverflowError):
(JSC::throwTerminatedExecutionException):

  • runtime/Executable.cpp:

(JSC::EvalExecutable::create):
(JSC::FunctionExecutable::produceCodeBlockFor):

  • runtime/FunctionConstructor.cpp:

(JSC::constructFunction):
(JSC::constructFunctionSkippingEvalEnabledCheck):

  • runtime/JSArray.cpp:

(JSC::JSArray::defineOwnProperty):
(JSC::JSArray::put):
(JSC::JSArray::push):

  • runtime/JSCJSValue.cpp:

(JSC::JSValue::toObjectSlowCase):
(JSC::JSValue::synthesizePrototype):
(JSC::JSValue::putToPrimitive):

  • runtime/JSFunction.cpp:

(JSC::JSFunction::defineOwnProperty):

  • runtime/JSGenericTypedArrayViewInlines.h:

(JSC::::create):
(JSC::::createUninitialized):
(JSC::::validateRange):
(JSC::::setWithSpecificType):

  • runtime/JSGlobalObjectFunctions.cpp:

(JSC::encode):
(JSC::decode):
(JSC::globalFuncProtoSetter):

  • runtime/JSNameScope.cpp:

(JSC::JSNameScope::put):

  • runtime/JSONObject.cpp:

(JSC::Stringifier::appendStringifiedValue):
(JSC::Walker::walk):

  • runtime/JSObject.cpp:

(JSC::JSObject::put):
(JSC::JSObject::defaultValue):
(JSC::JSObject::hasInstance):
(JSC::JSObject::defaultHasInstance):
(JSC::JSObject::defineOwnNonIndexProperty):
(JSC::throwTypeError):

  • runtime/ObjectConstructor.cpp:

(JSC::toPropertyDescriptor):

  • runtime/RegExpConstructor.cpp:

(JSC::constructRegExp):

  • runtime/StringObject.cpp:

(JSC::StringObject::defineOwnProperty):

  • runtime/StringRecursionChecker.cpp:

(JSC::StringRecursionChecker::throwStackOverflowError):

Source/WebCore: https://bugs.webkit.org/show_bug.cgi?id=119548
Refactoring Exception throws.

Patch by Chris Curtis <[email protected]> on 2013-08-28
Reviewed by Geoffrey Garen.

Gets column information from the error object for reporting exceptions.

  • bindings/js/JSDOMBinding.cpp:

(WebCore::reportException):

  • bindings/js/ScriptCallStackFactory.cpp:

(WebCore::createScriptCallStackFromException):

Moved setting an exception into the vm, These functions changed to use the new functionality.

  • bindings/js/JSAudioBufferSourceNodeCustom.cpp:

(WebCore::JSAudioBufferSourceNode::setBuffer):

  • bindings/js/JSBiquadFilterNodeCustom.cpp:

(WebCore::JSBiquadFilterNode::setType):

  • bindings/js/JSCryptoCustom.cpp:

(WebCore::JSCrypto::getRandomValues):

  • bindings/js/JSDOMBinding.cpp:

(WebCore::setDOMException):

  • bindings/js/JSInjectedScriptHostCustom.cpp:

(WebCore::JSInjectedScriptHost::setFunctionVariableValue):

  • bindings/js/JSJavaScriptCallFrameCustom.cpp:

(WebCore::JSJavaScriptCallFrame::evaluate):
(WebCore::JSJavaScriptCallFrame::setVariableValue):

  • bindings/js/JSNodeFilterCondition.cpp:

(WebCore::JSNodeFilterCondition::acceptNode):

  • bindings/js/JSOscillatorNodeCustom.cpp:

(WebCore::JSOscillatorNode::setType):

  • bindings/js/JSPannerNodeCustom.cpp:

(WebCore::JSPannerNode::setPanningModel):
(WebCore::JSPannerNode::setDistanceModel):

  • bindings/js/JSSVGLengthCustom.cpp:

(WebCore::JSSVGLength::convertToSpecifiedUnits):

  • bindings/js/JSWebGLRenderingContextCustom.cpp:

(WebCore::getObjectParameter):
(WebCore::JSWebGLRenderingContext::getAttachedShaders):
(WebCore::JSWebGLRenderingContext::getExtension):
(WebCore::JSWebGLRenderingContext::getFramebufferAttachmentParameter):
(WebCore::JSWebGLRenderingContext::getParameter):
(WebCore::JSWebGLRenderingContext::getProgramParameter):
(WebCore::JSWebGLRenderingContext::getShaderParameter):
(WebCore::JSWebGLRenderingContext::getUniform):
(WebCore::dataFunctionf):
(WebCore::dataFunctioni):
(WebCore::dataFunctionMatrix):

  • bindings/js/JSXMLHttpRequestCustom.cpp:

(WebCore::JSXMLHttpRequest::open):

  • bindings/js/SerializedScriptValue.cpp:

(WebCore::CloneBase::throwStackOverflow):
(WebCore::CloneDeserializer::throwValidationError):
(WebCore::SerializedScriptValue::maybeThrowExceptionIfSerializationFailed):

  • bindings/js/WorkerScriptController.cpp:

(WebCore::WorkerScriptController::evaluate):
(WebCore::WorkerScriptController::setException):

  • bridge/c/c_instance.cpp:

(JSC::Bindings::CInstance::moveGlobalExceptionToExecState):
(JSC::Bindings::CInstance::invokeMethod):
(JSC::Bindings::CInstance::invokeDefaultMethod):
(JSC::Bindings::CInstance::invokeConstruct):
(JSC::Bindings::CInstance::toJSPrimitive):

  • bridge/objc/objc_instance.mm:

(ObjcInstance::invokeMethod):

  • bridge/objc/objc_runtime.mm:

(JSC::Bindings::ObjcArray::setValueAt):
(JSC::Bindings::ObjcArray::valueAt):

  • bridge/objc/objc_utility.mm:

(JSC::Bindings::throwError):

  • bridge/qt/qt_instance.cpp:

(JSC::Bindings::QtField::valueFromInstance):
(JSC::Bindings::QtField::setValueToInstance):

  • bridge/runtime_array.cpp:

(JSC::RuntimeArray::put):
(JSC::RuntimeArray::putByIndex):

  • bridge/runtime_object.cpp:

(JSC::Bindings::RuntimeObject::throwInvalidAccessError):

Source/WebKit/mac: https://bugs.webkit.org/show_bug.cgi?id=119548
Refactoring Exception throws.

Patch by Chris Curtis <[email protected]> on 2013-08-28
Reviewed by Geoffrey Garen.

Moved setting an exception into the vm, These functions changed to use the new functionality.

  • Plugins/Hosted/NetscapePluginInstanceProxy.mm:

(WebKit::NetscapePluginInstanceProxy::moveGlobalExceptionToExecState):

  • Plugins/Hosted/ProxyInstance.mm:

(WebKit::ProxyInstance::invokeMethod):

Source/WebKit2: https://bugs.webkit.org/show_bug.cgi?id=119548
Refactoring Exception throws.

Patch by Chris Curtis <[email protected]> on 2013-08-28
Reviewed by Geoffrey Garen.

Moved setting an exception into the vm, These functions changed to use the new functionality.

  • WebProcess/Plugins/Netscape/JSNPObject.cpp:

(WebKit::JSNPObject::callMethod):
(WebKit::JSNPObject::callObject):
(WebKit::JSNPObject::callConstructor):
(WebKit::JSNPObject::throwInvalidAccessError):

  • WebProcess/Plugins/Netscape/NPRuntimeObjectMap.cpp:

(WebKit::NPRuntimeObjectMap::moveGlobalExceptionToExecState):

LayoutTests: https://bugs.webkit.org/show_bug.cgi?id=119548
Refactoring Exception throws.

Patch by Chris Curtis <[email protected]> on 2013-08-28
Reviewed by Geoffrey Garen.

Column/line information was added into these results.

  • fast/events/window-onerror4-expected.txt:
  • fast/js/global-recursion-on-full-stack-expected.txt:

fixed a variable name in a case when shouldThrowType failed.

  • fast/js/mozilla/resources/js-test-pre.js:

(shouldThrowType):

Sorted the properties to allow the results always show in the same order.

  • fast/js/script-tests/exception-properties.js:
  • fast/js/exception-properties-expected.txt:

This test needed to be modified to have the line numbers match on the output across
wk and wk2. This test is inherently flaky because is relies on size of the available
native stack. To account for the flakiness an additional call was made to force the
results to match.
This patch now records and outputs the line number where the errors were occurring.
This was causing the test results to no longer match because of the line numbers.
By changing how to account for the flakiness, the results match again.

  • fast/xmlhttprequest/xmlhttprequest-recursive-sync-event-expected.txt:
  • fast/xmlhttprequest/xmlhttprequest-recursive-sync-event.html:
Location:
trunk/Source/JavaScriptCore/API
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/API/APICallbackFunction.h

    r153334 r154797  
    6060    }
    6161    if (exception)
    62         throwError(exec, toJS(exec, exception));
     62        exec->vm().throwException(exec, toJS(exec, exception));
    6363
    6464    // result must be a valid JSValue.
  • trunk/Source/JavaScriptCore/API/JSCallbackConstructor.cpp

    r154038 r154797  
    8787        }
    8888        if (exception)
    89             throwError(exec, toJS(exec, exception));
     89            exec->vm().throwException(exec, toJS(exec, exception));
    9090        // result must be a valid JSValue.
    9191        if (!result)
  • trunk/Source/JavaScriptCore/API/JSCallbackObjectFunctions.h

    r154373 r154797  
    151151                }
    152152                if (exception) {
    153                     throwError(exec, toJS(exec, exception));
     153                    exec->vm().throwException(exec, toJS(exec, exception));
    154154                    slot.setValue(thisObject, ReadOnly | DontEnum, jsUndefined());
    155155                    return true;
     
    202202            JSValueRef result = convertToType(ctx, thisRef, jsHint, &exception);
    203203            if (exception) {
    204                 throwError(exec, toJS(exec, exception));
     204                exec->vm().throwException(exec, toJS(exec, exception));
    205205                return jsUndefined();
    206206            }
     
    234234                }
    235235                if (exception)
    236                     throwError(exec, toJS(exec, exception));
     236                    exec->vm().throwException(exec, toJS(exec, exception));
    237237                if (result || exception)
    238238                    return;
     
    251251                        }
    252252                        if (exception)
    253                             throwError(exec, toJS(exec, exception));
     253                            exec->vm().throwException(exec, toJS(exec, exception));
    254254                        if (result || exception)
    255255                            return;
     
    293293            }
    294294            if (exception)
    295                 throwError(exec, toJS(exec, exception));
     295                exec->vm().throwException(exec, toJS(exec, exception));
    296296            if (result || exception)
    297297                return;
     
    310310                    }
    311311                    if (exception)
    312                         throwError(exec, toJS(exec, exception));
     312                        exec->vm().throwException(exec, toJS(exec, exception));
    313313                    if (result || exception)
    314314                        return;
     
    349349                }
    350350                if (exception)
    351                     throwError(exec, toJS(exec, exception));
     351                    exec->vm().throwException(exec, toJS(exec, exception));
    352352                if (result || exception)
    353353                    return true;
     
    416416            }
    417417            if (exception)
    418                 throwError(exec, toJS(exec, exception));
     418                exec->vm().throwException(exec, toJS(exec, exception));
    419419            return JSValue::encode(result);
    420420        }
     
    442442            }
    443443            if (exception)
    444                 throwError(exec, toJS(exec, exception));
     444                exec->vm().throwException(exec, toJS(exec, exception));
    445445            return result;
    446446        }
     
    483483            }
    484484            if (exception)
    485                 throwError(exec, toJS(exec, exception));
     485                exec->vm().throwException(exec, toJS(exec, exception));
    486486            return JSValue::encode(result);
    487487        }
     
    570570                        }
    571571                        if (exception) {
    572                             throwError(exec, toJS(exec, exception));
     572                            exec->vm().throwException(exec, toJS(exec, exception));
    573573                            return jsUndefined();
    574574                        }
     
    609609    }
    610610
    611     return throwError(exec, createReferenceError(exec, ASCIILiteral("Static function property defined with NULL callAsFunction callback.")));
     611    return exec->vm().throwException(exec, createReferenceError(exec, ASCIILiteral("Static function property defined with NULL callAsFunction callback.")));
    612612}
    613613
     
    632632                }
    633633                if (exception) {
    634                     throwError(exec, toJS(exec, exception));
     634                    exec->vm().throwException(exec, toJS(exec, exception));
    635635                    return jsUndefined();
    636636                }
     
    641641    }
    642642
    643     return throwError(exec, createReferenceError(exec, ASCIILiteral("hasProperty callback returned true for a property that doesn't exist.")));
     643    return exec->vm().throwException(exec, createReferenceError(exec, ASCIILiteral("hasProperty callback returned true for a property that doesn't exist.")));
    644644}
    645645
Note: See TracChangeset for help on using the changeset viewer.