1 /* 2 * Copyright (C) 2008, 2009 Apple Inc. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of 14 * its contributors may be used to endorse or promote products derived 15 * from this software without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 18 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 19 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 20 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 21 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 22 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 23 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 24 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 */ 28 29 #include "config.h" 30 #include "ExceptionHelpers.h" 31 32 #include "CodeBlock.h" 33 #include "CallFrame.h" 34 #include "ErrorInstance.h" 35 #include "JSGlobalObjectFunctions.h" 36 #include "JSObject.h" 37 #include "JSNotAnObject.h" 38 #include "Interpreter.h" 39 #include "Nodes.h" 40 #include "UStringConcatenate.h" 41 42 namespace JSC { 43 44 class InterruptedExecutionError : public JSNonFinalObject { 45 public: 46 InterruptedExecutionError(JSGlobalData* globalData) 47 : JSNonFinalObject(*globalData, globalData->interruptedExecutionErrorStructure.get()) 48 { 49 } 50 51 virtual ComplType exceptionType() const { return Interrupted; } 52 53 virtual UString toString(ExecState*) const { return "JavaScript execution exceeded timeout."; } 54 }; 55 56 JSObject* createInterruptedExecutionException(JSGlobalData* globalData) 57 { 58 return new (globalData) InterruptedExecutionError(globalData); 59 } 60 61 class TerminatedExecutionError : public JSNonFinalObject { 62 public: 63 TerminatedExecutionError(JSGlobalData* globalData) 64 : JSNonFinalObject(*globalData, globalData->terminatedExecutionErrorStructure.get()) 65 { 66 } 67 68 virtual ComplType exceptionType() const { return Terminated; } 69 70 virtual UString toString(ExecState*) const { return "JavaScript execution terminated."; } 71 }; 72 73 JSObject* createTerminatedExecutionException(JSGlobalData* globalData) 74 { 75 return new (globalData) TerminatedExecutionError(globalData); 76 } 77 78 JSObject* createStackOverflowError(ExecState* exec) 79 { 80 return createRangeError(exec, "Maximum call stack size exceeded."); 81 } 82 83 JSObject* createStackOverflowError(JSGlobalObject* globalObject) 84 { 85 return createRangeError(globalObject, "Maximum call stack size exceeded."); 86 } 87 88 JSObject* createUndefinedVariableError(ExecState* exec, const Identifier& ident) 89 { 90 UString message(makeUString("Can't find variable: ", ident.ustring())); 91 return createReferenceError(exec, message); 92 } 93 94 JSObject* createInvalidParamError(ExecState* exec, const char* op, JSValue value) 95 { 96 UString errorMessage = makeUString("'", value.toString(exec), "' is not a valid argument for '", op, "'"); 97 JSObject* exception = createTypeError(exec, errorMessage); 98 ASSERT(exception->isErrorInstance()); 99 static_cast<ErrorInstance*>(exception)->setAppendSourceToMessage(); 100 return exception; 101 } 102 103 JSObject* createNotAConstructorError(ExecState* exec, JSValue value) 104 { 105 UString errorMessage = makeUString("'", value.toString(exec), "' is not a constructor"); 106 JSObject* exception = createTypeError(exec, errorMessage); 107 ASSERT(exception->isErrorInstance()); 108 static_cast<ErrorInstance*>(exception)->setAppendSourceToMessage(); 109 return exception; 110 } 111 112 JSObject* createNotAFunctionError(ExecState* exec, JSValue value) 113 { 114 UString errorMessage = makeUString("'", value.toString(exec), "' is not a function"); 115 JSObject* exception = createTypeError(exec, errorMessage); 116 ASSERT(exception->isErrorInstance()); 117 static_cast<ErrorInstance*>(exception)->setAppendSourceToMessage(); 118 return exception; 119 } 120 121 JSObject* createNotAnObjectError(ExecState* exec, JSValue value) 122 { 123 UString errorMessage = makeUString("'", value.toString(exec), "' is not an object"); 124 JSObject* exception = createTypeError(exec, errorMessage); 125 ASSERT(exception->isErrorInstance()); 126 static_cast<ErrorInstance*>(exception)->setAppendSourceToMessage(); 127 return exception; 128 } 129 130 JSObject* createErrorForInvalidGlobalAssignment(ExecState* exec, const UString& propertyName) 131 { 132 return createReferenceError(exec, makeUString("Strict mode forbids implicit creation of global property '", propertyName, "'")); 133 } 134 135 JSObject* createOutOfMemoryError(JSGlobalObject* globalObject) 136 { 137 return createError(globalObject, "Out of memory"); 138 } 139 140 JSObject* throwOutOfMemoryError(ExecState* exec) 141 { 142 return throwError(exec, createOutOfMemoryError(exec->lexicalGlobalObject())); 143 } 144 145 JSObject* throwStackOverflowError(ExecState* exec) 146 { 147 return throwError(exec, createStackOverflowError(exec)); 148 } 149 150 } // namespace JSC 151