| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include <stdlib.h> | 5 #include <stdlib.h> |
| 6 | 6 |
| 7 #include "src/v8.h" | 7 #include "src/v8.h" |
| 8 | 8 |
| 9 #include "src/scopeinfo.h" | 9 #include "src/scopeinfo.h" |
| 10 #include "src/scopes.h" | 10 #include "src/scopes.h" |
| 11 | 11 |
| 12 namespace v8 { | 12 namespace v8 { |
| 13 namespace internal { | 13 namespace internal { |
| 14 | 14 |
| 15 | 15 |
| 16 Handle<ScopeInfo> ScopeInfo::Create(Scope* scope, Zone* zone) { | 16 Handle<ScopeInfo> ScopeInfo::Create(Scope* scope, Zone* zone) { |
| 17 // Collect stack and context locals. | 17 // Collect stack and context locals. |
| 18 ZoneList<Variable*> stack_locals(scope->StackLocalCount(), zone); | 18 ZoneList<Variable*> stack_locals(scope->StackLocalCount(), zone); |
| 19 ZoneList<Variable*> context_locals(scope->ContextLocalCount(), zone); | 19 ZoneList<Variable*> context_locals(scope->ContextLocalCount(), zone); |
| 20 scope->CollectStackAndContextLocals(&stack_locals, &context_locals); | 20 scope->CollectStackAndContextLocals(&stack_locals, &context_locals); |
| 21 const int stack_local_count = stack_locals.length(); | 21 const int stack_local_count = stack_locals.length(); |
| 22 const int context_local_count = context_locals.length(); | 22 const int context_local_count = context_locals.length(); |
| 23 // Make sure we allocate the correct amount. | 23 // Make sure we allocate the correct amount. |
| 24 ASSERT(scope->StackLocalCount() == stack_local_count); | 24 DCHECK(scope->StackLocalCount() == stack_local_count); |
| 25 ASSERT(scope->ContextLocalCount() == context_local_count); | 25 DCHECK(scope->ContextLocalCount() == context_local_count); |
| 26 | 26 |
| 27 // Determine use and location of the function variable if it is present. | 27 // Determine use and location of the function variable if it is present. |
| 28 FunctionVariableInfo function_name_info; | 28 FunctionVariableInfo function_name_info; |
| 29 VariableMode function_variable_mode; | 29 VariableMode function_variable_mode; |
| 30 if (scope->is_function_scope() && scope->function() != NULL) { | 30 if (scope->is_function_scope() && scope->function() != NULL) { |
| 31 Variable* var = scope->function()->proxy()->var(); | 31 Variable* var = scope->function()->proxy()->var(); |
| 32 if (!var->is_used()) { | 32 if (!var->is_used()) { |
| 33 function_name_info = UNUSED; | 33 function_name_info = UNUSED; |
| 34 } else if (var->IsContextSlot()) { | 34 } else if (var->IsContextSlot()) { |
| 35 function_name_info = CONTEXT; | 35 function_name_info = CONTEXT; |
| 36 } else { | 36 } else { |
| 37 ASSERT(var->IsStackLocal()); | 37 DCHECK(var->IsStackLocal()); |
| 38 function_name_info = STACK; | 38 function_name_info = STACK; |
| 39 } | 39 } |
| 40 function_variable_mode = var->mode(); | 40 function_variable_mode = var->mode(); |
| 41 } else { | 41 } else { |
| 42 function_name_info = NONE; | 42 function_name_info = NONE; |
| 43 function_variable_mode = VAR; | 43 function_variable_mode = VAR; |
| 44 } | 44 } |
| 45 | 45 |
| 46 const bool has_function_name = function_name_info != NONE; | 46 const bool has_function_name = function_name_info != NONE; |
| 47 const int parameter_count = scope->num_parameters(); | 47 const int parameter_count = scope->num_parameters(); |
| (...skipping 10 matching lines...) Expand all Loading... |
| 58 StrictModeField::encode(scope->strict_mode()) | | 58 StrictModeField::encode(scope->strict_mode()) | |
| 59 FunctionVariableField::encode(function_name_info) | | 59 FunctionVariableField::encode(function_name_info) | |
| 60 FunctionVariableMode::encode(function_variable_mode); | 60 FunctionVariableMode::encode(function_variable_mode); |
| 61 scope_info->SetFlags(flags); | 61 scope_info->SetFlags(flags); |
| 62 scope_info->SetParameterCount(parameter_count); | 62 scope_info->SetParameterCount(parameter_count); |
| 63 scope_info->SetStackLocalCount(stack_local_count); | 63 scope_info->SetStackLocalCount(stack_local_count); |
| 64 scope_info->SetContextLocalCount(context_local_count); | 64 scope_info->SetContextLocalCount(context_local_count); |
| 65 | 65 |
| 66 int index = kVariablePartIndex; | 66 int index = kVariablePartIndex; |
| 67 // Add parameters. | 67 // Add parameters. |
| 68 ASSERT(index == scope_info->ParameterEntriesIndex()); | 68 DCHECK(index == scope_info->ParameterEntriesIndex()); |
| 69 for (int i = 0; i < parameter_count; ++i) { | 69 for (int i = 0; i < parameter_count; ++i) { |
| 70 scope_info->set(index++, *scope->parameter(i)->name()); | 70 scope_info->set(index++, *scope->parameter(i)->name()); |
| 71 } | 71 } |
| 72 | 72 |
| 73 // Add stack locals' names. We are assuming that the stack locals' | 73 // Add stack locals' names. We are assuming that the stack locals' |
| 74 // slots are allocated in increasing order, so we can simply add | 74 // slots are allocated in increasing order, so we can simply add |
| 75 // them to the ScopeInfo object. | 75 // them to the ScopeInfo object. |
| 76 ASSERT(index == scope_info->StackLocalEntriesIndex()); | 76 DCHECK(index == scope_info->StackLocalEntriesIndex()); |
| 77 for (int i = 0; i < stack_local_count; ++i) { | 77 for (int i = 0; i < stack_local_count; ++i) { |
| 78 ASSERT(stack_locals[i]->index() == i); | 78 DCHECK(stack_locals[i]->index() == i); |
| 79 scope_info->set(index++, *stack_locals[i]->name()); | 79 scope_info->set(index++, *stack_locals[i]->name()); |
| 80 } | 80 } |
| 81 | 81 |
| 82 // Due to usage analysis, context-allocated locals are not necessarily in | 82 // Due to usage analysis, context-allocated locals are not necessarily in |
| 83 // increasing order: Some of them may be parameters which are allocated before | 83 // increasing order: Some of them may be parameters which are allocated before |
| 84 // the non-parameter locals. When the non-parameter locals are sorted | 84 // the non-parameter locals. When the non-parameter locals are sorted |
| 85 // according to usage, the allocated slot indices may not be in increasing | 85 // according to usage, the allocated slot indices may not be in increasing |
| 86 // order with the variable list anymore. Thus, we first need to sort them by | 86 // order with the variable list anymore. Thus, we first need to sort them by |
| 87 // context slot index before adding them to the ScopeInfo object. | 87 // context slot index before adding them to the ScopeInfo object. |
| 88 context_locals.Sort(&Variable::CompareIndex); | 88 context_locals.Sort(&Variable::CompareIndex); |
| 89 | 89 |
| 90 // Add context locals' names. | 90 // Add context locals' names. |
| 91 ASSERT(index == scope_info->ContextLocalNameEntriesIndex()); | 91 DCHECK(index == scope_info->ContextLocalNameEntriesIndex()); |
| 92 for (int i = 0; i < context_local_count; ++i) { | 92 for (int i = 0; i < context_local_count; ++i) { |
| 93 scope_info->set(index++, *context_locals[i]->name()); | 93 scope_info->set(index++, *context_locals[i]->name()); |
| 94 } | 94 } |
| 95 | 95 |
| 96 // Add context locals' info. | 96 // Add context locals' info. |
| 97 ASSERT(index == scope_info->ContextLocalInfoEntriesIndex()); | 97 DCHECK(index == scope_info->ContextLocalInfoEntriesIndex()); |
| 98 for (int i = 0; i < context_local_count; ++i) { | 98 for (int i = 0; i < context_local_count; ++i) { |
| 99 Variable* var = context_locals[i]; | 99 Variable* var = context_locals[i]; |
| 100 uint32_t value = | 100 uint32_t value = |
| 101 ContextLocalMode::encode(var->mode()) | | 101 ContextLocalMode::encode(var->mode()) | |
| 102 ContextLocalInitFlag::encode(var->initialization_flag()) | | 102 ContextLocalInitFlag::encode(var->initialization_flag()) | |
| 103 ContextLocalMaybeAssignedFlag::encode(var->maybe_assigned()); | 103 ContextLocalMaybeAssignedFlag::encode(var->maybe_assigned()); |
| 104 scope_info->set(index++, Smi::FromInt(value)); | 104 scope_info->set(index++, Smi::FromInt(value)); |
| 105 } | 105 } |
| 106 | 106 |
| 107 // If present, add the function variable name and its index. | 107 // If present, add the function variable name and its index. |
| 108 ASSERT(index == scope_info->FunctionNameEntryIndex()); | 108 DCHECK(index == scope_info->FunctionNameEntryIndex()); |
| 109 if (has_function_name) { | 109 if (has_function_name) { |
| 110 int var_index = scope->function()->proxy()->var()->index(); | 110 int var_index = scope->function()->proxy()->var()->index(); |
| 111 scope_info->set(index++, *scope->function()->proxy()->name()); | 111 scope_info->set(index++, *scope->function()->proxy()->name()); |
| 112 scope_info->set(index++, Smi::FromInt(var_index)); | 112 scope_info->set(index++, Smi::FromInt(var_index)); |
| 113 ASSERT(function_name_info != STACK || | 113 DCHECK(function_name_info != STACK || |
| 114 (var_index == scope_info->StackLocalCount() && | 114 (var_index == scope_info->StackLocalCount() && |
| 115 var_index == scope_info->StackSlotCount() - 1)); | 115 var_index == scope_info->StackSlotCount() - 1)); |
| 116 ASSERT(function_name_info != CONTEXT || | 116 DCHECK(function_name_info != CONTEXT || |
| 117 var_index == scope_info->ContextLength() - 1); | 117 var_index == scope_info->ContextLength() - 1); |
| 118 } | 118 } |
| 119 | 119 |
| 120 ASSERT(index == scope_info->length()); | 120 DCHECK(index == scope_info->length()); |
| 121 ASSERT(scope->num_parameters() == scope_info->ParameterCount()); | 121 DCHECK(scope->num_parameters() == scope_info->ParameterCount()); |
| 122 ASSERT(scope->num_stack_slots() == scope_info->StackSlotCount()); | 122 DCHECK(scope->num_stack_slots() == scope_info->StackSlotCount()); |
| 123 ASSERT(scope->num_heap_slots() == scope_info->ContextLength() || | 123 DCHECK(scope->num_heap_slots() == scope_info->ContextLength() || |
| 124 (scope->num_heap_slots() == kVariablePartIndex && | 124 (scope->num_heap_slots() == kVariablePartIndex && |
| 125 scope_info->ContextLength() == 0)); | 125 scope_info->ContextLength() == 0)); |
| 126 return scope_info; | 126 return scope_info; |
| 127 } | 127 } |
| 128 | 128 |
| 129 | 129 |
| 130 ScopeInfo* ScopeInfo::Empty(Isolate* isolate) { | 130 ScopeInfo* ScopeInfo::Empty(Isolate* isolate) { |
| 131 return reinterpret_cast<ScopeInfo*>(isolate->heap()->empty_fixed_array()); | 131 return reinterpret_cast<ScopeInfo*>(isolate->heap()->empty_fixed_array()); |
| 132 } | 132 } |
| 133 | 133 |
| 134 | 134 |
| 135 ScopeType ScopeInfo::scope_type() { | 135 ScopeType ScopeInfo::scope_type() { |
| 136 ASSERT(length() > 0); | 136 DCHECK(length() > 0); |
| 137 return ScopeTypeField::decode(Flags()); | 137 return ScopeTypeField::decode(Flags()); |
| 138 } | 138 } |
| 139 | 139 |
| 140 | 140 |
| 141 bool ScopeInfo::CallsEval() { | 141 bool ScopeInfo::CallsEval() { |
| 142 return length() > 0 && CallsEvalField::decode(Flags()); | 142 return length() > 0 && CallsEvalField::decode(Flags()); |
| 143 } | 143 } |
| 144 | 144 |
| 145 | 145 |
| 146 StrictMode ScopeInfo::strict_mode() { | 146 StrictMode ScopeInfo::strict_mode() { |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 199 } | 199 } |
| 200 } | 200 } |
| 201 | 201 |
| 202 | 202 |
| 203 bool ScopeInfo::HasContext() { | 203 bool ScopeInfo::HasContext() { |
| 204 return ContextLength() > 0; | 204 return ContextLength() > 0; |
| 205 } | 205 } |
| 206 | 206 |
| 207 | 207 |
| 208 String* ScopeInfo::FunctionName() { | 208 String* ScopeInfo::FunctionName() { |
| 209 ASSERT(HasFunctionName()); | 209 DCHECK(HasFunctionName()); |
| 210 return String::cast(get(FunctionNameEntryIndex())); | 210 return String::cast(get(FunctionNameEntryIndex())); |
| 211 } | 211 } |
| 212 | 212 |
| 213 | 213 |
| 214 String* ScopeInfo::ParameterName(int var) { | 214 String* ScopeInfo::ParameterName(int var) { |
| 215 ASSERT(0 <= var && var < ParameterCount()); | 215 DCHECK(0 <= var && var < ParameterCount()); |
| 216 int info_index = ParameterEntriesIndex() + var; | 216 int info_index = ParameterEntriesIndex() + var; |
| 217 return String::cast(get(info_index)); | 217 return String::cast(get(info_index)); |
| 218 } | 218 } |
| 219 | 219 |
| 220 | 220 |
| 221 String* ScopeInfo::LocalName(int var) { | 221 String* ScopeInfo::LocalName(int var) { |
| 222 ASSERT(0 <= var && var < LocalCount()); | 222 DCHECK(0 <= var && var < LocalCount()); |
| 223 ASSERT(StackLocalEntriesIndex() + StackLocalCount() == | 223 DCHECK(StackLocalEntriesIndex() + StackLocalCount() == |
| 224 ContextLocalNameEntriesIndex()); | 224 ContextLocalNameEntriesIndex()); |
| 225 int info_index = StackLocalEntriesIndex() + var; | 225 int info_index = StackLocalEntriesIndex() + var; |
| 226 return String::cast(get(info_index)); | 226 return String::cast(get(info_index)); |
| 227 } | 227 } |
| 228 | 228 |
| 229 | 229 |
| 230 String* ScopeInfo::StackLocalName(int var) { | 230 String* ScopeInfo::StackLocalName(int var) { |
| 231 ASSERT(0 <= var && var < StackLocalCount()); | 231 DCHECK(0 <= var && var < StackLocalCount()); |
| 232 int info_index = StackLocalEntriesIndex() + var; | 232 int info_index = StackLocalEntriesIndex() + var; |
| 233 return String::cast(get(info_index)); | 233 return String::cast(get(info_index)); |
| 234 } | 234 } |
| 235 | 235 |
| 236 | 236 |
| 237 String* ScopeInfo::ContextLocalName(int var) { | 237 String* ScopeInfo::ContextLocalName(int var) { |
| 238 ASSERT(0 <= var && var < ContextLocalCount()); | 238 DCHECK(0 <= var && var < ContextLocalCount()); |
| 239 int info_index = ContextLocalNameEntriesIndex() + var; | 239 int info_index = ContextLocalNameEntriesIndex() + var; |
| 240 return String::cast(get(info_index)); | 240 return String::cast(get(info_index)); |
| 241 } | 241 } |
| 242 | 242 |
| 243 | 243 |
| 244 VariableMode ScopeInfo::ContextLocalMode(int var) { | 244 VariableMode ScopeInfo::ContextLocalMode(int var) { |
| 245 ASSERT(0 <= var && var < ContextLocalCount()); | 245 DCHECK(0 <= var && var < ContextLocalCount()); |
| 246 int info_index = ContextLocalInfoEntriesIndex() + var; | 246 int info_index = ContextLocalInfoEntriesIndex() + var; |
| 247 int value = Smi::cast(get(info_index))->value(); | 247 int value = Smi::cast(get(info_index))->value(); |
| 248 return ContextLocalMode::decode(value); | 248 return ContextLocalMode::decode(value); |
| 249 } | 249 } |
| 250 | 250 |
| 251 | 251 |
| 252 InitializationFlag ScopeInfo::ContextLocalInitFlag(int var) { | 252 InitializationFlag ScopeInfo::ContextLocalInitFlag(int var) { |
| 253 ASSERT(0 <= var && var < ContextLocalCount()); | 253 DCHECK(0 <= var && var < ContextLocalCount()); |
| 254 int info_index = ContextLocalInfoEntriesIndex() + var; | 254 int info_index = ContextLocalInfoEntriesIndex() + var; |
| 255 int value = Smi::cast(get(info_index))->value(); | 255 int value = Smi::cast(get(info_index))->value(); |
| 256 return ContextLocalInitFlag::decode(value); | 256 return ContextLocalInitFlag::decode(value); |
| 257 } | 257 } |
| 258 | 258 |
| 259 | 259 |
| 260 MaybeAssignedFlag ScopeInfo::ContextLocalMaybeAssignedFlag(int var) { | 260 MaybeAssignedFlag ScopeInfo::ContextLocalMaybeAssignedFlag(int var) { |
| 261 ASSERT(0 <= var && var < ContextLocalCount()); | 261 DCHECK(0 <= var && var < ContextLocalCount()); |
| 262 int info_index = ContextLocalInfoEntriesIndex() + var; | 262 int info_index = ContextLocalInfoEntriesIndex() + var; |
| 263 int value = Smi::cast(get(info_index))->value(); | 263 int value = Smi::cast(get(info_index))->value(); |
| 264 return ContextLocalMaybeAssignedFlag::decode(value); | 264 return ContextLocalMaybeAssignedFlag::decode(value); |
| 265 } | 265 } |
| 266 | 266 |
| 267 | 267 |
| 268 bool ScopeInfo::LocalIsSynthetic(int var) { | 268 bool ScopeInfo::LocalIsSynthetic(int var) { |
| 269 ASSERT(0 <= var && var < LocalCount()); | 269 DCHECK(0 <= var && var < LocalCount()); |
| 270 // There's currently no flag stored on the ScopeInfo to indicate that a | 270 // There's currently no flag stored on the ScopeInfo to indicate that a |
| 271 // variable is a compiler-introduced temporary. However, to avoid conflict | 271 // variable is a compiler-introduced temporary. However, to avoid conflict |
| 272 // with user declarations, the current temporaries like .generator_object and | 272 // with user declarations, the current temporaries like .generator_object and |
| 273 // .result start with a dot, so we can use that as a flag. It's a hack! | 273 // .result start with a dot, so we can use that as a flag. It's a hack! |
| 274 Handle<String> name(LocalName(var)); | 274 Handle<String> name(LocalName(var)); |
| 275 return name->length() > 0 && name->Get(0) == '.'; | 275 return name->length() > 0 && name->Get(0) == '.'; |
| 276 } | 276 } |
| 277 | 277 |
| 278 | 278 |
| 279 int ScopeInfo::StackSlotIndex(String* name) { | 279 int ScopeInfo::StackSlotIndex(String* name) { |
| 280 ASSERT(name->IsInternalizedString()); | 280 DCHECK(name->IsInternalizedString()); |
| 281 if (length() > 0) { | 281 if (length() > 0) { |
| 282 int start = StackLocalEntriesIndex(); | 282 int start = StackLocalEntriesIndex(); |
| 283 int end = StackLocalEntriesIndex() + StackLocalCount(); | 283 int end = StackLocalEntriesIndex() + StackLocalCount(); |
| 284 for (int i = start; i < end; ++i) { | 284 for (int i = start; i < end; ++i) { |
| 285 if (name == get(i)) { | 285 if (name == get(i)) { |
| 286 return i - start; | 286 return i - start; |
| 287 } | 287 } |
| 288 } | 288 } |
| 289 } | 289 } |
| 290 return -1; | 290 return -1; |
| 291 } | 291 } |
| 292 | 292 |
| 293 | 293 |
| 294 int ScopeInfo::ContextSlotIndex(Handle<ScopeInfo> scope_info, | 294 int ScopeInfo::ContextSlotIndex(Handle<ScopeInfo> scope_info, |
| 295 Handle<String> name, VariableMode* mode, | 295 Handle<String> name, VariableMode* mode, |
| 296 InitializationFlag* init_flag, | 296 InitializationFlag* init_flag, |
| 297 MaybeAssignedFlag* maybe_assigned_flag) { | 297 MaybeAssignedFlag* maybe_assigned_flag) { |
| 298 ASSERT(name->IsInternalizedString()); | 298 DCHECK(name->IsInternalizedString()); |
| 299 ASSERT(mode != NULL); | 299 DCHECK(mode != NULL); |
| 300 ASSERT(init_flag != NULL); | 300 DCHECK(init_flag != NULL); |
| 301 if (scope_info->length() > 0) { | 301 if (scope_info->length() > 0) { |
| 302 ContextSlotCache* context_slot_cache = | 302 ContextSlotCache* context_slot_cache = |
| 303 scope_info->GetIsolate()->context_slot_cache(); | 303 scope_info->GetIsolate()->context_slot_cache(); |
| 304 int result = context_slot_cache->Lookup(*scope_info, *name, mode, init_flag, | 304 int result = context_slot_cache->Lookup(*scope_info, *name, mode, init_flag, |
| 305 maybe_assigned_flag); | 305 maybe_assigned_flag); |
| 306 if (result != ContextSlotCache::kNotFound) { | 306 if (result != ContextSlotCache::kNotFound) { |
| 307 ASSERT(result < scope_info->ContextLength()); | 307 DCHECK(result < scope_info->ContextLength()); |
| 308 return result; | 308 return result; |
| 309 } | 309 } |
| 310 | 310 |
| 311 int start = scope_info->ContextLocalNameEntriesIndex(); | 311 int start = scope_info->ContextLocalNameEntriesIndex(); |
| 312 int end = scope_info->ContextLocalNameEntriesIndex() + | 312 int end = scope_info->ContextLocalNameEntriesIndex() + |
| 313 scope_info->ContextLocalCount(); | 313 scope_info->ContextLocalCount(); |
| 314 for (int i = start; i < end; ++i) { | 314 for (int i = start; i < end; ++i) { |
| 315 if (*name == scope_info->get(i)) { | 315 if (*name == scope_info->get(i)) { |
| 316 int var = i - start; | 316 int var = i - start; |
| 317 *mode = scope_info->ContextLocalMode(var); | 317 *mode = scope_info->ContextLocalMode(var); |
| 318 *init_flag = scope_info->ContextLocalInitFlag(var); | 318 *init_flag = scope_info->ContextLocalInitFlag(var); |
| 319 *maybe_assigned_flag = scope_info->ContextLocalMaybeAssignedFlag(var); | 319 *maybe_assigned_flag = scope_info->ContextLocalMaybeAssignedFlag(var); |
| 320 result = Context::MIN_CONTEXT_SLOTS + var; | 320 result = Context::MIN_CONTEXT_SLOTS + var; |
| 321 context_slot_cache->Update(scope_info, name, *mode, *init_flag, | 321 context_slot_cache->Update(scope_info, name, *mode, *init_flag, |
| 322 *maybe_assigned_flag, result); | 322 *maybe_assigned_flag, result); |
| 323 ASSERT(result < scope_info->ContextLength()); | 323 DCHECK(result < scope_info->ContextLength()); |
| 324 return result; | 324 return result; |
| 325 } | 325 } |
| 326 } | 326 } |
| 327 // Cache as not found. Mode, init flag and maybe assigned flag don't matter. | 327 // Cache as not found. Mode, init flag and maybe assigned flag don't matter. |
| 328 context_slot_cache->Update(scope_info, name, INTERNAL, kNeedsInitialization, | 328 context_slot_cache->Update(scope_info, name, INTERNAL, kNeedsInitialization, |
| 329 kNotAssigned, -1); | 329 kNotAssigned, -1); |
| 330 } | 330 } |
| 331 return -1; | 331 return -1; |
| 332 } | 332 } |
| 333 | 333 |
| 334 | 334 |
| 335 int ScopeInfo::ParameterIndex(String* name) { | 335 int ScopeInfo::ParameterIndex(String* name) { |
| 336 ASSERT(name->IsInternalizedString()); | 336 DCHECK(name->IsInternalizedString()); |
| 337 if (length() > 0) { | 337 if (length() > 0) { |
| 338 // We must read parameters from the end since for | 338 // We must read parameters from the end since for |
| 339 // multiply declared parameters the value of the | 339 // multiply declared parameters the value of the |
| 340 // last declaration of that parameter is used | 340 // last declaration of that parameter is used |
| 341 // inside a function (and thus we need to look | 341 // inside a function (and thus we need to look |
| 342 // at the last index). Was bug# 1110337. | 342 // at the last index). Was bug# 1110337. |
| 343 int start = ParameterEntriesIndex(); | 343 int start = ParameterEntriesIndex(); |
| 344 int end = ParameterEntriesIndex() + ParameterCount(); | 344 int end = ParameterEntriesIndex() + ParameterCount(); |
| 345 for (int i = end - 1; i >= start; --i) { | 345 for (int i = end - 1; i >= start; --i) { |
| 346 if (name == get(i)) { | 346 if (name == get(i)) { |
| 347 return i - start; | 347 return i - start; |
| 348 } | 348 } |
| 349 } | 349 } |
| 350 } | 350 } |
| 351 return -1; | 351 return -1; |
| 352 } | 352 } |
| 353 | 353 |
| 354 | 354 |
| 355 int ScopeInfo::FunctionContextSlotIndex(String* name, VariableMode* mode) { | 355 int ScopeInfo::FunctionContextSlotIndex(String* name, VariableMode* mode) { |
| 356 ASSERT(name->IsInternalizedString()); | 356 DCHECK(name->IsInternalizedString()); |
| 357 ASSERT(mode != NULL); | 357 DCHECK(mode != NULL); |
| 358 if (length() > 0) { | 358 if (length() > 0) { |
| 359 if (FunctionVariableField::decode(Flags()) == CONTEXT && | 359 if (FunctionVariableField::decode(Flags()) == CONTEXT && |
| 360 FunctionName() == name) { | 360 FunctionName() == name) { |
| 361 *mode = FunctionVariableMode::decode(Flags()); | 361 *mode = FunctionVariableMode::decode(Flags()); |
| 362 return Smi::cast(get(FunctionNameEntryIndex() + 1))->value(); | 362 return Smi::cast(get(FunctionNameEntryIndex() + 1))->value(); |
| 363 } | 363 } |
| 364 } | 364 } |
| 365 return -1; | 365 return -1; |
| 366 } | 366 } |
| 367 | 367 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 385 Handle<String>(String::cast(scope_info->get(i + start))), | 385 Handle<String>(String::cast(scope_info->get(i + start))), |
| 386 Handle<Object>(context->get(context_index), isolate), | 386 Handle<Object>(context->get(context_index), isolate), |
| 387 ::NONE), | 387 ::NONE), |
| 388 false); | 388 false); |
| 389 } | 389 } |
| 390 return true; | 390 return true; |
| 391 } | 391 } |
| 392 | 392 |
| 393 | 393 |
| 394 int ScopeInfo::ParameterEntriesIndex() { | 394 int ScopeInfo::ParameterEntriesIndex() { |
| 395 ASSERT(length() > 0); | 395 DCHECK(length() > 0); |
| 396 return kVariablePartIndex; | 396 return kVariablePartIndex; |
| 397 } | 397 } |
| 398 | 398 |
| 399 | 399 |
| 400 int ScopeInfo::StackLocalEntriesIndex() { | 400 int ScopeInfo::StackLocalEntriesIndex() { |
| 401 return ParameterEntriesIndex() + ParameterCount(); | 401 return ParameterEntriesIndex() + ParameterCount(); |
| 402 } | 402 } |
| 403 | 403 |
| 404 | 404 |
| 405 int ScopeInfo::ContextLocalNameEntriesIndex() { | 405 int ScopeInfo::ContextLocalNameEntriesIndex() { |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 441 return kNotFound; | 441 return kNotFound; |
| 442 } | 442 } |
| 443 | 443 |
| 444 | 444 |
| 445 void ContextSlotCache::Update(Handle<Object> data, Handle<String> name, | 445 void ContextSlotCache::Update(Handle<Object> data, Handle<String> name, |
| 446 VariableMode mode, InitializationFlag init_flag, | 446 VariableMode mode, InitializationFlag init_flag, |
| 447 MaybeAssignedFlag maybe_assigned_flag, | 447 MaybeAssignedFlag maybe_assigned_flag, |
| 448 int slot_index) { | 448 int slot_index) { |
| 449 DisallowHeapAllocation no_gc; | 449 DisallowHeapAllocation no_gc; |
| 450 Handle<String> internalized_name; | 450 Handle<String> internalized_name; |
| 451 ASSERT(slot_index > kNotFound); | 451 DCHECK(slot_index > kNotFound); |
| 452 if (StringTable::InternalizeStringIfExists(name->GetIsolate(), name). | 452 if (StringTable::InternalizeStringIfExists(name->GetIsolate(), name). |
| 453 ToHandle(&internalized_name)) { | 453 ToHandle(&internalized_name)) { |
| 454 int index = Hash(*data, *internalized_name); | 454 int index = Hash(*data, *internalized_name); |
| 455 Key& key = keys_[index]; | 455 Key& key = keys_[index]; |
| 456 key.data = *data; | 456 key.data = *data; |
| 457 key.name = *internalized_name; | 457 key.name = *internalized_name; |
| 458 // Please note value only takes a uint as index. | 458 // Please note value only takes a uint as index. |
| 459 values_[index] = Value(mode, init_flag, maybe_assigned_flag, | 459 values_[index] = Value(mode, init_flag, maybe_assigned_flag, |
| 460 slot_index - kNotFound).raw(); | 460 slot_index - kNotFound).raw(); |
| 461 #ifdef DEBUG | 461 #ifdef DEBUG |
| (...skipping 14 matching lines...) Expand all Loading... |
| 476 VariableMode mode, | 476 VariableMode mode, |
| 477 InitializationFlag init_flag, | 477 InitializationFlag init_flag, |
| 478 MaybeAssignedFlag maybe_assigned_flag, | 478 MaybeAssignedFlag maybe_assigned_flag, |
| 479 int slot_index) { | 479 int slot_index) { |
| 480 DisallowHeapAllocation no_gc; | 480 DisallowHeapAllocation no_gc; |
| 481 Handle<String> internalized_name; | 481 Handle<String> internalized_name; |
| 482 if (StringTable::InternalizeStringIfExists(name->GetIsolate(), name). | 482 if (StringTable::InternalizeStringIfExists(name->GetIsolate(), name). |
| 483 ToHandle(&internalized_name)) { | 483 ToHandle(&internalized_name)) { |
| 484 int index = Hash(*data, *name); | 484 int index = Hash(*data, *name); |
| 485 Key& key = keys_[index]; | 485 Key& key = keys_[index]; |
| 486 ASSERT(key.data == *data); | 486 DCHECK(key.data == *data); |
| 487 ASSERT(key.name->Equals(*name)); | 487 DCHECK(key.name->Equals(*name)); |
| 488 Value result(values_[index]); | 488 Value result(values_[index]); |
| 489 ASSERT(result.mode() == mode); | 489 DCHECK(result.mode() == mode); |
| 490 ASSERT(result.initialization_flag() == init_flag); | 490 DCHECK(result.initialization_flag() == init_flag); |
| 491 ASSERT(result.maybe_assigned_flag() == maybe_assigned_flag); | 491 DCHECK(result.maybe_assigned_flag() == maybe_assigned_flag); |
| 492 ASSERT(result.index() + kNotFound == slot_index); | 492 DCHECK(result.index() + kNotFound == slot_index); |
| 493 } | 493 } |
| 494 } | 494 } |
| 495 | 495 |
| 496 | 496 |
| 497 static void PrintList(const char* list_name, | 497 static void PrintList(const char* list_name, |
| 498 int nof_internal_slots, | 498 int nof_internal_slots, |
| 499 int start, | 499 int start, |
| 500 int end, | 500 int end, |
| 501 ScopeInfo* scope_info) { | 501 ScopeInfo* scope_info) { |
| 502 if (start < end) { | 502 if (start < end) { |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 547 Handle<ModuleInfo> ModuleInfo::Create( | 547 Handle<ModuleInfo> ModuleInfo::Create( |
| 548 Isolate* isolate, Interface* interface, Scope* scope) { | 548 Isolate* isolate, Interface* interface, Scope* scope) { |
| 549 Handle<ModuleInfo> info = Allocate(isolate, interface->Length()); | 549 Handle<ModuleInfo> info = Allocate(isolate, interface->Length()); |
| 550 info->set_host_index(interface->Index()); | 550 info->set_host_index(interface->Index()); |
| 551 int i = 0; | 551 int i = 0; |
| 552 for (Interface::Iterator it = interface->iterator(); | 552 for (Interface::Iterator it = interface->iterator(); |
| 553 !it.done(); it.Advance(), ++i) { | 553 !it.done(); it.Advance(), ++i) { |
| 554 Variable* var = scope->LookupLocal(it.name()); | 554 Variable* var = scope->LookupLocal(it.name()); |
| 555 info->set_name(i, *(it.name()->string())); | 555 info->set_name(i, *(it.name()->string())); |
| 556 info->set_mode(i, var->mode()); | 556 info->set_mode(i, var->mode()); |
| 557 ASSERT((var->mode() == MODULE) == (it.interface()->IsModule())); | 557 DCHECK((var->mode() == MODULE) == (it.interface()->IsModule())); |
| 558 if (var->mode() == MODULE) { | 558 if (var->mode() == MODULE) { |
| 559 ASSERT(it.interface()->IsFrozen()); | 559 DCHECK(it.interface()->IsFrozen()); |
| 560 ASSERT(it.interface()->Index() >= 0); | 560 DCHECK(it.interface()->Index() >= 0); |
| 561 info->set_index(i, it.interface()->Index()); | 561 info->set_index(i, it.interface()->Index()); |
| 562 } else { | 562 } else { |
| 563 ASSERT(var->index() >= 0); | 563 DCHECK(var->index() >= 0); |
| 564 info->set_index(i, var->index()); | 564 info->set_index(i, var->index()); |
| 565 } | 565 } |
| 566 } | 566 } |
| 567 ASSERT(i == info->length()); | 567 DCHECK(i == info->length()); |
| 568 return info; | 568 return info; |
| 569 } | 569 } |
| 570 | 570 |
| 571 } } // namespace v8::internal | 571 } } // namespace v8::internal |
| OLD | NEW |