Home | History | Annotate | Download | only in runtime
      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