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 #ifndef JSNotAnObject_h
     30 #define JSNotAnObject_h
     31 
     32 #include "JSObject.h"
     33 
     34 namespace JSC {
     35 
     36     class JSNotAnObjectErrorStub : public JSObject {
     37     public:
     38         JSNotAnObjectErrorStub(ExecState* exec, bool isNull)
     39             : JSObject(exec->globalData().notAnObjectErrorStubStructure)
     40             , m_isNull(isNull)
     41         {
     42         }
     43 
     44         bool isNull() const { return m_isNull; }
     45 
     46     private:
     47         virtual bool isNotAnObjectErrorStub() const { return true; }
     48 
     49         bool m_isNull;
     50     };
     51 
     52     // This unholy class is used to allow us to avoid multiple exception checks
     53     // in certain SquirrelFish bytecodes -- effectively it just silently consumes
     54     // any operations performed on the result of a failed toObject call.
     55     class JSNotAnObject : public JSObject {
     56     public:
     57         JSNotAnObject(ExecState* exec, JSNotAnObjectErrorStub* exception)
     58             : JSObject(exec->globalData().notAnObjectStructure)
     59             , m_exception(exception)
     60         {
     61         }
     62 
     63         static PassRefPtr<Structure> createStructure(JSValue prototype)
     64         {
     65             return Structure::create(prototype, TypeInfo(ObjectType, StructureFlags), AnonymousSlotCount);
     66         }
     67 
     68      private:
     69 
     70         static const unsigned StructureFlags = OverridesGetOwnPropertySlot | OverridesMarkChildren | OverridesGetPropertyNames | JSObject::StructureFlags;
     71 
     72         // JSValue methods
     73         virtual JSValue toPrimitive(ExecState*, PreferredPrimitiveType) const;
     74         virtual bool getPrimitiveNumber(ExecState*, double& number, JSValue&);
     75         virtual bool toBoolean(ExecState*) const;
     76         virtual double toNumber(ExecState*) const;
     77         virtual UString toString(ExecState*) const;
     78         virtual JSObject* toObject(ExecState*) const;
     79 
     80         // Marking
     81         virtual void markChildren(MarkStack&);
     82 
     83         // JSObject methods
     84         virtual bool getOwnPropertySlot(ExecState*, const Identifier& propertyName, PropertySlot&);
     85         virtual bool getOwnPropertySlot(ExecState*, unsigned propertyName, PropertySlot&);
     86         virtual bool getOwnPropertyDescriptor(ExecState*, const Identifier&, PropertyDescriptor&);
     87 
     88         virtual void put(ExecState*, const Identifier& propertyName, JSValue, PutPropertySlot&);
     89         virtual void put(ExecState*, unsigned propertyName, JSValue);
     90 
     91         virtual bool deleteProperty(ExecState*, const Identifier& propertyName);
     92         virtual bool deleteProperty(ExecState*, unsigned propertyName);
     93 
     94         virtual void getOwnPropertyNames(ExecState*, PropertyNameArray&, EnumerationMode mode = ExcludeDontEnumProperties);
     95 
     96         JSNotAnObjectErrorStub* m_exception;
     97     };
     98 
     99 } // namespace JSC
    100 
    101 #endif // JSNotAnObject_h
    102