diff options
Diffstat (limited to 'Source/JavaScriptCore/runtime/Error.cpp')
-rw-r--r-- | Source/JavaScriptCore/runtime/Error.cpp | 218 |
1 files changed, 49 insertions, 169 deletions
diff --git a/Source/JavaScriptCore/runtime/Error.cpp b/Source/JavaScriptCore/runtime/Error.cpp index 56219c449..a87be188a 100644 --- a/Source/JavaScriptCore/runtime/Error.cpp +++ b/Source/JavaScriptCore/runtime/Error.cpp @@ -34,7 +34,7 @@ #include "JSObject.h" #include "JSString.h" #include "NativeErrorConstructor.h" -#include "JSCInlines.h" +#include "Operations.h" #include "SourceCode.h" #include <wtf/text/StringBuilder.h> @@ -44,243 +44,123 @@ namespace JSC { static const char* linePropertyName = "line"; static const char* sourceURLPropertyName = "sourceURL"; -JSObject* createError(ExecState* exec, const String& message, ErrorInstance::SourceAppender appender) +JSObject* createError(JSGlobalObject* globalObject, const String& message) { ASSERT(!message.isEmpty()); - JSGlobalObject* globalObject = exec->lexicalGlobalObject(); - return ErrorInstance::create(exec, globalObject->vm(), globalObject->errorStructure(), message, appender, TypeNothing, true); + return ErrorInstance::create(globalObject->vm(), globalObject->errorStructure(), message); } -JSObject* createEvalError(ExecState* exec, const String& message, ErrorInstance::SourceAppender appender) +JSObject* createEvalError(JSGlobalObject* globalObject, const String& message) { ASSERT(!message.isEmpty()); - JSGlobalObject* globalObject = exec->lexicalGlobalObject(); - return ErrorInstance::create(exec, globalObject->vm(), globalObject->evalErrorConstructor()->errorStructure(), message, appender, TypeNothing, true); + return ErrorInstance::create(globalObject->vm(), globalObject->evalErrorConstructor()->errorStructure(), message); } -JSObject* createRangeError(ExecState* exec, const String& message, ErrorInstance::SourceAppender appender) +JSObject* createRangeError(JSGlobalObject* globalObject, const String& message) { ASSERT(!message.isEmpty()); - JSGlobalObject* globalObject = exec->lexicalGlobalObject(); - return ErrorInstance::create(exec, globalObject->vm(), globalObject->rangeErrorConstructor()->errorStructure(), message, appender, TypeNothing, true); + return ErrorInstance::create(globalObject->vm(), globalObject->rangeErrorConstructor()->errorStructure(), message); } -JSObject* createReferenceError(ExecState* exec, const String& message, ErrorInstance::SourceAppender appender) +JSObject* createReferenceError(JSGlobalObject* globalObject, const String& message) { ASSERT(!message.isEmpty()); - JSGlobalObject* globalObject = exec->lexicalGlobalObject(); - return ErrorInstance::create(exec, globalObject->vm(), globalObject->referenceErrorConstructor()->errorStructure(), message, appender, TypeNothing, true); + return ErrorInstance::create(globalObject->vm(), globalObject->referenceErrorConstructor()->errorStructure(), message); } -JSObject* createSyntaxError(ExecState* exec, const String& message, ErrorInstance::SourceAppender appender) +JSObject* createSyntaxError(JSGlobalObject* globalObject, const String& message) { ASSERT(!message.isEmpty()); - JSGlobalObject* globalObject = exec->lexicalGlobalObject(); - return ErrorInstance::create(exec, globalObject->vm(), globalObject->syntaxErrorConstructor()->errorStructure(), message, appender, TypeNothing, true); + return ErrorInstance::create(globalObject->vm(), globalObject->syntaxErrorConstructor()->errorStructure(), message); } -JSObject* createTypeError(ExecState* exec, const String& message, ErrorInstance::SourceAppender appender, RuntimeType type) +JSObject* createTypeError(JSGlobalObject* globalObject, const String& message) { ASSERT(!message.isEmpty()); - JSGlobalObject* globalObject = exec->lexicalGlobalObject(); - return ErrorInstance::create(exec, globalObject->vm(), globalObject->typeErrorConstructor()->errorStructure(), message, appender, type, true); + return ErrorInstance::create(globalObject->vm(), globalObject->typeErrorConstructor()->errorStructure(), message); } -JSObject* createNotEnoughArgumentsError(ExecState* exec, ErrorInstance::SourceAppender appender) +JSObject* createNotEnoughArgumentsError(JSGlobalObject* globalObject) { - return createTypeError(exec, ASCIILiteral("Not enough arguments"), appender, TypeNothing); + return createTypeError(globalObject, ASCIILiteral("Not enough arguments")); } -JSObject* createURIError(ExecState* exec, const String& message, ErrorInstance::SourceAppender appender) +JSObject* createURIError(JSGlobalObject* globalObject, const String& message) { ASSERT(!message.isEmpty()); - JSGlobalObject* globalObject = exec->lexicalGlobalObject(); - return ErrorInstance::create(exec, globalObject->vm(), globalObject->URIErrorConstructor()->errorStructure(), message, appender, TypeNothing, true); + return ErrorInstance::create(globalObject->vm(), globalObject->URIErrorConstructor()->errorStructure(), message); } -JSObject* createOutOfMemoryError(ExecState* exec, ErrorInstance::SourceAppender appender) -{ - return createError(exec, ASCIILiteral("Out of memory"), appender); -} - - -class FindFirstCallerFrameWithCodeblockFunctor { -public: - FindFirstCallerFrameWithCodeblockFunctor(CallFrame* startCallFrame) - : m_startCallFrame(startCallFrame) - , m_foundCallFrame(nullptr) - , m_foundStartCallFrame(false) - , m_index(0) - { } - - StackVisitor::Status operator()(StackVisitor& visitor) - { - if (!m_foundStartCallFrame && (visitor->callFrame() == m_startCallFrame)) - m_foundStartCallFrame = true; - - if (m_foundStartCallFrame) { - if (visitor->callFrame()->codeBlock()) { - m_foundCallFrame = visitor->callFrame(); - return StackVisitor::Done; - } - m_index++; - } - - return StackVisitor::Continue; - } - - CallFrame* foundCallFrame() const { return m_foundCallFrame; } - unsigned index() const { return m_index; } - -private: - CallFrame* m_startCallFrame; - CallFrame* m_foundCallFrame; - bool m_foundStartCallFrame; - unsigned m_index; -}; - -bool addErrorInfoAndGetBytecodeOffset(ExecState* exec, VM& vm, JSObject* obj, bool useCurrentFrame, CallFrame*& callFrame, unsigned &bytecodeOffset) -{ - Vector<StackFrame> stackTrace = Vector<StackFrame>(); - - if (exec && stackTrace.isEmpty()) - vm.interpreter->getStackTrace(stackTrace); - - if (!stackTrace.isEmpty()) { - - ASSERT(exec == vm.topCallFrame || exec == exec->lexicalGlobalObject()->globalExec() || exec == exec->vmEntryGlobalObject()->globalExec()); - - StackFrame* stackFrame; - for (unsigned i = 0 ; i < stackTrace.size(); ++i) { - stackFrame = &stackTrace.at(i); - if (stackFrame->bytecodeOffset) - break; - } - - if (bytecodeOffset) { - FindFirstCallerFrameWithCodeblockFunctor functor(exec); - vm.topCallFrame->iterate(functor); - callFrame = functor.foundCallFrame(); - unsigned stackIndex = functor.index(); - bytecodeOffset = stackTrace.at(stackIndex).bytecodeOffset; - } - - unsigned line; - unsigned column; - stackFrame->computeLineAndColumn(line, column); - obj->putDirect(vm, vm.propertyNames->line, jsNumber(line), ReadOnly | DontDelete); - obj->putDirect(vm, vm.propertyNames->column, jsNumber(column), ReadOnly | DontDelete); - - if (!stackFrame->sourceURL.isEmpty()) - obj->putDirect(vm, vm.propertyNames->sourceURL, jsString(&vm, stackFrame->sourceURL), ReadOnly | DontDelete); - - if (!useCurrentFrame) - stackTrace.remove(0); - obj->putDirect(vm, vm.propertyNames->stack, vm.interpreter->stackTraceAsString(vm.topCallFrame, stackTrace), DontEnum); - - return true; - } - return false; -} - -void addErrorInfo(ExecState* exec, JSObject* obj, bool useCurrentFrame) -{ - CallFrame* callFrame = nullptr; - unsigned bytecodeOffset = 0; - addErrorInfoAndGetBytecodeOffset(exec, exec->vm(), obj, useCurrentFrame, callFrame, bytecodeOffset); -} - -JSObject* addErrorInfo(CallFrame* callFrame, JSObject* error, int line, const SourceCode& source) -{ - VM* vm = &callFrame->vm(); - const String& sourceURL = source.provider()->url(); - - if (line != -1) - error->putDirect(*vm, Identifier::fromString(vm, linePropertyName), jsNumber(line), ReadOnly | DontDelete); - if (!sourceURL.isNull()) - error->putDirect(*vm, Identifier::fromString(vm, sourceURLPropertyName), jsString(vm, sourceURL), ReadOnly | DontDelete); - return error; -} - - -bool hasErrorInfo(ExecState* exec, JSObject* error) -{ - return error->hasProperty(exec, Identifier::fromString(exec, linePropertyName)) - || error->hasProperty(exec, Identifier::fromString(exec, sourceURLPropertyName)); -} - -JSObject* throwConstructorCannotBeCalledAsFunctionTypeError(ExecState* exec, const char* constructorName) +JSObject* createError(ExecState* exec, const String& message) { - return exec->vm().throwException(exec, createTypeError(exec, makeString("calling ", constructorName, " constructor without new is invalid"))); + return createError(exec->lexicalGlobalObject(), message); } -JSObject* throwTypeError(ExecState* exec) +JSObject* createEvalError(ExecState* exec, const String& message) { - return exec->vm().throwException(exec, createTypeError(exec)); + return createEvalError(exec->lexicalGlobalObject(), message); } -JSObject* throwSyntaxError(ExecState* exec) +JSObject* createRangeError(ExecState* exec, const String& message) { - return exec->vm().throwException(exec, createSyntaxError(exec, ASCIILiteral("Syntax error"))); + return createRangeError(exec->lexicalGlobalObject(), message); } -JSObject* throwSyntaxError(ExecState* exec, const String& message) +JSObject* createReferenceError(ExecState* exec, const String& message) { - return exec->vm().throwException(exec, createSyntaxError(exec, message)); + return createReferenceError(exec->lexicalGlobalObject(), message); } -JSObject* createError(ExecState* exec, const String& message) +JSObject* createSyntaxError(ExecState* exec, const String& message) { - return createError(exec, message, nullptr); + return createSyntaxError(exec->lexicalGlobalObject(), message); } -JSObject* createEvalError(ExecState* exec, const String& message) +JSObject* createTypeError(ExecState* exec, const String& message) { - return createEvalError(exec, message, nullptr); + return createTypeError(exec->lexicalGlobalObject(), message); } -JSObject* createRangeError(ExecState* exec, const String& message) +JSObject* createNotEnoughArgumentsError(ExecState* exec) { - return createRangeError(exec, message, nullptr); + return createNotEnoughArgumentsError(exec->lexicalGlobalObject()); } -JSObject* createReferenceError(ExecState* exec, const String& message) +JSObject* createURIError(ExecState* exec, const String& message) { - return createReferenceError(exec, message, nullptr); + return createURIError(exec->lexicalGlobalObject(), message); } -JSObject* createSyntaxError(ExecState* exec, const String& message) +JSObject* addErrorInfo(CallFrame* callFrame, JSObject* error, int line, const SourceCode& source) { - return createSyntaxError(exec, message, nullptr); -} + VM* vm = &callFrame->vm(); + const String& sourceURL = source.provider()->url(); -JSObject* createTypeError(ExecState* exec) -{ - return createTypeError(exec, ASCIILiteral("Type error")); + if (line != -1) + error->putDirect(*vm, Identifier(vm, linePropertyName), jsNumber(line), ReadOnly | DontDelete); + if (!sourceURL.isNull()) + error->putDirect(*vm, Identifier(vm, sourceURLPropertyName), jsString(vm, sourceURL), ReadOnly | DontDelete); + return error; } -JSObject* createTypeError(ExecState* exec, const String& message) -{ - return createTypeError(exec, message, nullptr, TypeNothing); -} -JSObject* createNotEnoughArgumentsError(ExecState* exec) +bool hasErrorInfo(ExecState* exec, JSObject* error) { - return createNotEnoughArgumentsError(exec, nullptr); + return error->hasProperty(exec, Identifier(exec, linePropertyName)) + || error->hasProperty(exec, Identifier(exec, sourceURLPropertyName)); } -JSObject* createURIError(ExecState* exec, const String& message) +JSObject* throwTypeError(ExecState* exec) { - return createURIError(exec, message, nullptr); + return exec->vm().throwException(exec, createTypeError(exec, ASCIILiteral("Type error"))); } -JSObject* createOutOfMemoryError(ExecState* exec) +JSObject* throwSyntaxError(ExecState* exec) { - return createOutOfMemoryError(exec, nullptr); + return exec->vm().throwException(exec, createSyntaxError(exec, ASCIILiteral("Syntax error"))); } - -const ClassInfo StrictModeTypeErrorFunction::s_info = { "Function", &Base::s_info, 0, CREATE_METHOD_TABLE(StrictModeTypeErrorFunction) }; +const ClassInfo StrictModeTypeErrorFunction::s_info = { "Function", &Base::s_info, 0, 0, CREATE_METHOD_TABLE(StrictModeTypeErrorFunction) }; void StrictModeTypeErrorFunction::destroy(JSCell* cell) { |