Home | History | Annotate | Download | only in ic
      1 // Copyright 2016 the V8 project authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #ifndef V8_IC_HANDLER_CONFIGURATION_INL_H_
      6 #define V8_IC_HANDLER_CONFIGURATION_INL_H_
      7 
      8 #include "src/ic/handler-configuration.h"
      9 
     10 #include "src/field-index-inl.h"
     11 #include "src/objects-inl.h"
     12 
     13 namespace v8 {
     14 namespace internal {
     15 
     16 Handle<Object> LoadHandler::LoadField(Isolate* isolate,
     17                                       FieldIndex field_index) {
     18   int config = KindBits::encode(kForFields) |
     19                IsInobjectBits::encode(field_index.is_inobject()) |
     20                IsDoubleBits::encode(field_index.is_double()) |
     21                FieldOffsetBits::encode(field_index.offset());
     22   return handle(Smi::FromInt(config), isolate);
     23 }
     24 
     25 Handle<Object> LoadHandler::LoadConstant(Isolate* isolate, int descriptor) {
     26   int config = KindBits::encode(kForConstants) |
     27                IsAccessorInfoBits::encode(false) |
     28                DescriptorValueIndexBits::encode(
     29                    DescriptorArray::ToValueIndex(descriptor));
     30   return handle(Smi::FromInt(config), isolate);
     31 }
     32 
     33 Handle<Object> LoadHandler::LoadApiGetter(Isolate* isolate, int descriptor) {
     34   int config = KindBits::encode(kForConstants) |
     35                IsAccessorInfoBits::encode(true) |
     36                DescriptorValueIndexBits::encode(
     37                    DescriptorArray::ToValueIndex(descriptor));
     38   return handle(Smi::FromInt(config), isolate);
     39 }
     40 
     41 Handle<Object> LoadHandler::EnableAccessCheckOnReceiver(
     42     Isolate* isolate, Handle<Object> smi_handler) {
     43   int config = Smi::cast(*smi_handler)->value();
     44 #ifdef DEBUG
     45   Kind kind = KindBits::decode(config);
     46   DCHECK_NE(kForElements, kind);
     47 #endif
     48   config = DoAccessCheckOnReceiverBits::update(config, true);
     49   return handle(Smi::FromInt(config), isolate);
     50 }
     51 
     52 Handle<Object> LoadHandler::EnableNegativeLookupOnReceiver(
     53     Isolate* isolate, Handle<Object> smi_handler) {
     54   int config = Smi::cast(*smi_handler)->value();
     55 #ifdef DEBUG
     56   Kind kind = KindBits::decode(config);
     57   DCHECK_NE(kForElements, kind);
     58 #endif
     59   config = DoNegativeLookupOnReceiverBits::update(config, true);
     60   return handle(Smi::FromInt(config), isolate);
     61 }
     62 
     63 Handle<Object> LoadHandler::LoadNonExistent(
     64     Isolate* isolate, bool do_negative_lookup_on_receiver) {
     65   int config =
     66       KindBits::encode(kForNonExistent) |
     67       DoNegativeLookupOnReceiverBits::encode(do_negative_lookup_on_receiver);
     68   return handle(Smi::FromInt(config), isolate);
     69 }
     70 
     71 Handle<Object> LoadHandler::LoadElement(Isolate* isolate,
     72                                         ElementsKind elements_kind,
     73                                         bool convert_hole_to_undefined,
     74                                         bool is_js_array) {
     75   int config = KindBits::encode(kForElements) |
     76                ElementsKindBits::encode(elements_kind) |
     77                ConvertHoleBits::encode(convert_hole_to_undefined) |
     78                IsJsArrayBits::encode(is_js_array);
     79   return handle(Smi::FromInt(config), isolate);
     80 }
     81 
     82 Handle<Object> StoreHandler::StoreField(Isolate* isolate, Kind kind,
     83                                         int descriptor, FieldIndex field_index,
     84                                         Representation representation,
     85                                         bool extend_storage) {
     86   StoreHandler::FieldRepresentation field_rep;
     87   switch (representation.kind()) {
     88     case Representation::kSmi:
     89       field_rep = StoreHandler::kSmi;
     90       break;
     91     case Representation::kDouble:
     92       field_rep = StoreHandler::kDouble;
     93       break;
     94     case Representation::kHeapObject:
     95       field_rep = StoreHandler::kHeapObject;
     96       break;
     97     case Representation::kTagged:
     98       field_rep = StoreHandler::kTagged;
     99       break;
    100     default:
    101       UNREACHABLE();
    102       return Handle<Object>::null();
    103   }
    104   int value_index = DescriptorArray::ToValueIndex(descriptor);
    105 
    106   DCHECK(kind == kStoreField || kind == kTransitionToField ||
    107          (kind == kStoreConstField && FLAG_track_constant_fields));
    108   DCHECK_IMPLIES(extend_storage, kind == kTransitionToField);
    109   DCHECK_IMPLIES(field_index.is_inobject(), !extend_storage);
    110 
    111   int config = StoreHandler::KindBits::encode(kind) |
    112                StoreHandler::ExtendStorageBits::encode(extend_storage) |
    113                StoreHandler::IsInobjectBits::encode(field_index.is_inobject()) |
    114                StoreHandler::FieldRepresentationBits::encode(field_rep) |
    115                StoreHandler::DescriptorValueIndexBits::encode(value_index) |
    116                StoreHandler::FieldOffsetBits::encode(field_index.offset());
    117   return handle(Smi::FromInt(config), isolate);
    118 }
    119 
    120 Handle<Object> StoreHandler::StoreField(Isolate* isolate, int descriptor,
    121                                         FieldIndex field_index,
    122                                         PropertyConstness constness,
    123                                         Representation representation) {
    124   DCHECK_IMPLIES(!FLAG_track_constant_fields, constness == kMutable);
    125   Kind kind = constness == kMutable ? kStoreField : kStoreConstField;
    126   return StoreField(isolate, kind, descriptor, field_index, representation,
    127                     false);
    128 }
    129 
    130 Handle<Object> StoreHandler::TransitionToField(Isolate* isolate, int descriptor,
    131                                                FieldIndex field_index,
    132                                                Representation representation,
    133                                                bool extend_storage) {
    134   return StoreField(isolate, kTransitionToField, descriptor, field_index,
    135                     representation, extend_storage);
    136 }
    137 
    138 Handle<Object> StoreHandler::TransitionToConstant(Isolate* isolate,
    139                                                   int descriptor) {
    140   DCHECK(!FLAG_track_constant_fields);
    141   int value_index = DescriptorArray::ToValueIndex(descriptor);
    142   int config =
    143       StoreHandler::KindBits::encode(StoreHandler::kTransitionToConstant) |
    144       StoreHandler::DescriptorValueIndexBits::encode(value_index);
    145   return handle(Smi::FromInt(config), isolate);
    146 }
    147 
    148 }  // namespace internal
    149 }  // namespace v8
    150 
    151 #endif  // V8_IC_HANDLER_CONFIGURATION_INL_H_
    152