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 |