/* * Copyright (C) 2015 Apple Inc. All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef PutByIdFlags_h #define PutByIdFlags_h #include "StructureIDTable.h" namespace JSC { enum PutByIdFlags : intptr_t { PutByIdNone = 0, // This flag indicates that the put_by_id is direct. That means that we store the property without // checking if the prototype chain has a setter. PutByIdIsDirect = 0x1, PutByIdPersistentFlagsMask = 0x1, // NOTE: The values below must be in sync with what is in LowLevelInterpreter.asm. // Determining the required inferred type involves first checking the primary type mask, and then // using that to figure out the meaning of the secondary mask: // switch (flags & PutByIdPrimaryTypeMask) { // case PutByIdPrimaryTypeSecondary: // switch (flags & PutByIdSecondaryTypeMask) { // ... // } // break; // case PutByIdPrimaryTypeObjectWithStructure: // case PutByIdPrimaryTypeObjectWithStructureOrOther: // StructureID structureID = decodeStructureID(flags); // break; // } PutByIdPrimaryTypeMask = 0x6, PutByIdPrimaryTypeSecondary = 0x0, // Need to check the secondary type mask for the type. PutByIdPrimaryTypeObjectWithStructure = 0x2, // Secondary type has structure ID. PutByIdPrimaryTypeObjectWithStructureOrOther = 0x4, // Secondary type has structure ID. PutByIdSecondaryTypeMask = -0x8, PutByIdSecondaryTypeBottom = 0x0, PutByIdSecondaryTypeBoolean = 0x8, PutByIdSecondaryTypeOther = 0x10, PutByIdSecondaryTypeInt32 = 0x18, PutByIdSecondaryTypeNumber = 0x20, PutByIdSecondaryTypeString = 0x28, PutByIdSecondaryTypeSymbol = 0x30, PutByIdSecondaryTypeObject = 0x38, PutByIdSecondaryTypeObjectOrOther = 0x40, PutByIdSecondaryTypeTop = 0x48 }; inline PutByIdFlags encodeStructureID(StructureID id) { #if USE(JSVALUE64) return static_cast(static_cast(id) << 3); #else PutByIdFlags result = bitwise_cast(id); ASSERT(!(result & ~PutByIdSecondaryTypeMask)); return result; #endif } inline StructureID decodeStructureID(PutByIdFlags flags) { #if USE(JSVALUE64) return static_cast(flags >> 3); #else return bitwise_cast(flags & PutByIdSecondaryTypeMask); #endif } } // namespace JSC namespace WTF { class PrintStream; void printInternal(PrintStream&, JSC::PutByIdFlags); } // namespace WTF #endif // PutByIdFlags_h