X-Git-Url: https://git.saurik.com/apple/javascriptcore.git/blobdiff_plain/6fe7ccc865dc7d7541b93c5bcaf6368d2c98a174..refs/heads/master:/runtime/ErrorInstance.h diff --git a/runtime/ErrorInstance.h b/runtime/ErrorInstance.h index d6fa32f..3f584a9 100644 --- a/runtime/ErrorInstance.h +++ b/runtime/ErrorInstance.h @@ -21,50 +21,59 @@ #ifndef ErrorInstance_h #define ErrorInstance_h -#include "JSObject.h" +#include "Interpreter.h" +#include "RuntimeType.h" +#include "SourceProvider.h" +#include namespace JSC { - class ErrorInstance : public JSNonFinalObject { - public: - typedef JSNonFinalObject Base; - - static const ClassInfo s_info; - - static Structure* createStructure(JSGlobalData& globalData, JSGlobalObject* globalObject, JSValue prototype) - { - return Structure::create(globalData, globalObject, prototype, TypeInfo(ErrorInstanceType, StructureFlags), &s_info); - } - - static ErrorInstance* create(JSGlobalData& globalData, Structure* structure, const UString& message) - { - ErrorInstance* instance = new (NotNull, allocateCell(globalData.heap)) ErrorInstance(globalData, structure); - instance->finishCreation(globalData, message); - return instance; - } - - static ErrorInstance* create(ExecState* exec, Structure* structure, JSValue message) - { - return create(exec->globalData(), structure, message.isUndefined() ? UString() : message.toString(exec)->value(exec)); - } - - bool appendSourceToMessage() { return m_appendSourceToMessage; } - void setAppendSourceToMessage() { m_appendSourceToMessage = true; } - void clearAppendSourceToMessage() { m_appendSourceToMessage = false; } - - protected: - explicit ErrorInstance(JSGlobalData&, Structure*); - - void finishCreation(JSGlobalData& globalData, const UString& message) - { - Base::finishCreation(globalData); - ASSERT(inherits(&s_info)); - if (!message.isNull()) - putDirect(globalData, globalData.propertyNames->message, jsString(&globalData, message), DontEnum); - } - - bool m_appendSourceToMessage; - }; +class ErrorInstance : public JSNonFinalObject { +public: + typedef JSNonFinalObject Base; + + enum SourceTextWhereErrorOccurred { FoundExactSource, FoundApproximateSource }; + typedef String (*SourceAppender) (const String& originalMessage, const String& sourceText, RuntimeType, SourceTextWhereErrorOccurred); + + DECLARE_INFO; + + static Structure* createStructure(VM& vm, JSGlobalObject* globalObject, JSValue prototype) + { + return Structure::create(vm, globalObject, prototype, TypeInfo(ErrorInstanceType, StructureFlags), info()); + } + + static ErrorInstance* create(ExecState* exec, VM& vm, Structure* structure, const String& message, SourceAppender appender = nullptr, RuntimeType type = TypeNothing, bool useCurrentFrame = true) + { + ErrorInstance* instance = new (NotNull, allocateCell(vm.heap)) ErrorInstance(vm, structure); + instance->m_sourceAppender = appender; + instance->m_runtimeTypeForCause = type; + instance->finishCreation(exec, vm, message, useCurrentFrame); + return instance; + } + + static ErrorInstance* create(ExecState* exec, Structure* structure, JSValue message, SourceAppender appender = nullptr, RuntimeType type = TypeNothing, bool useCurrentFrame = true) + { + return create(exec, exec->vm(), structure, message.isUndefined() ? String() : message.toString(exec)->value(exec), appender, type, useCurrentFrame); + } + + static void addErrorInfo(ExecState*, VM&, JSObject*, bool = true); + + bool hasSourceAppender() const { return !!m_sourceAppender; } + SourceAppender sourceAppender() const { return m_sourceAppender; } + void setSourceAppender(SourceAppender appender) { m_sourceAppender = appender; } + void clearSourceAppender() { m_sourceAppender = nullptr; } + void setRuntimeTypeForCause(RuntimeType type) { m_runtimeTypeForCause = type; } + RuntimeType runtimeTypeForCause() const { return m_runtimeTypeForCause; } + void clearRuntimeTypeForCause() { m_runtimeTypeForCause = TypeNothing; } + +protected: + explicit ErrorInstance(VM&, Structure*); + + void finishCreation(ExecState*, VM&, const String&, bool useCurrentFrame = true); + + SourceAppender m_sourceAppender { nullptr }; + RuntimeType m_runtimeTypeForCause { TypeNothing }; +}; } // namespace JSC