Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(257)

Side by Side Diff: src/runtime/runtime-scopes.cc

Issue 716833002: Various clean-ups after top-level lexical declarations are done. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Patch for landing Created 6 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/runtime/runtime-debug.cc ('k') | src/scopes.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 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/v8.h" 5 #include "src/v8.h"
6 6
7 #include "src/accessors.h" 7 #include "src/accessors.h"
8 #include "src/arguments.h" 8 #include "src/arguments.h"
9 #include "src/frames-inl.h" 9 #include "src/frames-inl.h"
10 #include "src/runtime/runtime-utils.h" 10 #include "src/runtime/runtime-utils.h"
11 #include "src/scopeinfo.h" 11 #include "src/scopeinfo.h"
12 #include "src/scopes.h" 12 #include "src/scopes.h"
13 13
14 namespace v8 { 14 namespace v8 {
15 namespace internal { 15 namespace internal {
16 16
17 static Object* ThrowRedeclarationError(Isolate* isolate, Handle<String> name) { 17 static Object* ThrowRedeclarationError(Isolate* isolate, Handle<String> name) {
18 HandleScope scope(isolate); 18 HandleScope scope(isolate);
19 Handle<Object> args[1] = {name}; 19 Handle<Object> args[1] = {name};
20 THROW_NEW_ERROR_RETURN_FAILURE( 20 THROW_NEW_ERROR_RETURN_FAILURE(
21 isolate, NewTypeError("var_redeclaration", HandleVector(args, 1))); 21 isolate, NewTypeError("var_redeclaration", HandleVector(args, 1)));
22 } 22 }
23 23
24 24
25 // May throw a RedeclarationError. 25 // May throw a RedeclarationError.
26 static Object* DeclareGlobals(Isolate* isolate, Handle<GlobalObject> global, 26 static Object* DeclareGlobals(Isolate* isolate, Handle<GlobalObject> global,
27 Handle<String> name, Handle<Object> value, 27 Handle<String> name, Handle<Object> value,
28 PropertyAttributes attr, bool is_var, 28 PropertyAttributes attr, bool is_var,
29 bool is_const, bool is_function) { 29 bool is_const, bool is_function) {
30 Handle<GlobalContextTable> global_contexts( 30 Handle<ScriptContextTable> script_contexts(
31 global->native_context()->global_context_table()); 31 global->native_context()->script_context_table());
32 GlobalContextTable::LookupResult lookup; 32 ScriptContextTable::LookupResult lookup;
33 if (GlobalContextTable::Lookup(global_contexts, name, &lookup) && 33 if (ScriptContextTable::Lookup(script_contexts, name, &lookup) &&
34 IsLexicalVariableMode(lookup.mode)) { 34 IsLexicalVariableMode(lookup.mode)) {
35 return ThrowRedeclarationError(isolate, name); 35 return ThrowRedeclarationError(isolate, name);
36 } 36 }
37 37
38 // Do the lookup own properties only, see ES5 erratum. 38 // Do the lookup own properties only, see ES5 erratum.
39 LookupIterator it(global, name, LookupIterator::HIDDEN_SKIP_INTERCEPTOR); 39 LookupIterator it(global, name, LookupIterator::HIDDEN_SKIP_INTERCEPTOR);
40 Maybe<PropertyAttributes> maybe = JSReceiver::GetPropertyAttributes(&it); 40 Maybe<PropertyAttributes> maybe = JSReceiver::GetPropertyAttributes(&it);
41 if (!maybe.has_value) return isolate->heap()->exception(); 41 if (!maybe.has_value) return isolate->heap()->exception();
42 42
43 if (it.IsFound()) { 43 if (it.IsFound()) {
(...skipping 146 matching lines...) Expand 10 before | Expand all | Expand 10 after
190 global, name, value, attr)); 190 global, name, value, attr));
191 191
192 return *value; 192 return *value;
193 } 193 }
194 194
195 195
196 RUNTIME_FUNCTION(Runtime_DeclareLookupSlot) { 196 RUNTIME_FUNCTION(Runtime_DeclareLookupSlot) {
197 HandleScope scope(isolate); 197 HandleScope scope(isolate);
198 DCHECK(args.length() == 4); 198 DCHECK(args.length() == 4);
199 199
200 // Declarations are always made in a function, native, or global context. In 200 // Declarations are always made in a function, eval or script context. In
201 // the case of eval code, the context passed is the context of the caller, 201 // the case of eval code, the context passed is the context of the caller,
202 // which may be some nested context and not the declaration context. 202 // which may be some nested context and not the declaration context.
203 CONVERT_ARG_HANDLE_CHECKED(Context, context_arg, 0); 203 CONVERT_ARG_HANDLE_CHECKED(Context, context_arg, 0);
204 Handle<Context> context(context_arg->declaration_context()); 204 Handle<Context> context(context_arg->declaration_context());
205 CONVERT_ARG_HANDLE_CHECKED(String, name, 1); 205 CONVERT_ARG_HANDLE_CHECKED(String, name, 1);
206 CONVERT_SMI_ARG_CHECKED(attr_arg, 2); 206 CONVERT_SMI_ARG_CHECKED(attr_arg, 2);
207 PropertyAttributes attr = static_cast<PropertyAttributes>(attr_arg); 207 PropertyAttributes attr = static_cast<PropertyAttributes>(attr_arg);
208 RUNTIME_ASSERT(attr == READ_ONLY || attr == NONE); 208 RUNTIME_ASSERT(attr == READ_ONLY || attr == NONE);
209 CONVERT_ARG_HANDLE_CHECKED(Object, initial_value, 3); 209 CONVERT_ARG_HANDLE_CHECKED(Object, initial_value, 3);
210 210
(...skipping 299 matching lines...) Expand 10 before | Expand all | Expand 10 after
510 510
511 // The caller ensures that we pretenure closures that are assigned 511 // The caller ensures that we pretenure closures that are assigned
512 // directly to properties. 512 // directly to properties.
513 PretenureFlag pretenure_flag = pretenure ? TENURED : NOT_TENURED; 513 PretenureFlag pretenure_flag = pretenure ? TENURED : NOT_TENURED;
514 return *isolate->factory()->NewFunctionFromSharedFunctionInfo(shared, context, 514 return *isolate->factory()->NewFunctionFromSharedFunctionInfo(shared, context,
515 pretenure_flag); 515 pretenure_flag);
516 } 516 }
517 517
518 static Object* FindNameClash(Handle<ScopeInfo> scope_info, 518 static Object* FindNameClash(Handle<ScopeInfo> scope_info,
519 Handle<GlobalObject> global_object, 519 Handle<GlobalObject> global_object,
520 Handle<GlobalContextTable> global_context) { 520 Handle<ScriptContextTable> script_context) {
521 Isolate* isolate = scope_info->GetIsolate(); 521 Isolate* isolate = scope_info->GetIsolate();
522 for (int var = 0; var < scope_info->ContextLocalCount(); var++) { 522 for (int var = 0; var < scope_info->ContextLocalCount(); var++) {
523 Handle<String> name(scope_info->ContextLocalName(var)); 523 Handle<String> name(scope_info->ContextLocalName(var));
524 VariableMode mode = scope_info->ContextLocalMode(var); 524 VariableMode mode = scope_info->ContextLocalMode(var);
525 GlobalContextTable::LookupResult lookup; 525 ScriptContextTable::LookupResult lookup;
526 if (GlobalContextTable::Lookup(global_context, name, &lookup)) { 526 if (ScriptContextTable::Lookup(script_context, name, &lookup)) {
527 if (IsLexicalVariableMode(mode) || IsLexicalVariableMode(lookup.mode)) { 527 if (IsLexicalVariableMode(mode) || IsLexicalVariableMode(lookup.mode)) {
528 return ThrowRedeclarationError(isolate, name); 528 return ThrowRedeclarationError(isolate, name);
529 } 529 }
530 } 530 }
531 531
532 if (IsLexicalVariableMode(mode)) { 532 if (IsLexicalVariableMode(mode)) {
533 LookupIterator it(global_object, name, 533 LookupIterator it(global_object, name,
534 LookupIterator::HIDDEN_SKIP_INTERCEPTOR); 534 LookupIterator::HIDDEN_SKIP_INTERCEPTOR);
535 Maybe<PropertyAttributes> maybe = JSReceiver::GetPropertyAttributes(&it); 535 Maybe<PropertyAttributes> maybe = JSReceiver::GetPropertyAttributes(&it);
536 if (!maybe.has_value) return isolate->heap()->exception(); 536 if (!maybe.has_value) return isolate->heap()->exception();
537 if ((maybe.value & DONT_DELETE) != 0) { 537 if ((maybe.value & DONT_DELETE) != 0) {
538 return ThrowRedeclarationError(isolate, name); 538 return ThrowRedeclarationError(isolate, name);
539 } 539 }
540 540
541 GlobalObject::InvalidatePropertyCell(global_object, name); 541 GlobalObject::InvalidatePropertyCell(global_object, name);
542 } 542 }
543 } 543 }
544 return isolate->heap()->undefined_value(); 544 return isolate->heap()->undefined_value();
545 } 545 }
546 546
547 547
548 RUNTIME_FUNCTION(Runtime_NewGlobalContext) { 548 RUNTIME_FUNCTION(Runtime_NewScriptContext) {
549 HandleScope scope(isolate); 549 HandleScope scope(isolate);
550 DCHECK(args.length() == 2); 550 DCHECK(args.length() == 2);
551 551
552 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); 552 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0);
553 CONVERT_ARG_HANDLE_CHECKED(ScopeInfo, scope_info, 1); 553 CONVERT_ARG_HANDLE_CHECKED(ScopeInfo, scope_info, 1);
554 Handle<GlobalObject> global_object(function->context()->global_object()); 554 Handle<GlobalObject> global_object(function->context()->global_object());
555 Handle<Context> native_context(global_object->native_context()); 555 Handle<Context> native_context(global_object->native_context());
556 Handle<GlobalContextTable> global_context_table( 556 Handle<ScriptContextTable> script_context_table(
557 native_context->global_context_table()); 557 native_context->script_context_table());
558 558
559 Handle<String> clashed_name; 559 Handle<String> clashed_name;
560 Object* name_clash_result = 560 Object* name_clash_result =
561 FindNameClash(scope_info, global_object, global_context_table); 561 FindNameClash(scope_info, global_object, script_context_table);
562 if (isolate->has_pending_exception()) return name_clash_result; 562 if (isolate->has_pending_exception()) return name_clash_result;
563 563
564 Handle<Context> result = 564 Handle<Context> result =
565 isolate->factory()->NewGlobalContext(function, scope_info); 565 isolate->factory()->NewScriptContext(function, scope_info);
566 566
567 DCHECK(function->context() == isolate->context()); 567 DCHECK(function->context() == isolate->context());
568 DCHECK(function->context()->global_object() == result->global_object()); 568 DCHECK(function->context()->global_object() == result->global_object());
569 569
570 Handle<GlobalContextTable> new_global_context_table = 570 Handle<ScriptContextTable> new_script_context_table =
571 GlobalContextTable::Extend(global_context_table, result); 571 ScriptContextTable::Extend(script_context_table, result);
572 native_context->set_global_context_table(*new_global_context_table); 572 native_context->set_script_context_table(*new_script_context_table);
573 return *result; 573 return *result;
574 } 574 }
575 575
576 576
577 RUNTIME_FUNCTION(Runtime_NewFunctionContext) { 577 RUNTIME_FUNCTION(Runtime_NewFunctionContext) {
578 HandleScope scope(isolate); 578 HandleScope scope(isolate);
579 DCHECK(args.length() == 1); 579 DCHECK(args.length() == 1);
580 580
581 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); 581 CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0);
582 582
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
672 } 672 }
673 673
674 674
675 RUNTIME_FUNCTION(Runtime_PushModuleContext) { 675 RUNTIME_FUNCTION(Runtime_PushModuleContext) {
676 SealHandleScope shs(isolate); 676 SealHandleScope shs(isolate);
677 DCHECK(args.length() == 2); 677 DCHECK(args.length() == 2);
678 CONVERT_SMI_ARG_CHECKED(index, 0); 678 CONVERT_SMI_ARG_CHECKED(index, 0);
679 679
680 if (!args[1]->IsScopeInfo()) { 680 if (!args[1]->IsScopeInfo()) {
681 // Module already initialized. Find hosting context and retrieve context. 681 // Module already initialized. Find hosting context and retrieve context.
682 Context* host = Context::cast(isolate->context())->global_context(); 682 Context* host = Context::cast(isolate->context())->script_context();
683 Context* context = Context::cast(host->get(index)); 683 Context* context = Context::cast(host->get(index));
684 DCHECK(context->previous() == isolate->context()); 684 DCHECK(context->previous() == isolate->context());
685 isolate->set_context(context); 685 isolate->set_context(context);
686 return context; 686 return context;
687 } 687 }
688 688
689 CONVERT_ARG_HANDLE_CHECKED(ScopeInfo, scope_info, 1); 689 CONVERT_ARG_HANDLE_CHECKED(ScopeInfo, scope_info, 1);
690 690
691 // Allocate module context. 691 // Allocate module context.
692 HandleScope scope(isolate); 692 HandleScope scope(isolate);
693 Factory* factory = isolate->factory(); 693 Factory* factory = isolate->factory();
694 Handle<Context> context = factory->NewModuleContext(scope_info); 694 Handle<Context> context = factory->NewModuleContext(scope_info);
695 Handle<JSModule> module = factory->NewJSModule(context, scope_info); 695 Handle<JSModule> module = factory->NewJSModule(context, scope_info);
696 context->set_module(*module); 696 context->set_module(*module);
697 Context* previous = isolate->context(); 697 Context* previous = isolate->context();
698 context->set_previous(previous); 698 context->set_previous(previous);
699 context->set_closure(previous->closure()); 699 context->set_closure(previous->closure());
700 context->set_global_object(previous->global_object()); 700 context->set_global_object(previous->global_object());
701 isolate->set_context(*context); 701 isolate->set_context(*context);
702 702
703 // Find hosting scope and initialize internal variable holding module there. 703 // Find hosting scope and initialize internal variable holding module there.
704 previous->global_context()->set(index, *context); 704 previous->script_context()->set(index, *context);
705 705
706 return *context; 706 return *context;
707 } 707 }
708 708
709 709
710 RUNTIME_FUNCTION(Runtime_DeclareModules) { 710 RUNTIME_FUNCTION(Runtime_DeclareModules) {
711 HandleScope scope(isolate); 711 HandleScope scope(isolate);
712 DCHECK(args.length() == 1); 712 DCHECK(args.length() == 1);
713 CONVERT_ARG_HANDLE_CHECKED(FixedArray, descriptions, 0); 713 CONVERT_ARG_HANDLE_CHECKED(FixedArray, descriptions, 0);
714 Context* host_context = isolate->context(); 714 Context* host_context = isolate->context();
(...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after
1069 return Smi::FromInt(frame->GetArgumentsLength()); 1069 return Smi::FromInt(frame->GetArgumentsLength());
1070 } 1070 }
1071 1071
1072 1072
1073 RUNTIME_FUNCTION(RuntimeReference_Arguments) { 1073 RUNTIME_FUNCTION(RuntimeReference_Arguments) {
1074 SealHandleScope shs(isolate); 1074 SealHandleScope shs(isolate);
1075 return __RT_impl_Runtime_GetArgumentsProperty(args, isolate); 1075 return __RT_impl_Runtime_GetArgumentsProperty(args, isolate);
1076 } 1076 }
1077 } 1077 }
1078 } // namespace v8::internal 1078 } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/runtime/runtime-debug.cc ('k') | src/scopes.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698