| 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 "src/contexts.h" | 5 #include "src/contexts.h" |
| 6 | 6 |
| 7 #include "src/ast/scopeinfo.h" | 7 #include "src/ast/scopeinfo.h" |
| 8 #include "src/bootstrapper.h" | 8 #include "src/bootstrapper.h" |
| 9 #include "src/debug/debug.h" | 9 #include "src/debug/debug.h" |
| 10 #include "src/isolate-inl.h" | 10 #include "src/isolate-inl.h" |
| (...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 177 return Just(!blacklist->BooleanValue()); | 177 return Just(!blacklist->BooleanValue()); |
| 178 } | 178 } |
| 179 | 179 |
| 180 static void GetAttributesAndBindingFlags(VariableMode mode, | 180 static void GetAttributesAndBindingFlags(VariableMode mode, |
| 181 InitializationFlag init_flag, | 181 InitializationFlag init_flag, |
| 182 PropertyAttributes* attributes, | 182 PropertyAttributes* attributes, |
| 183 BindingFlags* binding_flags) { | 183 BindingFlags* binding_flags) { |
| 184 switch (mode) { | 184 switch (mode) { |
| 185 case VAR: | 185 case VAR: |
| 186 *attributes = NONE; | 186 *attributes = NONE; |
| 187 *binding_flags = MUTABLE_IS_INITIALIZED; | 187 *binding_flags = BINDING_IS_INITIALIZED; |
| 188 break; | 188 break; |
| 189 case LET: | 189 case LET: |
| 190 *attributes = NONE; | 190 *attributes = NONE; |
| 191 *binding_flags = (init_flag == kNeedsInitialization) | 191 *binding_flags = (init_flag == kNeedsInitialization) |
| 192 ? MUTABLE_CHECK_INITIALIZED | 192 ? BINDING_CHECK_INITIALIZED |
| 193 : MUTABLE_IS_INITIALIZED; | 193 : BINDING_IS_INITIALIZED; |
| 194 break; | 194 break; |
| 195 case CONST_LEGACY: | 195 case CONST_LEGACY: |
| 196 DCHECK_EQ(kCreatedInitialized, init_flag); |
| 196 *attributes = READ_ONLY; | 197 *attributes = READ_ONLY; |
| 197 *binding_flags = (init_flag == kNeedsInitialization) | 198 *binding_flags = BINDING_IS_INITIALIZED; |
| 198 ? IMMUTABLE_CHECK_INITIALIZED | |
| 199 : IMMUTABLE_IS_INITIALIZED; | |
| 200 break; | 199 break; |
| 201 case CONST: | 200 case CONST: |
| 202 *attributes = READ_ONLY; | 201 *attributes = READ_ONLY; |
| 203 *binding_flags = (init_flag == kNeedsInitialization) | 202 *binding_flags = (init_flag == kNeedsInitialization) |
| 204 ? IMMUTABLE_CHECK_INITIALIZED_HARMONY | 203 ? BINDING_CHECK_INITIALIZED |
| 205 : IMMUTABLE_IS_INITIALIZED_HARMONY; | 204 : BINDING_IS_INITIALIZED; |
| 206 break; | |
| 207 case IMPORT: | |
| 208 // TODO(ES6) | |
| 209 UNREACHABLE(); | |
| 210 break; | 205 break; |
| 211 case DYNAMIC: | 206 case DYNAMIC: |
| 212 case DYNAMIC_GLOBAL: | 207 case DYNAMIC_GLOBAL: |
| 213 case DYNAMIC_LOCAL: | 208 case DYNAMIC_LOCAL: |
| 214 case TEMPORARY: | 209 case TEMPORARY: |
| 215 // Note: Fixed context slots are statically allocated by the compiler. | 210 // Note: Fixed context slots are statically allocated by the compiler. |
| 216 // Statically allocated variables always have a statically known mode, | 211 // Statically allocated variables always have a statically known mode, |
| 217 // which is the mode with which they were declared when added to the | 212 // which is the mode with which they were declared when added to the |
| 218 // scope. Thus, the DYNAMIC mode (which corresponds to dynamically | 213 // scope. Thus, the DYNAMIC mode (which corresponds to dynamically |
| 219 // declared variables that were introduced through declaration nodes) | 214 // declared variables that were introduced through declaration nodes) |
| (...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 355 VariableMode mode; | 350 VariableMode mode; |
| 356 int function_index = scope_info->FunctionContextSlotIndex(*name, &mode); | 351 int function_index = scope_info->FunctionContextSlotIndex(*name, &mode); |
| 357 if (function_index >= 0) { | 352 if (function_index >= 0) { |
| 358 if (FLAG_trace_contexts) { | 353 if (FLAG_trace_contexts) { |
| 359 PrintF("=> found intermediate function in context slot %d\n", | 354 PrintF("=> found intermediate function in context slot %d\n", |
| 360 function_index); | 355 function_index); |
| 361 } | 356 } |
| 362 *index = function_index; | 357 *index = function_index; |
| 363 *attributes = READ_ONLY; | 358 *attributes = READ_ONLY; |
| 364 DCHECK(mode == CONST_LEGACY || mode == CONST); | 359 DCHECK(mode == CONST_LEGACY || mode == CONST); |
| 365 *binding_flags = (mode == CONST_LEGACY) | 360 *binding_flags = BINDING_IS_INITIALIZED; |
| 366 ? IMMUTABLE_IS_INITIALIZED : IMMUTABLE_IS_INITIALIZED_HARMONY; | |
| 367 return context; | 361 return context; |
| 368 } | 362 } |
| 369 } | 363 } |
| 370 | 364 |
| 371 } else if (context->IsCatchContext()) { | 365 } else if (context->IsCatchContext()) { |
| 372 // Catch contexts have the variable name in the extension slot. | 366 // Catch contexts have the variable name in the extension slot. |
| 373 if (String::Equals(name, handle(context->catch_name()))) { | 367 if (String::Equals(name, handle(context->catch_name()))) { |
| 374 if (FLAG_trace_contexts) { | 368 if (FLAG_trace_contexts) { |
| 375 PrintF("=> found in catch context\n"); | 369 PrintF("=> found in catch context\n"); |
| 376 } | 370 } |
| 377 *index = Context::THROWN_OBJECT_INDEX; | 371 *index = Context::THROWN_OBJECT_INDEX; |
| 378 *attributes = NONE; | 372 *attributes = NONE; |
| 379 *binding_flags = MUTABLE_IS_INITIALIZED; | 373 *binding_flags = BINDING_IS_INITIALIZED; |
| 380 return context; | 374 return context; |
| 381 } | 375 } |
| 382 } else if (context->IsDebugEvaluateContext()) { | 376 } else if (context->IsDebugEvaluateContext()) { |
| 383 // Check materialized locals. | 377 // Check materialized locals. |
| 384 Object* obj = context->get(EXTENSION_INDEX); | 378 Object* obj = context->get(EXTENSION_INDEX); |
| 385 if (obj->IsJSReceiver()) { | 379 if (obj->IsJSReceiver()) { |
| 386 Handle<JSReceiver> extension(JSReceiver::cast(obj)); | 380 Handle<JSReceiver> extension(JSReceiver::cast(obj)); |
| 387 LookupIterator it(extension, name, extension); | 381 LookupIterator it(extension, name, extension); |
| 388 Maybe<bool> found = JSReceiver::HasProperty(&it); | 382 Maybe<bool> found = JSReceiver::HasProperty(&it); |
| 389 if (found.FromMaybe(false)) { | 383 if (found.FromMaybe(false)) { |
| (...skipping 223 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 613 | 607 |
| 614 int previous_value = errors_thrown()->value(); | 608 int previous_value = errors_thrown()->value(); |
| 615 set_errors_thrown(Smi::FromInt(previous_value + 1)); | 609 set_errors_thrown(Smi::FromInt(previous_value + 1)); |
| 616 } | 610 } |
| 617 | 611 |
| 618 | 612 |
| 619 int Context::GetErrorsThrown() { return errors_thrown()->value(); } | 613 int Context::GetErrorsThrown() { return errors_thrown()->value(); } |
| 620 | 614 |
| 621 } // namespace internal | 615 } // namespace internal |
| 622 } // namespace v8 | 616 } // namespace v8 |
| OLD | NEW |