OLD | NEW |
1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
4 // met: | 4 // met: |
5 // | 5 // |
6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
(...skipping 183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
194 | 194 |
195 // --------------------------------------------------------------------------- | 195 // --------------------------------------------------------------------------- |
196 // Scope-specific info. | 196 // Scope-specific info. |
197 | 197 |
198 // Inform the scope that the corresponding code contains a with statement. | 198 // Inform the scope that the corresponding code contains a with statement. |
199 void RecordWithStatement() { scope_contains_with_ = true; } | 199 void RecordWithStatement() { scope_contains_with_ = true; } |
200 | 200 |
201 // Inform the scope that the corresponding code contains an eval call. | 201 // Inform the scope that the corresponding code contains an eval call. |
202 void RecordEvalCall() { if (!is_global_scope()) scope_calls_eval_ = true; } | 202 void RecordEvalCall() { if (!is_global_scope()) scope_calls_eval_ = true; } |
203 | 203 |
204 // Enable strict mode for the scope (unless disabled by a global flag). | 204 // Set the strict mode flag (unless disabled by a global flag). |
205 void EnableStrictMode() { | 205 void SetStrictModeFlag(StrictModeFlag strict_mode_flag) { |
206 strict_mode_ = FLAG_strict_mode; | 206 strict_mode_flag_ = FLAG_strict_mode ? strict_mode_flag : kNonStrictMode; |
207 } | 207 } |
208 | 208 |
209 // --------------------------------------------------------------------------- | 209 // --------------------------------------------------------------------------- |
210 // Predicates. | 210 // Predicates. |
211 | 211 |
212 // Specific scope types. | 212 // Specific scope types. |
213 bool is_eval_scope() const { return type_ == EVAL_SCOPE; } | 213 bool is_eval_scope() const { return type_ == EVAL_SCOPE; } |
214 bool is_function_scope() const { return type_ == FUNCTION_SCOPE; } | 214 bool is_function_scope() const { return type_ == FUNCTION_SCOPE; } |
215 bool is_global_scope() const { return type_ == GLOBAL_SCOPE; } | 215 bool is_global_scope() const { return type_ == GLOBAL_SCOPE; } |
216 bool is_catch_scope() const { return type_ == CATCH_SCOPE; } | 216 bool is_catch_scope() const { return type_ == CATCH_SCOPE; } |
217 bool is_block_scope() const { return type_ == BLOCK_SCOPE; } | 217 bool is_block_scope() const { return type_ == BLOCK_SCOPE; } |
218 bool is_with_scope() const { return type_ == WITH_SCOPE; } | 218 bool is_with_scope() const { return type_ == WITH_SCOPE; } |
219 bool is_declaration_scope() const { | 219 bool is_declaration_scope() const { |
220 return is_eval_scope() || is_function_scope() || is_global_scope(); | 220 return is_eval_scope() || is_function_scope() || is_global_scope(); |
221 } | 221 } |
222 bool is_strict_mode() const { return strict_mode_; } | 222 bool is_strict_mode() const { return strict_mode_flag() == kStrictMode; } |
223 bool is_strict_mode_eval_scope() const { | 223 bool is_strict_mode_eval_scope() const { |
224 return is_eval_scope() && is_strict_mode(); | 224 return is_eval_scope() && is_strict_mode(); |
225 } | 225 } |
226 | 226 |
227 // Information about which scopes calls eval. | 227 // Information about which scopes calls eval. |
228 bool calls_eval() const { return scope_calls_eval_; } | 228 bool calls_eval() const { return scope_calls_eval_; } |
229 bool calls_non_strict_eval() { | 229 bool calls_non_strict_eval() { |
230 return scope_calls_eval_ && !is_strict_mode(); | 230 return scope_calls_eval_ && !is_strict_mode(); |
231 } | 231 } |
232 bool outer_scope_calls_non_strict_eval() const { | 232 bool outer_scope_calls_non_strict_eval() const { |
233 return outer_scope_calls_non_strict_eval_; | 233 return outer_scope_calls_non_strict_eval_; |
234 } | 234 } |
235 | 235 |
236 // Is this scope inside a with statement. | 236 // Is this scope inside a with statement. |
237 bool inside_with() const { return scope_inside_with_; } | 237 bool inside_with() const { return scope_inside_with_; } |
238 // Does this scope contain a with statement. | 238 // Does this scope contain a with statement. |
239 bool contains_with() const { return scope_contains_with_; } | 239 bool contains_with() const { return scope_contains_with_; } |
240 | 240 |
241 // The scope immediately surrounding this scope, or NULL. | 241 // The scope immediately surrounding this scope, or NULL. |
242 Scope* outer_scope() const { return outer_scope_; } | 242 Scope* outer_scope() const { return outer_scope_; } |
243 | 243 |
244 // --------------------------------------------------------------------------- | 244 // --------------------------------------------------------------------------- |
245 // Accessors. | 245 // Accessors. |
246 | 246 |
| 247 StrictModeFlag strict_mode_flag() const { return strict_mode_flag_; } |
| 248 |
247 // The variable corresponding the 'this' value. | 249 // The variable corresponding the 'this' value. |
248 Variable* receiver() { return receiver_; } | 250 Variable* receiver() { return receiver_; } |
249 | 251 |
250 // The variable holding the function literal for named function | 252 // The variable holding the function literal for named function |
251 // literals, or NULL. | 253 // literals, or NULL. |
252 // Only valid for function scopes. | 254 // Only valid for function scopes. |
253 VariableProxy* function() const { | 255 VariableProxy* function() const { |
254 ASSERT(is_function_scope()); | 256 ASSERT(is_function_scope()); |
255 return function_; | 257 return function_; |
256 } | 258 } |
(...skipping 122 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
379 // Scope-specific information computed during parsing. | 381 // Scope-specific information computed during parsing. |
380 // | 382 // |
381 // This scope is inside a 'with' of some outer scope. | 383 // This scope is inside a 'with' of some outer scope. |
382 bool scope_inside_with_; | 384 bool scope_inside_with_; |
383 // This scope contains a 'with' statement. | 385 // This scope contains a 'with' statement. |
384 bool scope_contains_with_; | 386 bool scope_contains_with_; |
385 // This scope or a nested catch scope or with scope contain an 'eval' call. At | 387 // This scope or a nested catch scope or with scope contain an 'eval' call. At |
386 // the 'eval' call site this scope is the declaration scope. | 388 // the 'eval' call site this scope is the declaration scope. |
387 bool scope_calls_eval_; | 389 bool scope_calls_eval_; |
388 // This scope is a strict mode scope. | 390 // This scope is a strict mode scope. |
389 bool strict_mode_; | 391 StrictModeFlag strict_mode_flag_; |
390 | 392 |
391 // Computed via PropagateScopeInfo. | 393 // Computed via PropagateScopeInfo. |
392 bool outer_scope_calls_non_strict_eval_; | 394 bool outer_scope_calls_non_strict_eval_; |
393 bool inner_scope_calls_eval_; | 395 bool inner_scope_calls_eval_; |
394 bool force_eager_compilation_; | 396 bool force_eager_compilation_; |
395 | 397 |
396 // True if it doesn't need scope resolution (e.g., if the scope was | 398 // True if it doesn't need scope resolution (e.g., if the scope was |
397 // constructed based on a serialized scope info or a catch context). | 399 // constructed based on a serialized scope info or a catch context). |
398 bool already_resolved_; | 400 bool already_resolved_; |
399 | 401 |
(...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
502 } | 504 } |
503 | 505 |
504 void SetDefaults(Type type, | 506 void SetDefaults(Type type, |
505 Scope* outer_scope, | 507 Scope* outer_scope, |
506 Handle<SerializedScopeInfo> scope_info); | 508 Handle<SerializedScopeInfo> scope_info); |
507 }; | 509 }; |
508 | 510 |
509 } } // namespace v8::internal | 511 } } // namespace v8::internal |
510 | 512 |
511 #endif // V8_SCOPES_H_ | 513 #endif // V8_SCOPES_H_ |
OLD | NEW |