Home | History | Annotate | Download | only in src
      1 // Copyright 2015 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_CONTEXTS_INL_H_
      6 #define V8_CONTEXTS_INL_H_
      7 
      8 #include "src/contexts.h"
      9 #include "src/objects-inl.h"
     10 #include "src/objects/regexp-match-info.h"
     11 
     12 namespace v8 {
     13 namespace internal {
     14 
     15 
     16 // static
     17 ScriptContextTable* ScriptContextTable::cast(Object* context) {
     18   DCHECK(context->IsScriptContextTable());
     19   return reinterpret_cast<ScriptContextTable*>(context);
     20 }
     21 
     22 
     23 int ScriptContextTable::used() const {
     24   return Smi::cast(get(kUsedSlot))->value();
     25 }
     26 
     27 
     28 void ScriptContextTable::set_used(int used) {
     29   set(kUsedSlot, Smi::FromInt(used));
     30 }
     31 
     32 
     33 // static
     34 Handle<Context> ScriptContextTable::GetContext(Handle<ScriptContextTable> table,
     35                                                int i) {
     36   DCHECK(i < table->used());
     37   return Handle<Context>::cast(
     38       FixedArray::get(*table, i + kFirstContextSlot, table->GetIsolate()));
     39 }
     40 
     41 
     42 // static
     43 Context* Context::cast(Object* context) {
     44   DCHECK(context->IsContext());
     45   return reinterpret_cast<Context*>(context);
     46 }
     47 
     48 
     49 JSFunction* Context::closure() { return JSFunction::cast(get(CLOSURE_INDEX)); }
     50 void Context::set_closure(JSFunction* closure) { set(CLOSURE_INDEX, closure); }
     51 
     52 
     53 Context* Context::previous() {
     54   Object* result = get(PREVIOUS_INDEX);
     55   DCHECK(IsBootstrappingOrValidParentContext(result, this));
     56   return reinterpret_cast<Context*>(result);
     57 }
     58 void Context::set_previous(Context* context) { set(PREVIOUS_INDEX, context); }
     59 
     60 Object* Context::next_context_link() { return get(Context::NEXT_CONTEXT_LINK); }
     61 
     62 bool Context::has_extension() { return !extension()->IsTheHole(GetIsolate()); }
     63 HeapObject* Context::extension() {
     64   return HeapObject::cast(get(EXTENSION_INDEX));
     65 }
     66 void Context::set_extension(HeapObject* object) {
     67   set(EXTENSION_INDEX, object);
     68 }
     69 
     70 
     71 Context* Context::native_context() {
     72   Object* result = get(NATIVE_CONTEXT_INDEX);
     73   DCHECK(IsBootstrappingOrNativeContext(this->GetIsolate(), result));
     74   return reinterpret_cast<Context*>(result);
     75 }
     76 
     77 
     78 void Context::set_native_context(Context* context) {
     79   set(NATIVE_CONTEXT_INDEX, context);
     80 }
     81 
     82 
     83 bool Context::IsNativeContext() {
     84   Map* map = this->map();
     85   return map == map->GetHeap()->native_context_map();
     86 }
     87 
     88 
     89 bool Context::IsFunctionContext() {
     90   Map* map = this->map();
     91   return map == map->GetHeap()->function_context_map();
     92 }
     93 
     94 
     95 bool Context::IsCatchContext() {
     96   Map* map = this->map();
     97   return map == map->GetHeap()->catch_context_map();
     98 }
     99 
    100 
    101 bool Context::IsWithContext() {
    102   Map* map = this->map();
    103   return map == map->GetHeap()->with_context_map();
    104 }
    105 
    106 bool Context::IsDebugEvaluateContext() {
    107   Map* map = this->map();
    108   return map == map->GetHeap()->debug_evaluate_context_map();
    109 }
    110 
    111 bool Context::IsBlockContext() {
    112   Map* map = this->map();
    113   return map == map->GetHeap()->block_context_map();
    114 }
    115 
    116 
    117 bool Context::IsModuleContext() {
    118   Map* map = this->map();
    119   return map == map->GetHeap()->module_context_map();
    120 }
    121 
    122 bool Context::IsEvalContext() {
    123   Map* map = this->map();
    124   return map == map->GetHeap()->eval_context_map();
    125 }
    126 
    127 bool Context::IsScriptContext() {
    128   Map* map = this->map();
    129   return map == map->GetHeap()->script_context_map();
    130 }
    131 
    132 bool Context::OptimizedCodeMapIsCleared() {
    133   return osr_code_table() == GetHeap()->empty_fixed_array();
    134 }
    135 
    136 bool Context::HasSameSecurityTokenAs(Context* that) {
    137   return this->native_context()->security_token() ==
    138          that->native_context()->security_token();
    139 }
    140 
    141 
    142 #define NATIVE_CONTEXT_FIELD_ACCESSORS(index, type, name) \
    143   void Context::set_##name(type* value) {                 \
    144     DCHECK(IsNativeContext());                            \
    145     set(index, value);                                    \
    146   }                                                       \
    147   bool Context::is_##name(type* value) {                  \
    148     DCHECK(IsNativeContext());                            \
    149     return type::cast(get(index)) == value;               \
    150   }                                                       \
    151   type* Context::name() {                                 \
    152     DCHECK(IsNativeContext());                            \
    153     return type::cast(get(index));                        \
    154   }
    155 NATIVE_CONTEXT_FIELDS(NATIVE_CONTEXT_FIELD_ACCESSORS)
    156 #undef NATIVE_CONTEXT_FIELD_ACCESSORS
    157 
    158 
    159 }  // namespace internal
    160 }  // namespace v8
    161 
    162 #endif  // V8_CONTEXTS_INL_H_
    163