OLD | NEW |
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/execution.h" | 5 #include "src/execution.h" |
6 | 6 |
7 #include "src/bootstrapper.h" | 7 #include "src/bootstrapper.h" |
8 #include "src/codegen.h" | 8 #include "src/codegen.h" |
9 #include "src/deoptimizer.h" | 9 #include "src/deoptimizer.h" |
10 #include "src/isolate-inl.h" | 10 #include "src/isolate-inl.h" |
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
63 Object*** args); | 63 Object*** args); |
64 | 64 |
65 Handle<Code> code = is_construct | 65 Handle<Code> code = is_construct |
66 ? isolate->factory()->js_construct_entry_code() | 66 ? isolate->factory()->js_construct_entry_code() |
67 : isolate->factory()->js_entry_code(); | 67 : isolate->factory()->js_entry_code(); |
68 | 68 |
69 // Convert calls on global objects to be calls on the global | 69 // Convert calls on global objects to be calls on the global |
70 // receiver instead to avoid having a 'this' pointer which refers | 70 // receiver instead to avoid having a 'this' pointer which refers |
71 // directly to a global object. | 71 // directly to a global object. |
72 if (receiver->IsGlobalObject()) { | 72 if (receiver->IsGlobalObject()) { |
73 Handle<GlobalObject> global = Handle<GlobalObject>::cast(receiver); | 73 receiver = handle(Handle<GlobalObject>::cast(receiver)->global_proxy()); |
74 receiver = Handle<JSObject>(global->global_receiver()); | |
75 } | 74 } |
76 | 75 |
77 // Make sure that the global object of the context we're about to | 76 // Make sure that the global object of the context we're about to |
78 // make the current one is indeed a global object. | 77 // make the current one is indeed a global object. |
79 ASSERT(function->context()->global_object()->IsGlobalObject()); | 78 ASSERT(function->context()->global_object()->IsGlobalObject()); |
80 | 79 |
81 { | 80 { |
82 // Save and restore context around invocation and block the | 81 // Save and restore context around invocation and block the |
83 // allocation of handles without explicit handle scopes. | 82 // allocation of handles without explicit handle scopes. |
84 SaveContext save(isolate); | 83 SaveContext save(isolate); |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
126 ASSIGN_RETURN_ON_EXCEPTION( | 125 ASSIGN_RETURN_ON_EXCEPTION( |
127 isolate, callable, TryGetFunctionDelegate(isolate, callable), Object); | 126 isolate, callable, TryGetFunctionDelegate(isolate, callable), Object); |
128 } | 127 } |
129 Handle<JSFunction> func = Handle<JSFunction>::cast(callable); | 128 Handle<JSFunction> func = Handle<JSFunction>::cast(callable); |
130 | 129 |
131 // In sloppy mode, convert receiver. | 130 // In sloppy mode, convert receiver. |
132 if (convert_receiver && !receiver->IsJSReceiver() && | 131 if (convert_receiver && !receiver->IsJSReceiver() && |
133 !func->shared()->native() && | 132 !func->shared()->native() && |
134 func->shared()->strict_mode() == SLOPPY) { | 133 func->shared()->strict_mode() == SLOPPY) { |
135 if (receiver->IsUndefined() || receiver->IsNull()) { | 134 if (receiver->IsUndefined() || receiver->IsNull()) { |
136 Object* global = func->context()->global_object()->global_receiver(); | 135 receiver = handle(func->global_proxy()); |
137 // Under some circumstances, 'global' can be the JSBuiltinsObject | 136 ASSERT(!receiver->IsJSBuiltinsObject()); |
138 // In that case, don't rewrite. (FWIW, the same holds for | |
139 // GetIsolate()->global_object()->global_receiver().) | |
140 if (!global->IsJSBuiltinsObject()) { | |
141 receiver = Handle<Object>(global, func->GetIsolate()); | |
142 } | |
143 } else { | 137 } else { |
144 ASSIGN_RETURN_ON_EXCEPTION( | 138 ASSIGN_RETURN_ON_EXCEPTION( |
145 isolate, receiver, ToObject(isolate, receiver), Object); | 139 isolate, receiver, ToObject(isolate, receiver), Object); |
146 } | 140 } |
147 } | 141 } |
148 | 142 |
149 return Invoke(false, func, receiver, argc, argv); | 143 return Invoke(false, func, receiver, argc, argv); |
150 } | 144 } |
151 | 145 |
152 | 146 |
153 MaybeHandle<Object> Execution::New(Handle<JSFunction> func, | 147 MaybeHandle<Object> Execution::New(Handle<JSFunction> func, |
154 int argc, | 148 int argc, |
155 Handle<Object> argv[]) { | 149 Handle<Object> argv[]) { |
156 return Invoke(true, func, func->GetIsolate()->global_object(), argc, argv); | 150 return Invoke(true, func, handle(func->global_proxy()), argc, argv); |
157 } | 151 } |
158 | 152 |
159 | 153 |
160 MaybeHandle<Object> Execution::TryCall(Handle<JSFunction> func, | 154 MaybeHandle<Object> Execution::TryCall(Handle<JSFunction> func, |
161 Handle<Object> receiver, | 155 Handle<Object> receiver, |
162 int argc, | 156 int argc, |
163 Handle<Object> args[], | 157 Handle<Object> args[], |
164 Handle<Object>* exception_out) { | 158 Handle<Object>* exception_out) { |
165 // Enter a try-block while executing the JavaScript code. To avoid | 159 // Enter a try-block while executing the JavaScript code. To avoid |
166 // duplicate error printing it must be non-verbose. Also, to avoid | 160 // duplicate error printing it must be non-verbose. Also, to avoid |
(...skipping 515 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
682 } | 676 } |
683 | 677 |
684 isolate_->counters()->stack_interrupts()->Increment(); | 678 isolate_->counters()->stack_interrupts()->Increment(); |
685 isolate_->counters()->runtime_profiler_ticks()->Increment(); | 679 isolate_->counters()->runtime_profiler_ticks()->Increment(); |
686 isolate_->runtime_profiler()->OptimizeNow(); | 680 isolate_->runtime_profiler()->OptimizeNow(); |
687 | 681 |
688 return isolate_->heap()->undefined_value(); | 682 return isolate_->heap()->undefined_value(); |
689 } | 683 } |
690 | 684 |
691 } } // namespace v8::internal | 685 } } // namespace v8::internal |
OLD | NEW |