JavaScriptCore/bytecode/StructureStubInfo.h
changeset 0 4f2f89ce4247
equal deleted inserted replaced
-1:000000000000 0:4f2f89ce4247
       
     1 /*
       
     2  * Copyright (C) 2008 Apple Inc. All rights reserved.
       
     3  *
       
     4  * Redistribution and use in source and binary forms, with or without
       
     5  * modification, are permitted provided that the following conditions
       
     6  * are met:
       
     7  * 1. Redistributions of source code must retain the above copyright
       
     8  *    notice, this list of conditions and the following disclaimer.
       
     9  * 2. Redistributions in binary form must reproduce the above copyright
       
    10  *    notice, this list of conditions and the following disclaimer in the
       
    11  *    documentation and/or other materials provided with the distribution.
       
    12  *
       
    13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
       
    14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
       
    15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
       
    16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
       
    17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
       
    18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
       
    19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
       
    20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
       
    21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
       
    22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
       
    23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
       
    24  */
       
    25 
       
    26 #ifndef StructureStubInfo_h
       
    27 #define StructureStubInfo_h
       
    28 
       
    29 #if ENABLE(JIT)
       
    30 
       
    31 #include "Instruction.h"
       
    32 #include "MacroAssembler.h"
       
    33 #include "Opcode.h"
       
    34 #include "Structure.h"
       
    35 
       
    36 namespace JSC {
       
    37 
       
    38     enum AccessType {
       
    39         access_get_by_id_self,
       
    40         access_get_by_id_proto,
       
    41         access_get_by_id_chain,
       
    42         access_get_by_id_self_list,
       
    43         access_get_by_id_proto_list,
       
    44         access_put_by_id_transition,
       
    45         access_put_by_id_replace,
       
    46         access_get_by_id,
       
    47         access_put_by_id,
       
    48         access_get_by_id_generic,
       
    49         access_put_by_id_generic,
       
    50         access_get_array_length,
       
    51         access_get_string_length,
       
    52     };
       
    53 
       
    54     struct StructureStubInfo {
       
    55         StructureStubInfo(AccessType accessType)
       
    56             : accessType(accessType)
       
    57             , seen(false)
       
    58         {
       
    59         }
       
    60 
       
    61         void initGetByIdSelf(Structure* baseObjectStructure)
       
    62         {
       
    63             accessType = access_get_by_id_self;
       
    64 
       
    65             u.getByIdSelf.baseObjectStructure = baseObjectStructure;
       
    66             baseObjectStructure->ref();
       
    67         }
       
    68 
       
    69         void initGetByIdProto(Structure* baseObjectStructure, Structure* prototypeStructure)
       
    70         {
       
    71             accessType = access_get_by_id_proto;
       
    72 
       
    73             u.getByIdProto.baseObjectStructure = baseObjectStructure;
       
    74             baseObjectStructure->ref();
       
    75 
       
    76             u.getByIdProto.prototypeStructure = prototypeStructure;
       
    77             prototypeStructure->ref();
       
    78         }
       
    79 
       
    80         void initGetByIdChain(Structure* baseObjectStructure, StructureChain* chain)
       
    81         {
       
    82             accessType = access_get_by_id_chain;
       
    83 
       
    84             u.getByIdChain.baseObjectStructure = baseObjectStructure;
       
    85             baseObjectStructure->ref();
       
    86 
       
    87             u.getByIdChain.chain = chain;
       
    88             chain->ref();
       
    89         }
       
    90 
       
    91         void initGetByIdSelfList(PolymorphicAccessStructureList* structureList, int listSize)
       
    92         {
       
    93             accessType = access_get_by_id_self_list;
       
    94 
       
    95             u.getByIdProtoList.structureList = structureList;
       
    96             u.getByIdProtoList.listSize = listSize;
       
    97         }
       
    98 
       
    99         void initGetByIdProtoList(PolymorphicAccessStructureList* structureList, int listSize)
       
   100         {
       
   101             accessType = access_get_by_id_proto_list;
       
   102 
       
   103             u.getByIdProtoList.structureList = structureList;
       
   104             u.getByIdProtoList.listSize = listSize;
       
   105         }
       
   106 
       
   107         // PutById*
       
   108 
       
   109         void initPutByIdTransition(Structure* previousStructure, Structure* structure, StructureChain* chain)
       
   110         {
       
   111             accessType = access_put_by_id_transition;
       
   112 
       
   113             u.putByIdTransition.previousStructure = previousStructure;
       
   114             previousStructure->ref();
       
   115 
       
   116             u.putByIdTransition.structure = structure;
       
   117             structure->ref();
       
   118 
       
   119             u.putByIdTransition.chain = chain;
       
   120             chain->ref();
       
   121         }
       
   122 
       
   123         void initPutByIdReplace(Structure* baseObjectStructure)
       
   124         {
       
   125             accessType = access_put_by_id_replace;
       
   126     
       
   127             u.putByIdReplace.baseObjectStructure = baseObjectStructure;
       
   128             baseObjectStructure->ref();
       
   129         }
       
   130 
       
   131         void deref();
       
   132 
       
   133         bool seenOnce()
       
   134         {
       
   135             return seen;
       
   136         }
       
   137 
       
   138         void setSeen()
       
   139         {
       
   140             seen = true;
       
   141         }
       
   142 
       
   143         int accessType : 31;
       
   144         int seen : 1;
       
   145 
       
   146         union {
       
   147             struct {
       
   148                 Structure* baseObjectStructure;
       
   149             } getByIdSelf;
       
   150             struct {
       
   151                 Structure* baseObjectStructure;
       
   152                 Structure* prototypeStructure;
       
   153             } getByIdProto;
       
   154             struct {
       
   155                 Structure* baseObjectStructure;
       
   156                 StructureChain* chain;
       
   157             } getByIdChain;
       
   158             struct {
       
   159                 PolymorphicAccessStructureList* structureList;
       
   160                 int listSize;
       
   161             } getByIdSelfList;
       
   162             struct {
       
   163                 PolymorphicAccessStructureList* structureList;
       
   164                 int listSize;
       
   165             } getByIdProtoList;
       
   166             struct {
       
   167                 Structure* previousStructure;
       
   168                 Structure* structure;
       
   169                 StructureChain* chain;
       
   170             } putByIdTransition;
       
   171             struct {
       
   172                 Structure* baseObjectStructure;
       
   173             } putByIdReplace;
       
   174         } u;
       
   175 
       
   176         CodeLocationLabel stubRoutine;
       
   177         CodeLocationCall callReturnLocation;
       
   178         CodeLocationLabel hotPathBegin;
       
   179     };
       
   180 
       
   181 } // namespace JSC
       
   182 
       
   183 #endif
       
   184 
       
   185 #endif // StructureStubInfo_h