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     static const unsigned IsJSFinalObject = 1 << 8;
     47 
     48     class TypeInfo {
     49     public:
     50         TypeInfo(JSType type, unsigned flags = 0)
     51             : m_type(type)
     52             , m_flags(flags & 0xFF)
     53             , m_flags2(flags >> 8)
     54         {
     55             ASSERT(flags <= 0x1FF);
     56             ASSERT(type <= 0xFF);
     57             ASSERT(type >= CompoundType || !(flags & OverridesMarkChildren));
     58             // ImplementsDefaultHasInstance means (ImplementsHasInstance & !OverridesHasInstance)
     59             if ((m_flags & (ImplementsHasInstance | OverridesHasInstance)) == ImplementsHasInstance)
     60                 m_flags |= ImplementsDefaultHasInstance;
     61         }
     62 
     63         JSType type() const { return (JSType)m_type; }
     64 
     65         bool masqueradesAsUndefined() const { return m_flags & MasqueradesAsUndefined; }
     66         bool implementsHasInstance() const { return m_flags & ImplementsHasInstance; }
     67         bool overridesHasInstance() const { return m_flags & OverridesHasInstance; }
     68         bool needsThisConversion() const { return m_flags & NeedsThisConversion; }
     69         bool overridesGetOwnPropertySlot() const { return m_flags & OverridesGetOwnPropertySlot; }
     70         bool overridesMarkChildren() const { return m_flags & OverridesMarkChildren; }
     71         bool overridesGetPropertyNames() const { return m_flags & OverridesGetPropertyNames; }
     72         unsigned flags() const { return m_flags; }
     73         unsigned isFinal() const { return m_flags2 && (IsJSFinalObject >> 8); }
     74 
     75         static ptrdiff_t flagsOffset()
     76         {
     77             return OBJECT_OFFSETOF(TypeInfo, m_flags);
     78         }
     79 
     80         static ptrdiff_t typeOffset()
     81         {
     82             return OBJECT_OFFSETOF(TypeInfo, m_type);
     83         }
     84 
     85     private:
     86         unsigned char m_type;
     87         unsigned char m_flags;
     88         unsigned char m_flags2;
     89     };
     90 
     91 }
     92 
     93 #endif // JSTypeInfo_h
     94