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 2914 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2925 break; | 2925 break; |
2926 } | 2926 } |
2927 | 2927 |
2928 case Token::LPAREN: { | 2928 case Token::LPAREN: { |
2929 int pos = scanner().location().beg_pos; | 2929 int pos = scanner().location().beg_pos; |
2930 ZoneList<Expression*>* args = ParseArguments(CHECK_OK); | 2930 ZoneList<Expression*>* args = ParseArguments(CHECK_OK); |
2931 | 2931 |
2932 // Keep track of eval() calls since they disable all local variable | 2932 // Keep track of eval() calls since they disable all local variable |
2933 // optimizations. | 2933 // optimizations. |
2934 // The calls that need special treatment are the | 2934 // The calls that need special treatment are the |
2935 // direct (i.e. not aliased) eval calls. These calls are all of the | 2935 // direct eval calls. These calls are all of the form eval(...), with |
2936 // form eval(...) with no explicit receiver object where eval is not | 2936 // no explicit receiver. |
2937 // declared in the current scope chain. | |
2938 // These calls are marked as potentially direct eval calls. Whether | 2937 // These calls are marked as potentially direct eval calls. Whether |
2939 // they are actually direct calls to eval is determined at run time. | 2938 // they are actually direct calls to eval is determined at run time. |
2940 // TODO(994): In ES5, it doesn't matter if the "eval" var is declared | |
2941 // in the local scope chain. It only matters that it's called "eval", | |
2942 // is called without a receiver and it refers to the original eval | |
2943 // function. | |
2944 VariableProxy* callee = result->AsVariableProxy(); | 2939 VariableProxy* callee = result->AsVariableProxy(); |
2945 if (callee != NULL && | 2940 if (callee != NULL && |
2946 callee->IsVariable(isolate()->factory()->eval_symbol())) { | 2941 callee->IsVariable(isolate()->factory()->eval_symbol())) { |
2947 Handle<String> name = callee->name(); | 2942 top_scope_->DeclarationScope()->RecordEvalCall(); |
2948 Variable* var = top_scope_->Lookup(name); | |
2949 if (var == NULL) { | |
2950 top_scope_->DeclarationScope()->RecordEvalCall(); | |
2951 } | |
2952 } | 2943 } |
2953 result = NewCall(result, args, pos); | 2944 result = NewCall(result, args, pos); |
2954 break; | 2945 break; |
2955 } | 2946 } |
2956 | 2947 |
2957 case Token::PERIOD: { | 2948 case Token::PERIOD: { |
2958 Consume(Token::PERIOD); | 2949 Consume(Token::PERIOD); |
2959 int pos = scanner().location().beg_pos; | 2950 int pos = scanner().location().beg_pos; |
2960 Handle<String> name = ParseIdentifierName(CHECK_OK); | 2951 Handle<String> name = ParseIdentifierName(CHECK_OK); |
2961 result = new(zone()) Property(isolate(), | 2952 result = new(zone()) Property(isolate(), |
(...skipping 2457 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
5419 result = parser.ParseProgram(source, | 5410 result = parser.ParseProgram(source, |
5420 info->is_global(), | 5411 info->is_global(), |
5421 info->strict_mode_flag()); | 5412 info->strict_mode_flag()); |
5422 } | 5413 } |
5423 } | 5414 } |
5424 info->SetFunction(result); | 5415 info->SetFunction(result); |
5425 return (result != NULL); | 5416 return (result != NULL); |
5426 } | 5417 } |
5427 | 5418 |
5428 } } // namespace v8::internal | 5419 } } // namespace v8::internal |
OLD | NEW |