Changeset 205107 in webkit


Ignore:
Timestamp:
Aug 28, 2016, 4:31:46 PM (9 years ago)
Author:
sbarati@apple.com
Message:

Make SpeculatedType a 64-bit integer
https://bugs.webkit.org/show_bug.cgi?id=161268

Reviewed by Filip Pizlo and Benjamin Poulain.

I'm going to introduce two new types into this and we only
have room for one in 32-bits. So, this patch widens SpeculatedType
to 64 bits. This also pulls this information through the DFG where
we needed to change DFGNode to support this.

  • bytecode/SpeculatedType.h:
  • dfg/DFGNode.cpp:

(JSC::DFG::Node::convertToPutHint):
(JSC::DFG::Node::promotedLocationDescriptor):

  • dfg/DFGNode.h:

(JSC::DFG::Node::Node):
(JSC::DFG::Node::convertToCheckStructure):
(JSC::DFG::Node::constant):
(JSC::DFG::Node::convertToConstant):
(JSC::DFG::Node::convertToConstantStoragePointer):
(JSC::DFG::Node::convertToPutStack):
(JSC::DFG::Node::convertToGetStack):
(JSC::DFG::Node::convertToGetByOffset):
(JSC::DFG::Node::convertToMultiGetByOffset):
(JSC::DFG::Node::convertToPutByOffset):
(JSC::DFG::Node::convertToMultiPutByOffset):
(JSC::DFG::Node::convertToPhantomNewObject):
(JSC::DFG::Node::convertToPhantomNewFunction):
(JSC::DFG::Node::convertToPhantomNewGeneratorFunction):
(JSC::DFG::Node::convertToPhantomCreateActivation):
(JSC::DFG::Node::convertToGetLocal):
(JSC::DFG::Node::lazyJSValue):
(JSC::DFG::Node::initializationValueForActivation):
(JSC::DFG::Node::tryGetVariableAccessData):
(JSC::DFG::Node::variableAccessData):
(JSC::DFG::Node::unlinkedLocal):
(JSC::DFG::Node::unlinkedMachineLocal):
(JSC::DFG::Node::stackAccessData):
(JSC::DFG::Node::phi):
(JSC::DFG::Node::identifierNumber):
(JSC::DFG::Node::getPutInfo):
(JSC::DFG::Node::accessorAttributes):
(JSC::DFG::Node::newArrayBufferData):
(JSC::DFG::Node::indexingType):
(JSC::DFG::Node::typedArrayType):
(JSC::DFG::Node::inlineCapacity):
(JSC::DFG::Node::scopeOffset):
(JSC::DFG::Node::capturedArgumentsOffset):
(JSC::DFG::Node::variablePointer):
(JSC::DFG::Node::callVarargsData):
(JSC::DFG::Node::loadVarargsData):
(JSC::DFG::Node::targetBytecodeOffsetDuringParsing):
(JSC::DFG::Node::targetBlock):
(JSC::DFG::Node::branchData):
(JSC::DFG::Node::switchData):
(JSC::DFG::Node::getHeapPrediction):
(JSC::DFG::Node::cellOperand):
(JSC::DFG::Node::watchpointSet):
(JSC::DFG::Node::storagePointer):
(JSC::DFG::Node::uidOperand):
(JSC::DFG::Node::typeInfoOperand):
(JSC::DFG::Node::transition):
(JSC::DFG::Node::structureSet):
(JSC::DFG::Node::structure):
(JSC::DFG::Node::storageAccessData):
(JSC::DFG::Node::multiGetByOffsetData):
(JSC::DFG::Node::multiPutByOffsetData):
(JSC::DFG::Node::objectMaterializationData):
(JSC::DFG::Node::arrayMode):
(JSC::DFG::Node::arithMode):
(JSC::DFG::Node::arithRoundingMode):
(JSC::DFG::Node::setArithRoundingMode):
(JSC::DFG::Node::executionCounter):
(JSC::DFG::Node::typeLocation):
(JSC::DFG::Node::basicBlockLocation):
(JSC::DFG::Node::numberOfArgumentsToSkip):
(JSC::DFG::Node::OpInfoWrapper::OpInfoWrapper):
(JSC::DFG::Node::OpInfoWrapper::operator=):

  • dfg/DFGOpInfo.h:

(JSC::DFG::OpInfo::OpInfo):

  • dfg/DFGPromotedHeapLocation.h:

(JSC::DFG::PromotedLocationDescriptor::imm1):
(JSC::DFG::PromotedLocationDescriptor::imm2):

Location:
trunk/Source/JavaScriptCore
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/JavaScriptCore/ChangeLog

    r205091 r205107  
     12016-08-28  Saam Barati  <sbarati@apple.com>
     2
     3        Make SpeculatedType a 64-bit integer
     4        https://bugs.webkit.org/show_bug.cgi?id=161268
     5
     6        Reviewed by Filip Pizlo and Benjamin Poulain.
     7
     8        I'm going to introduce two new types into this and we only
     9        have room for one in 32-bits. So, this patch widens SpeculatedType
     10        to 64 bits. This also pulls this information through the DFG where
     11        we needed to change DFGNode to support this.
     12
     13        * bytecode/SpeculatedType.h:
     14        * dfg/DFGNode.cpp:
     15        (JSC::DFG::Node::convertToPutHint):
     16        (JSC::DFG::Node::promotedLocationDescriptor):
     17        * dfg/DFGNode.h:
     18        (JSC::DFG::Node::Node):
     19        (JSC::DFG::Node::convertToCheckStructure):
     20        (JSC::DFG::Node::constant):
     21        (JSC::DFG::Node::convertToConstant):
     22        (JSC::DFG::Node::convertToConstantStoragePointer):
     23        (JSC::DFG::Node::convertToPutStack):
     24        (JSC::DFG::Node::convertToGetStack):
     25        (JSC::DFG::Node::convertToGetByOffset):
     26        (JSC::DFG::Node::convertToMultiGetByOffset):
     27        (JSC::DFG::Node::convertToPutByOffset):
     28        (JSC::DFG::Node::convertToMultiPutByOffset):
     29        (JSC::DFG::Node::convertToPhantomNewObject):
     30        (JSC::DFG::Node::convertToPhantomNewFunction):
     31        (JSC::DFG::Node::convertToPhantomNewGeneratorFunction):
     32        (JSC::DFG::Node::convertToPhantomCreateActivation):
     33        (JSC::DFG::Node::convertToGetLocal):
     34        (JSC::DFG::Node::lazyJSValue):
     35        (JSC::DFG::Node::initializationValueForActivation):
     36        (JSC::DFG::Node::tryGetVariableAccessData):
     37        (JSC::DFG::Node::variableAccessData):
     38        (JSC::DFG::Node::unlinkedLocal):
     39        (JSC::DFG::Node::unlinkedMachineLocal):
     40        (JSC::DFG::Node::stackAccessData):
     41        (JSC::DFG::Node::phi):
     42        (JSC::DFG::Node::identifierNumber):
     43        (JSC::DFG::Node::getPutInfo):
     44        (JSC::DFG::Node::accessorAttributes):
     45        (JSC::DFG::Node::newArrayBufferData):
     46        (JSC::DFG::Node::indexingType):
     47        (JSC::DFG::Node::typedArrayType):
     48        (JSC::DFG::Node::inlineCapacity):
     49        (JSC::DFG::Node::scopeOffset):
     50        (JSC::DFG::Node::capturedArgumentsOffset):
     51        (JSC::DFG::Node::variablePointer):
     52        (JSC::DFG::Node::callVarargsData):
     53        (JSC::DFG::Node::loadVarargsData):
     54        (JSC::DFG::Node::targetBytecodeOffsetDuringParsing):
     55        (JSC::DFG::Node::targetBlock):
     56        (JSC::DFG::Node::branchData):
     57        (JSC::DFG::Node::switchData):
     58        (JSC::DFG::Node::getHeapPrediction):
     59        (JSC::DFG::Node::cellOperand):
     60        (JSC::DFG::Node::watchpointSet):
     61        (JSC::DFG::Node::storagePointer):
     62        (JSC::DFG::Node::uidOperand):
     63        (JSC::DFG::Node::typeInfoOperand):
     64        (JSC::DFG::Node::transition):
     65        (JSC::DFG::Node::structureSet):
     66        (JSC::DFG::Node::structure):
     67        (JSC::DFG::Node::storageAccessData):
     68        (JSC::DFG::Node::multiGetByOffsetData):
     69        (JSC::DFG::Node::multiPutByOffsetData):
     70        (JSC::DFG::Node::objectMaterializationData):
     71        (JSC::DFG::Node::arrayMode):
     72        (JSC::DFG::Node::arithMode):
     73        (JSC::DFG::Node::arithRoundingMode):
     74        (JSC::DFG::Node::setArithRoundingMode):
     75        (JSC::DFG::Node::executionCounter):
     76        (JSC::DFG::Node::typeLocation):
     77        (JSC::DFG::Node::basicBlockLocation):
     78        (JSC::DFG::Node::numberOfArgumentsToSkip):
     79        (JSC::DFG::Node::OpInfoWrapper::OpInfoWrapper):
     80        (JSC::DFG::Node::OpInfoWrapper::operator=):
     81        * dfg/DFGOpInfo.h:
     82        (JSC::DFG::OpInfo::OpInfo):
     83        * dfg/DFGPromotedHeapLocation.h:
     84        (JSC::DFG::PromotedLocationDescriptor::imm1):
     85        (JSC::DFG::PromotedLocationDescriptor::imm2):
     86
    1872016-08-27  Don Olmstead  <don.olmstead@am.sony.com>
    288
  • trunk/Source/JavaScriptCore/bytecode/SpeculatedType.h

    r200034 r205107  
    3838class Structure;
    3939
    40 typedef uint32_t SpeculatedType;
     40typedef uint64_t SpeculatedType;
    4141static const SpeculatedType SpecNone               = 0; // We don't know anything yet.
    4242static const SpeculatedType SpecFinalObject        = 1u << 0; // It's definitely a JSFinalObject.
  • trunk/Source/JavaScriptCore/dfg/DFGNode.cpp

    r203808 r205107  
    159159    m_op = LazyJSConstant;
    160160    m_flags &= ~NodeMustGenerate;
    161     m_opInfo = bitwise_cast<uintptr_t>(graph.m_lazyJSValues.add(value));
     161    m_opInfo = graph.m_lazyJSValues.add(value);
    162162    children.reset();
    163163}
     
    166166{
    167167    m_op = PutHint;
    168     m_opInfo = descriptor.imm1().m_value;
    169     m_opInfo2 = descriptor.imm2().m_value;
     168    m_opInfo = descriptor.imm1();
     169    m_opInfo2 = descriptor.imm2();
    170170    child1() = base->defaultEdge();
    171171    child2() = value->defaultEdge();
     
    207207PromotedLocationDescriptor Node::promotedLocationDescriptor()
    208208{
    209     return PromotedLocationDescriptor(static_cast<PromotedLocationKind>(m_opInfo), m_opInfo2);
     209    return PromotedLocationDescriptor(static_cast<PromotedLocationKind>(m_opInfo.as<uint32_t>()), m_opInfo2.as<uint32_t>());
    210210}
    211211
  • trunk/Source/JavaScriptCore/dfg/DFGNode.h

    r204992 r205107  
    5555#include "TypeLocation.h"
    5656#include "ValueProfile.h"
     57#include <type_traits>
    5758#include <wtf/ListDump.h>
    5859
     
    255256        , m_refCount(1)
    256257        , m_prediction(SpecNone)
    257         , m_opInfo(0)
    258         , m_opInfo2(0)
    259258        , owner(nullptr)
    260259    {
     
    271270        , m_refCount(1)
    272271        , m_prediction(SpecNone)
    273         , m_opInfo(0)
    274         , m_opInfo2(0)
    275272        , owner(nullptr)
    276273    {
     
    289286        , m_prediction(SpecNone)
    290287        , m_opInfo(imm.m_value)
    291         , m_opInfo2(0)
    292288        , owner(nullptr)
    293289    {
     
    305301        , m_prediction(SpecNone)
    306302        , m_opInfo(imm.m_value)
    307         , m_opInfo2(0)
    308303        , owner(nullptr)
    309304    {
     
    407402    {
    408403        setOpAndDefaultFlags(CheckStructure);
    409         m_opInfo = bitwise_cast<uintptr_t>(set);
     404        m_opInfo = set;
    410405    }
    411406
     
    472467        }
    473468       
    474         return bitwise_cast<FrozenValue*>(m_opInfo);
     469        return m_opInfo.as<FrozenValue*>();
    475470    }
    476471   
     
    485480            m_op = JSConstant;
    486481        m_flags &= ~NodeMustGenerate;
    487         m_opInfo = bitwise_cast<uintptr_t>(value);
     482        m_opInfo = value;
    488483        children.reset();
    489484    }
     
    495490        ASSERT(op() == GetIndexedPropertyStorage);
    496491        m_op = ConstantStoragePointer;
    497         m_opInfo = bitwise_cast<uintptr_t>(pointer);
     492        m_opInfo = pointer;
    498493        children.reset();
    499494    }
     
    512507        m_op = PutStack;
    513508        m_flags |= NodeMustGenerate;
    514         m_opInfo = bitwise_cast<uintptr_t>(data);
    515         m_opInfo2 = 0;
     509        m_opInfo = data;
     510        m_opInfo2 = OpInfoWrapper();
    516511    }
    517512   
     
    520515        m_op = GetStack;
    521516        m_flags &= ~NodeMustGenerate;
    522         m_opInfo = bitwise_cast<uintptr_t>(data);
    523         m_opInfo2 = 0;
     517        m_opInfo = data;
     518        m_opInfo2 = OpInfoWrapper();
    524519        children.reset();
    525520    }
     
    528523    {
    529524        ASSERT(m_op == GetById || m_op == GetByIdFlush || m_op == MultiGetByOffset);
    530         m_opInfo = bitwise_cast<uintptr_t>(&data);
     525        m_opInfo = &data;
    531526        children.setChild1(storage);
    532527        children.setChild2(base);
     
    538533    {
    539534        ASSERT(m_op == GetById || m_op == GetByIdFlush);
    540         m_opInfo = bitwise_cast<intptr_t>(data);
     535        m_opInfo = data;
    541536        child1().setUseKind(CellUse);
    542537        m_op = MultiGetByOffset;
     
    547542    {
    548543        ASSERT(m_op == PutById || m_op == PutByIdDirect || m_op == PutByIdFlush || m_op == MultiPutByOffset);
    549         m_opInfo = bitwise_cast<uintptr_t>(&data);
     544        m_opInfo = &data;
    550545        children.setChild3(children.child2());
    551546        children.setChild2(base);
     
    557552    {
    558553        ASSERT(m_op == PutById || m_op == PutByIdDirect || m_op == PutByIdFlush);
    559         m_opInfo = bitwise_cast<intptr_t>(data);
     554        m_opInfo = data;
    560555        m_op = MultiPutByOffset;
    561556    }
     
    573568        m_flags &= ~NodeHasVarArgs;
    574569        m_flags |= NodeMustGenerate;
    575         m_opInfo = 0;
    576         m_opInfo2 = 0;
     570        m_opInfo = OpInfoWrapper();
     571        m_opInfo2 = OpInfoWrapper();
    577572        children = AdjacencyList();
    578573    }
     
    583578        m_op = PhantomNewFunction;
    584579        m_flags |= NodeMustGenerate;
    585         m_opInfo = 0;
    586         m_opInfo2 = 0;
     580        m_opInfo = OpInfoWrapper();
     581        m_opInfo2 = OpInfoWrapper();
    587582        children = AdjacencyList();
    588583    }
     
    593588        m_op = PhantomNewGeneratorFunction;
    594589        m_flags |= NodeMustGenerate;
    595         m_opInfo = 0;
    596         m_opInfo2 = 0;
     590        m_opInfo = OpInfoWrapper();
     591        m_opInfo2 = OpInfoWrapper();
    597592        children = AdjacencyList();
    598593    }
     
    604599        m_flags &= ~NodeHasVarArgs;
    605600        m_flags |= NodeMustGenerate;
    606         m_opInfo = 0;
    607         m_opInfo2 = 0;
     601        m_opInfo = OpInfoWrapper();
     602        m_opInfo2 = OpInfoWrapper();
    608603        children = AdjacencyList();
    609604    }
     
    628623        ASSERT(m_op == GetLocalUnlinked);
    629624        m_op = GetLocal;
    630         m_opInfo = bitwise_cast<uintptr_t>(variable);
    631         m_opInfo2 = 0;
     625        m_opInfo = variable;
     626        m_opInfo2 = OpInfoWrapper();
    632627        children.setChild1(Edge(phi));
    633628    }
     
    739734    {
    740735        ASSERT(hasLazyJSValue());
    741         return *bitwise_cast<LazyJSValue*>(m_opInfo);
     736        return *m_opInfo.as<LazyJSValue*>();
    742737    }
    743738
     
    747742    {
    748743        ASSERT(op() == CreateActivation);
    749         return bitwise_cast<FrozenValue*>(m_opInfo2)->value();
     744        return m_opInfo2.as<FrozenValue*>()->value();
    750745    }
    751746
     
    815810    VariableAccessData* tryGetVariableAccessData()
    816811    {
    817         VariableAccessData* result = reinterpret_cast<VariableAccessData*>(m_opInfo);
     812        VariableAccessData* result = m_opInfo.as<VariableAccessData*>();
    818813        if (!result)
    819814            return 0;
     
    823818    VariableAccessData* variableAccessData()
    824819    {
    825         return reinterpret_cast<VariableAccessData*>(m_opInfo)->find();
     820        return m_opInfo.as<VariableAccessData*>()->find();
    826821    }
    827822   
     
    853848    {
    854849        ASSERT(hasUnlinkedLocal());
    855         return static_cast<VirtualRegister>(m_opInfo);
     850        return VirtualRegister(m_opInfo.as<int32_t>());
    856851    }
    857852   
     
    870865    {
    871866        ASSERT(hasUnlinkedMachineLocal());
    872         return VirtualRegister(m_opInfo2);
     867        return VirtualRegister(m_opInfo2.as<int32_t>());
    873868    }
    874869   
     
    887882    {
    888883        ASSERT(hasStackAccessData());
    889         return bitwise_cast<StackAccessData*>(m_opInfo);
     884        return m_opInfo.as<StackAccessData*>();
    890885    }
    891886   
     
    898893    {
    899894        ASSERT(hasPhi());
    900         return bitwise_cast<Node*>(m_opInfo);
     895        return m_opInfo.as<Node*>();
    901896    }
    902897
     
    933928    {
    934929        ASSERT(hasIdentifier());
    935         return m_opInfo;
     930        return m_opInfo.as<unsigned>();
    936931    }
    937932
     
    950945    {
    951946        ASSERT(hasGetPutInfo());
    952         return m_opInfo2;
     947        return m_opInfo2.as<unsigned>();
    953948    }
    954949
     
    974969        case PutSetterById:
    975970        case PutGetterSetterById:
    976             return m_opInfo2;
     971            return m_opInfo2.as<int32_t>();
    977972        case PutGetterByVal:
    978973        case PutSetterByVal:
    979             return m_opInfo;
     974            return m_opInfo.as<int32_t>();
    980975        default:
    981976            RELEASE_ASSERT_NOT_REACHED();
     
    10251020    {
    10261021        ASSERT(hasConstantBuffer());
    1027         return reinterpret_cast<NewArrayBufferData*>(m_opInfo);
     1022        return m_opInfo.as<NewArrayBufferData*>();
    10281023    }
    10291024   
     
    10631058        if (op() == NewArrayBuffer)
    10641059            return newArrayBufferData()->indexingType;
    1065         return m_opInfo;
     1060        return static_cast<IndexingType>(m_opInfo.as<uint32_t>());
    10661061    }
    10671062   
     
    10791074    {
    10801075        ASSERT(hasTypedArrayType());
    1081         TypedArrayType result = static_cast<TypedArrayType>(m_opInfo);
     1076        TypedArrayType result = static_cast<TypedArrayType>(m_opInfo.as<uint32_t>());
    10821077        ASSERT(isTypedView(result));
    10831078        return result;
     
    10921087    {
    10931088        ASSERT(hasInlineCapacity());
    1094         return m_opInfo;
     1089        return m_opInfo.as<unsigned>();
    10951090    }
    10961091
     
    11091104    {
    11101105        ASSERT(hasScopeOffset());
    1111         return ScopeOffset(m_opInfo);
     1106        return ScopeOffset(m_opInfo.as<uint32_t>());
    11121107    }
    11131108   
     
    11201115    {
    11211116        ASSERT(hasDirectArgumentsOffset());
    1122         return DirectArgumentsOffset(m_opInfo);
     1117        return DirectArgumentsOffset(m_opInfo.as<uint32_t>());
    11231118    }
    11241119   
     
    11301125    WriteBarrier<Unknown>* variablePointer()
    11311126    {
    1132         return bitwise_cast<WriteBarrier<Unknown>*>(m_opInfo);
     1127        return m_opInfo.as<WriteBarrier<Unknown>*>();
    11331128    }
    11341129   
     
    11531148    {
    11541149        ASSERT(hasCallVarargsData());
    1155         return bitwise_cast<CallVarargsData*>(m_opInfo);
     1150        return m_opInfo.as<CallVarargsData*>();
    11561151    }
    11571152   
     
    11641159    {
    11651160        ASSERT(hasLoadVarargsData());
    1166         return bitwise_cast<LoadVarargsData*>(m_opInfo);
     1161        return m_opInfo.as<LoadVarargsData*>();
    11671162    }
    11681163   
     
    12601255    {
    12611256        ASSERT(isJump());
    1262         return m_opInfo;
     1257        return m_opInfo.as<unsigned>();
    12631258    }
    12641259
     
    12661261    {
    12671262        ASSERT(isJump());
    1268         return *bitwise_cast<BasicBlock**>(&m_opInfo);
     1263        return *bitwise_cast<BasicBlock**>(&m_opInfo.u.pointer);
    12691264    }
    12701265   
     
    12721267    {
    12731268        ASSERT(isBranch());
    1274         return bitwise_cast<BranchData*>(m_opInfo);
     1269        return m_opInfo.as<BranchData*>();
    12751270    }
    12761271   
     
    12781273    {
    12791274        ASSERT(isSwitch());
    1280         return bitwise_cast<SwitchData*>(m_opInfo);
     1275        return m_opInfo.as<SwitchData*>();
    12811276    }
    12821277   
     
    14381433    {
    14391434        ASSERT(hasHeapPrediction());
    1440         return static_cast<SpeculatedType>(m_opInfo2);
     1435        return m_opInfo2.as<SpeculatedType>();
    14411436    }
    14421437
     
    14671462    {
    14681463        ASSERT(hasCellOperand());
    1469         return reinterpret_cast<FrozenValue*>(m_opInfo);
     1464        return m_opInfo.as<FrozenValue*>();
    14701465    }
    14711466   
     
    14791474    {
    14801475        ASSERT(hasCellOperand());
    1481         m_opInfo = bitwise_cast<uintptr_t>(value);
     1476        m_opInfo = value;
    14821477    }
    14831478   
     
    14901485    {
    14911486        ASSERT(hasWatchpointSet());
    1492         return reinterpret_cast<WatchpointSet*>(m_opInfo);
     1487        return m_opInfo.as<WatchpointSet*>();
    14931488    }
    14941489   
     
    15011496    {
    15021497        ASSERT(hasStoragePointer());
    1503         return reinterpret_cast<void*>(m_opInfo);
     1498        return m_opInfo.as<void*>();
    15041499    }
    15051500
     
    15121507    {
    15131508        ASSERT(hasUidOperand());
    1514         return reinterpret_cast<UniquedStringImpl*>(m_opInfo);
     1509        return m_opInfo.as<UniquedStringImpl*>();
    15151510    }
    15161511
     
    15221517    unsigned typeInfoOperand()
    15231518    {
    1524         ASSERT(hasTypeInfoOperand() && m_opInfo <= UCHAR_MAX);
    1525         return static_cast<unsigned>(m_opInfo);
     1519        ASSERT(hasTypeInfoOperand() && m_opInfo.as<uint32_t>() <= static_cast<uint32_t>(UCHAR_MAX));
     1520        return m_opInfo.as<uint32_t>();
    15261521    }
    15271522
     
    15411536    {
    15421537        ASSERT(hasTransition());
    1543         return reinterpret_cast<Transition*>(m_opInfo);
     1538        return m_opInfo.as<Transition*>();
    15441539    }
    15451540   
     
    15591554    {
    15601555        ASSERT(hasStructureSet());
    1561         return *reinterpret_cast<StructureSet*>(m_opInfo);
     1556        return *m_opInfo.as<StructureSet*>();
    15621557    }
    15631558   
     
    15771572    {
    15781573        ASSERT(hasStructure());
    1579         return reinterpret_cast<Structure*>(m_opInfo);
     1574        return m_opInfo.as<Structure*>();
    15801575    }
    15811576   
     
    15951590    {
    15961591        ASSERT(hasStorageAccessData());
    1597         return *bitwise_cast<StorageAccessData*>(m_opInfo);
     1592        return *m_opInfo.as<StorageAccessData*>();
    15981593    }
    15991594   
     
    16061601    {
    16071602        ASSERT(hasMultiGetByOffsetData());
    1608         return *reinterpret_cast<MultiGetByOffsetData*>(m_opInfo);
     1603        return *m_opInfo.as<MultiGetByOffsetData*>();
    16091604    }
    16101605   
     
    16171612    {
    16181613        ASSERT(hasMultiPutByOffsetData());
    1619         return *reinterpret_cast<MultiPutByOffsetData*>(m_opInfo);
     1614        return *m_opInfo.as<MultiPutByOffsetData*>();
    16201615    }
    16211616   
     
    16351630    {
    16361631        ASSERT(hasObjectMaterializationData());
    1637         return *reinterpret_cast<ObjectMaterializationData*>(m_opInfo2);
     1632        return *m_opInfo2.as<ObjectMaterializationData*>();
    16381633    }
    16391634
     
    17441739        ASSERT(hasArrayMode());
    17451740        if (op() == ArrayifyToStructure)
    1746             return ArrayMode::fromWord(m_opInfo2);
    1747         return ArrayMode::fromWord(m_opInfo);
     1741            return ArrayMode::fromWord(m_opInfo2.as<uint32_t>());
     1742        return ArrayMode::fromWord(m_opInfo.as<uint32_t>());
    17481743    }
    17491744   
     
    17781773    {
    17791774        ASSERT(hasArithMode());
    1780         return static_cast<Arith::Mode>(m_opInfo);
     1775        return static_cast<Arith::Mode>(m_opInfo.as<uint32_t>());
    17811776    }
    17821777   
     
    17941789    {
    17951790        ASSERT(hasArithRoundingMode());
    1796         return static_cast<Arith::RoundingMode>(m_opInfo);
     1791        return static_cast<Arith::RoundingMode>(m_opInfo.as<uint32_t>());
    17971792    }
    17981793
     
    18001795    {
    18011796        ASSERT(hasArithRoundingMode());
    1802         m_opInfo = static_cast<uintptr_t>(mode);
     1797        m_opInfo = static_cast<uint32_t>(mode);
    18031798    }
    18041799   
     
    18291824    Profiler::ExecutionCounter* executionCounter()
    18301825    {
    1831         return bitwise_cast<Profiler::ExecutionCounter*>(m_opInfo);
     1826        return m_opInfo.as<Profiler::ExecutionCounter*>();
    18321827    }
    18331828
     
    22722267    {
    22732268        ASSERT(hasTypeLocation());
    2274         return reinterpret_cast<TypeLocation*>(m_opInfo);
     2269        return m_opInfo.as<TypeLocation*>();
    22752270    }
    22762271
     
    22832278    {
    22842279        ASSERT(hasBasicBlockLocation());
    2285         return reinterpret_cast<BasicBlockLocation*>(m_opInfo);
     2280        return m_opInfo.as<BasicBlockLocation*>();
    22862281    }
    22872282   
     
    23092304    {
    23102305        ASSERT(op() == CreateRest || op() == GetRestLength);
    2311         return static_cast<unsigned>(m_opInfo);
     2306        return m_opInfo.as<unsigned>();
    23122307    }
    23132308
     
    23462341    // Immediate values, accesses type-checked via accessors above. The first one is
    23472342    // big enough to store a pointer.
    2348     uintptr_t m_opInfo;
    2349     uintptr_t m_opInfo2;
     2343    struct OpInfoWrapper {
     2344        OpInfoWrapper()
     2345        {
     2346            u.int64 = 0;
     2347        }
     2348        OpInfoWrapper(uint32_t intValue)
     2349        {
     2350            u.int64 = 0;
     2351            u.int32 = intValue;
     2352        }
     2353        OpInfoWrapper(uint64_t intValue)
     2354        {
     2355            u.int64 = intValue;
     2356        }
     2357        OpInfoWrapper(void* pointer)
     2358        {
     2359            u.int64 = 0;
     2360            u.pointer = pointer;
     2361        }
     2362        OpInfoWrapper& operator=(uint32_t int32)
     2363        {
     2364            u.int64 = 0;
     2365            u.int32 = int32;
     2366            return *this;
     2367        }
     2368        OpInfoWrapper& operator=(int32_t int32)
     2369        {
     2370            u.int64 = 0;
     2371            u.int32 = int32;
     2372            return *this;
     2373        }
     2374        OpInfoWrapper& operator=(uint64_t int64)
     2375        {
     2376            u.int64 = int64;
     2377            return *this;
     2378        }
     2379        OpInfoWrapper& operator=(void* pointer)
     2380        {
     2381            u.int64 = 0;
     2382            u.pointer = pointer;
     2383            return *this;
     2384        }
     2385        template <typename T>
     2386        ALWAYS_INLINE auto as() const -> typename std::enable_if<std::is_pointer<T>::value, T>::type
     2387        {
     2388            return static_cast<T>(u.pointer);
     2389        }
     2390        template <typename T>
     2391        ALWAYS_INLINE auto as() const -> typename std::enable_if<std::is_integral<T>::value && sizeof(T) == 4, T>::type
     2392        {
     2393            return u.int32;
     2394        }
     2395        template <typename T>
     2396        ALWAYS_INLINE auto as() const -> typename std::enable_if<std::is_integral<T>::value && sizeof(T) == 8, T>::type
     2397        {
     2398            return u.int64;
     2399        }
     2400        union {
     2401            uint32_t int32;
     2402            uint64_t int64;
     2403            void* pointer;
     2404        } u;
     2405    };
     2406    OpInfoWrapper m_opInfo;
     2407    OpInfoWrapper m_opInfo2;
    23502408
    23512409    // Miscellaneous data that is usually meaningless, but can hold some analysis results
  • trunk/Source/JavaScriptCore/dfg/DFGOpInfo.h

    r199075 r205107  
    3838struct OpInfo {
    3939    OpInfo() : m_value(0) { }
    40     explicit OpInfo(int32_t value) : m_value(static_cast<uintptr_t>(value)) { }
    41     explicit OpInfo(uint32_t value) : m_value(static_cast<uintptr_t>(value)) { }
    42 #if OS(DARWIN) || USE(JSVALUE64)
    43     explicit OpInfo(size_t value) : m_value(static_cast<uintptr_t>(value)) { }
     40    explicit OpInfo(int32_t value) : m_value(static_cast<uint64_t>(value)) { }
     41    explicit OpInfo(uint32_t value) : m_value(static_cast<uint64_t>(value)) { }
     42    explicit OpInfo(uint64_t value) : m_value(static_cast<uint64_t>(value)) { }
     43#if OS(DARWIN)
     44    explicit OpInfo(uintptr_t value) : m_value(static_cast<uint64_t>(value)) { }
    4445#endif
    45     explicit OpInfo(void* value) : m_value(reinterpret_cast<uintptr_t>(value)) { }
    46     uintptr_t m_value;
     46    explicit OpInfo(void* value) : m_value(static_cast<uint64_t>(reinterpret_cast<uintptr_t>(value))) { }
     47    uint64_t m_value;
    4748};
    4849
  • trunk/Source/JavaScriptCore/dfg/DFGPromotedHeapLocation.h

    r199075 r205107  
    8888    unsigned info() const { return m_info; }
    8989   
    90     OpInfo imm1() const { return OpInfo(static_cast<uint32_t>(m_kind)); }
    91     OpInfo imm2() const { return OpInfo(static_cast<uint32_t>(m_info)); }
     90    unsigned imm1() const { return static_cast<uint32_t>(m_kind); }
     91    unsigned imm2() const { return static_cast<uint32_t>(m_info); }
    9292   
    9393    unsigned hash() const
Note: See TracChangeset for help on using the changeset viewer.