Changeset 60762 in webkit for trunk/JavaScriptCore/runtime/Error.cpp
- Timestamp:
- Jun 6, 2010, 4:34:36 PM (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/runtime/Error.cpp
r60708 r60762 32 32 #include "JSString.h" 33 33 #include "NativeErrorConstructor.h" 34 #include "SourceCode.h" 34 35 35 36 namespace JSC { 36 37 37 const char* expressionBeginOffsetPropertyName = "expressionBeginOffset"; 38 const char* expressionCaretOffsetPropertyName = "expressionCaretOffset"; 39 const char* expressionEndOffsetPropertyName = "expressionEndOffset"; 38 static const char* linePropertyName = "line"; 39 static const char* sourceIdPropertyName = "sourceId"; 40 static const char* sourceURLPropertyName = "sourceURL"; 41 static const char* expressionBeginOffsetPropertyName = "expressionBeginOffset"; 42 static const char* expressionCaretOffsetPropertyName = "expressionCaretOffset"; 43 static const char* expressionEndOffsetPropertyName = "expressionEndOffset"; 40 44 41 static JSObject* constructNativeError(ExecState* exec, const UString& message, NativeErrorConstructor* constructor, const char* name)45 JSObject* createError(JSGlobalObject* globalObject, const UString& message) 42 46 { 43 ErrorInstance* object = new (exec) ErrorInstance(constructor->errorStructure()); 44 JSString* messageString = message.isEmpty() ? jsString(exec, name) : jsString(exec, message); 45 object->putDirect(exec->propertyNames().message, messageString); 46 return object; 47 ASSERT(!message.isEmpty()); 48 return ErrorInstance::create(globalObject->globalData(), globalObject->errorStructure(), message); 47 49 } 48 50 49 JSObject* Error::create(ExecState* exec, ErrorType type, const UString& message, int lineNumber, intptr_t sourceID, const UString& sourceURL)51 JSObject* createEvalError(JSGlobalObject* globalObject, const UString& message) 50 52 { 51 JSObject* error; 53 ASSERT(!message.isEmpty()); 54 return ErrorInstance::create(globalObject->globalData(), globalObject->evalErrorConstructor()->errorStructure(), message); 55 } 52 56 53 switch (type) { 54 case EvalError: 55 error = constructNativeError(exec, message, exec->lexicalGlobalObject()->evalErrorConstructor(), "Evaluation error"); 56 break; 57 case RangeError: 58 error = constructNativeError(exec, message, exec->lexicalGlobalObject()->rangeErrorConstructor(), "Range error"); 59 break; 60 case ReferenceError: 61 error = constructNativeError(exec, message, exec->lexicalGlobalObject()->referenceErrorConstructor(), "Reference error"); 62 break; 63 case SyntaxError: 64 error = constructNativeError(exec, message, exec->lexicalGlobalObject()->syntaxErrorConstructor(), "Syntax error"); 65 break; 66 case TypeError: 67 error = constructNativeError(exec, message, exec->lexicalGlobalObject()->typeErrorConstructor(), "Type error"); 68 break; 69 case URIError: 70 error = constructNativeError(exec, message, exec->lexicalGlobalObject()->URIErrorConstructor(), "URI error"); 71 break; 72 default: 73 JSObject* constructor = exec->lexicalGlobalObject()->errorConstructor(); 74 const char* name = "Error"; 75 MarkedArgumentBuffer args; 76 if (message.isEmpty()) 77 args.append(jsString(exec, name)); 78 else 79 args.append(jsString(exec, message)); 80 ConstructData constructData; 81 ConstructType constructType = constructor->getConstructData(constructData); 82 error = construct(exec, constructor, constructType, constructData, args); 83 } 57 JSObject* createRangeError(JSGlobalObject* globalObject, const UString& message) 58 { 59 ASSERT(!message.isEmpty()); 60 return ErrorInstance::create(globalObject->globalData(), globalObject->rangeErrorConstructor()->errorStructure(), message); 61 } 84 62 85 if (lineNumber != -1) 86 error->putWithAttributes(exec, Identifier(exec, "line"), jsNumber(exec, lineNumber), ReadOnly | DontDelete); 63 JSObject* createReferenceError(JSGlobalObject* globalObject, const UString& message) 64 { 65 ASSERT(!message.isEmpty()); 66 return ErrorInstance::create(globalObject->globalData(), globalObject->referenceErrorConstructor()->errorStructure(), message); 67 } 68 69 JSObject* createSyntaxError(JSGlobalObject* globalObject, const UString& message) 70 { 71 ASSERT(!message.isEmpty()); 72 return ErrorInstance::create(globalObject->globalData(), globalObject->syntaxErrorConstructor()->errorStructure(), message); 73 } 74 75 JSObject* createTypeError(JSGlobalObject* globalObject, const UString& message) 76 { 77 ASSERT(!message.isEmpty()); 78 return ErrorInstance::create(globalObject->globalData(), globalObject->typeErrorConstructor()->errorStructure(), message); 79 } 80 81 JSObject* createURIError(JSGlobalObject* globalObject, const UString& message) 82 { 83 ASSERT(!message.isEmpty()); 84 return ErrorInstance::create(globalObject->globalData(), globalObject->URIErrorConstructor()->errorStructure(), message); 85 } 86 87 JSObject* createError(ExecState* exec, const UString& message) 88 { 89 return createError(exec->lexicalGlobalObject(), message); 90 } 91 92 JSObject* createEvalError(ExecState* exec, const UString& message) 93 { 94 return createEvalError(exec->lexicalGlobalObject(), message); 95 } 96 97 JSObject* createRangeError(ExecState* exec, const UString& message) 98 { 99 return createRangeError(exec->lexicalGlobalObject(), message); 100 } 101 102 JSObject* createReferenceError(ExecState* exec, const UString& message) 103 { 104 return createReferenceError(exec->lexicalGlobalObject(), message); 105 } 106 107 JSObject* createSyntaxError(ExecState* exec, const UString& message) 108 { 109 return createSyntaxError(exec->lexicalGlobalObject(), message); 110 } 111 112 JSObject* createTypeError(ExecState* exec, const UString& message) 113 { 114 return createTypeError(exec->lexicalGlobalObject(), message); 115 } 116 117 JSObject* createURIError(ExecState* exec, const UString& message) 118 { 119 return createURIError(exec->lexicalGlobalObject(), message); 120 } 121 122 static void addErrorSourceInfo(JSGlobalData* globalData, JSObject* error, int line, const SourceCode& source) 123 { 124 intptr_t sourceID = source.provider()->asID(); 125 const UString& sourceURL = source.provider()->url(); 126 127 if (line != -1) 128 error->putWithAttributes(globalData, Identifier(globalData, linePropertyName), jsNumber(globalData, line), ReadOnly | DontDelete); 87 129 if (sourceID != -1) 88 error->putWithAttributes( exec, Identifier(exec, "sourceId"), jsNumber(exec,sourceID), ReadOnly | DontDelete);130 error->putWithAttributes(globalData, Identifier(globalData, sourceIdPropertyName), jsNumber(globalData, (double)sourceID), ReadOnly | DontDelete); 89 131 if (!sourceURL.isNull()) 90 error->putWithAttributes(exec, Identifier(exec, "sourceURL"), jsString(exec, sourceURL), ReadOnly | DontDelete); 132 error->putWithAttributes(globalData, Identifier(globalData, sourceURLPropertyName), jsString(globalData, sourceURL), ReadOnly | DontDelete); 133 } 91 134 135 static void addErrorDivotInfo(JSGlobalData* globalData, JSObject* error, int divotPoint, int startOffset, int endOffset, bool withCaret) 136 { 137 error->putWithAttributes(globalData, Identifier(globalData, expressionBeginOffsetPropertyName), jsNumber(globalData, divotPoint - startOffset), ReadOnly | DontDelete); 138 error->putWithAttributes(globalData, Identifier(globalData, expressionEndOffsetPropertyName), jsNumber(globalData, divotPoint + endOffset), ReadOnly | DontDelete); 139 if (withCaret) 140 error->putWithAttributes(globalData, Identifier(globalData, expressionCaretOffsetPropertyName), jsNumber(globalData, divotPoint), ReadOnly | DontDelete); 141 } 142 143 JSObject* addErrorInfo(JSGlobalData* globalData, JSObject* error, int line, const SourceCode& source) 144 { 145 addErrorSourceInfo(globalData, error, line, source); 92 146 return error; 93 147 } 94 148 95 JSObject* Error::create(ExecState* exec, ErrorType type, const char* message)149 JSObject* addErrorInfo(JSGlobalData* globalData, JSObject* error, int line, const SourceCode& source, int divotPoint, int startOffset, int endOffset, bool withCaret) 96 150 { 97 return create(exec, type, message, -1, -1, UString()); 151 addErrorSourceInfo(globalData, error, line, source); 152 addErrorDivotInfo(globalData, error, divotPoint, startOffset, endOffset, withCaret); 153 return error; 154 } 155 156 JSObject* addErrorInfo(ExecState* exec, JSObject* error, int line, const SourceCode& source) 157 { 158 return addErrorInfo(&exec->globalData(), error, line, source); 159 } 160 161 JSObject* addErrorInfo(ExecState* exec, JSObject* error, int line, const SourceCode& source, int divotPoint, int startOffset, int endOffset, bool withCaret) 162 { 163 return addErrorInfo(&exec->globalData(), error, line, source, divotPoint, startOffset, endOffset, withCaret); 164 } 165 166 bool hasErrorInfo(ExecState* exec, JSObject* error) 167 { 168 return error->hasProperty(exec, Identifier(exec, linePropertyName)) 169 || error->hasProperty(exec, Identifier(exec, sourceIdPropertyName)) 170 || error->hasProperty(exec, Identifier(exec, sourceURLPropertyName)) 171 || error->hasProperty(exec, Identifier(exec, expressionBeginOffsetPropertyName)) 172 || error->hasProperty(exec, Identifier(exec, expressionCaretOffsetPropertyName)) 173 || error->hasProperty(exec, Identifier(exec, expressionEndOffsetPropertyName)); 174 } 175 176 JSValue throwError(ExecState* exec, JSValue error) 177 { 178 exec->globalData().exception = error; 179 return error; 98 180 } 99 181 100 182 JSObject* throwError(ExecState* exec, JSObject* error) 101 183 { 102 exec-> setException(error);184 exec->globalData().exception = error; 103 185 return error; 104 186 } 105 187 106 JSObject* throw Error(ExecState* exec, ErrorType type)188 JSObject* throwTypeError(ExecState* exec) 107 189 { 108 JSObject* error = Error::create(exec, type, UString(), -1, -1, UString()); 109 exec->setException(error); 110 return error; 190 return throwError(exec, createTypeError(exec, "Type error")); 111 191 } 112 192 113 JSObject* throw Error(ExecState* exec, ErrorType type, const UString& message)193 JSObject* throwSyntaxError(ExecState* exec) 114 194 { 115 JSObject* error = Error::create(exec, type, message, -1, -1, UString()); 116 exec->setException(error); 117 return error; 118 } 119 120 JSObject* throwError(ExecState* exec, ErrorType type, const char* message) 121 { 122 JSObject* error = Error::create(exec, type, message, -1, -1, UString()); 123 exec->setException(error); 124 return error; 125 } 126 127 JSObject* throwError(ExecState* exec, ErrorType type, const UString& message, int line, intptr_t sourceID, const UString& sourceURL) 128 { 129 JSObject* error = Error::create(exec, type, message, line, sourceID, sourceURL); 130 exec->setException(error); 131 return error; 195 return throwError(exec, createSyntaxError(exec, "Syntax error")); 132 196 } 133 197
Note:
See TracChangeset
for help on using the changeset viewer.