Home | History | Annotate | Download | only in runtime
      1 // -*- mode: c++; c-basic-offset: 4 -*-
      2 /*
      3  * Copyright (C) 2008 Apple Inc. All rights reserved.
      4  *
      5  * Redistribution and use in source and binary forms, with or without
      6  * modification, are permitted provided that the following conditions
      7  * are met:
      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  *
     14  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
     15  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     17  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
     18  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     19  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     20  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     21  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
     22  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     24  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     25  */
     26 
     27 #ifndef JSTypeInfo_h
     28 #define JSTypeInfo_h
     29 
     30 // This file would be called TypeInfo.h, but that conflicts with <typeinfo.h>
     31 // in the STL on systems without case-sensitive file systems.
     32 
     33 #include "JSType.h"
     34 
     35 namespace JSC {
     36 
     37     // WebCore uses MasqueradesAsUndefined to make document.all and style.filter undetectable.
     38     static const unsigned MasqueradesAsUndefined = 1;
     39     static const unsigned ImplementsHasInstance = 1 << 1;
     40     static const unsigned OverridesHasInstance = 1 << 2;
     41     static const unsigned ImplementsDefaultHasInstance = 1 << 3;
     42     static const unsigned NeedsThisConversion = 1 << 4;
     43     static const unsigned OverridesGetOwnPropertySlot = 1 << 5;
     44     static const unsigned OverridesMarkChildren = 1 << 6;
     45     static const unsigned OverridesGetPropertyNames = 1 << 7;
     46 
     47     class TypeInfo {
     48         friend class JIT;
     49     public:
     50         TypeInfo(JSType type, unsigned flags = 0)
     51             : m_type(type)
     52         {
     53             // ImplementsDefaultHasInstance means (ImplementsHasInstance & !OverridesHasInstance)
     54             if ((flags & (ImplementsHasInstance | OverridesHasInstance)) == ImplementsHasInstance)
     55                 m_flags = flags | ImplementsDefaultHasInstance;
     56             else
     57                 m_flags = flags;
     58         }
     59 
     60         JSType type() const { return m_type; }
     61 
     62         bool masqueradesAsUndefined() const { return m_flags & MasqueradesAsUndefined; }
     63         bool implementsHasInstance() const { return m_flags & ImplementsHasInstance; }
     64         bool overridesHasInstance() const { return m_flags & OverridesHasInstance; }
     65         bool needsThisConversion() const { return m_flags & NeedsThisConversion; }
     66         bool overridesGetOwnPropertySlot() const { return m_flags & OverridesGetOwnPropertySlot; }
     67         bool overridesMarkChildren() const { return m_flags & OverridesMarkChildren; }
     68         bool overridesGetPropertyNames() const { return m_flags & OverridesGetPropertyNames; }
     69         unsigned flags() const { return m_flags; }
     70 
     71     private:
     72         JSType m_type;
     73         unsigned m_flags;
     74     };
     75 
     76 }
     77 
     78 #endif // JSTypeInfo_h
     79