/* * Copyright (C) 2012 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 ByValInfo_h #define ByValInfo_h #include #if ENABLE(JIT) #include "ClassInfo.h" #include "CodeLocation.h" #include "IndexingType.h" #include "JITStubRoutine.h" #include "Structure.h" namespace JSC { enum JITArrayMode { JITInt32, JITDouble, JITContiguous, JITArrayStorage, JITInt8Array, JITInt16Array, JITInt32Array, JITUint8Array, JITUint8ClampedArray, JITUint16Array, JITUint32Array, JITFloat32Array, JITFloat64Array }; inline bool isOptimizableIndexingType(IndexingType indexingType) { switch (indexingType) { case ALL_INT32_INDEXING_TYPES: case ALL_DOUBLE_INDEXING_TYPES: case ALL_CONTIGUOUS_INDEXING_TYPES: case ARRAY_WITH_ARRAY_STORAGE_INDEXING_TYPES: return true; default: return false; } } inline bool hasOptimizableIndexingForClassInfo(const ClassInfo* classInfo) { return classInfo->typedArrayStorageType != TypedArrayNone; } inline bool hasOptimizableIndexing(Structure* structure) { return isOptimizableIndexingType(structure->indexingType()) || hasOptimizableIndexingForClassInfo(structure->classInfo()); } inline JITArrayMode jitArrayModeForIndexingType(IndexingType indexingType) { switch (indexingType) { case ALL_INT32_INDEXING_TYPES: return JITInt32; case ALL_DOUBLE_INDEXING_TYPES: return JITDouble; case ALL_CONTIGUOUS_INDEXING_TYPES: return JITContiguous; case ARRAY_WITH_ARRAY_STORAGE_INDEXING_TYPES: return JITArrayStorage; default: CRASH(); return JITContiguous; } } inline JITArrayMode jitArrayModeForClassInfo(const ClassInfo* classInfo) { switch (classInfo->typedArrayStorageType) { case TypedArrayInt8: return JITInt8Array; case TypedArrayInt16: return JITInt16Array; case TypedArrayInt32: return JITInt32Array; case TypedArrayUint8: return JITUint8Array; case TypedArrayUint8Clamped: return JITUint8ClampedArray; case TypedArrayUint16: return JITUint16Array; case TypedArrayUint32: return JITUint32Array; case TypedArrayFloat32: return JITFloat32Array; case TypedArrayFloat64: return JITFloat64Array; default: CRASH(); return JITContiguous; } } inline JITArrayMode jitArrayModeForStructure(Structure* structure) { if (isOptimizableIndexingType(structure->indexingType())) return jitArrayModeForIndexingType(structure->indexingType()); ASSERT(hasOptimizableIndexingForClassInfo(structure->classInfo())); return jitArrayModeForClassInfo(structure->classInfo()); } struct ByValInfo { ByValInfo() { } ByValInfo(unsigned bytecodeIndex, CodeLocationJump badTypeJump, JITArrayMode arrayMode, int16_t badTypeJumpToDone, int16_t returnAddressToSlowPath) : bytecodeIndex(bytecodeIndex) , badTypeJump(badTypeJump) , arrayMode(arrayMode) , badTypeJumpToDone(badTypeJumpToDone) , returnAddressToSlowPath(returnAddressToSlowPath) , slowPathCount(0) { } unsigned bytecodeIndex; CodeLocationJump badTypeJump; JITArrayMode arrayMode; // The array mode that was baked into the inline JIT code. int16_t badTypeJumpToDone; int16_t returnAddressToSlowPath; unsigned slowPathCount; RefPtr stubRoutine; }; inline unsigned getByValInfoBytecodeIndex(ByValInfo* info) { return info->bytecodeIndex; } } // namespace JSC #endif // ENABLE(JIT) #endif // ByValInfo_h