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

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

Issue 1215463012: Fixed a couple of proxies-related unhandled exceptions. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 5 months 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
« no previous file with comments | « src/objects.cc ('k') | test/mjsunit/regress/regress-crbug-505907.js » ('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/messages.h" 10 #include "src/messages.h"
(...skipping 212 matching lines...) Expand 10 before | Expand all | Expand 10 after
223 bool is_function = initial_value->IsJSFunction(); 223 bool is_function = initial_value->IsJSFunction();
224 DCHECK_EQ(1, 224 DCHECK_EQ(1,
225 BoolToInt(is_var) + BoolToInt(is_const) + BoolToInt(is_function)); 225 BoolToInt(is_var) + BoolToInt(is_const) + BoolToInt(is_function));
226 226
227 int index; 227 int index;
228 PropertyAttributes attributes; 228 PropertyAttributes attributes;
229 ContextLookupFlags flags = DONT_FOLLOW_CHAINS; 229 ContextLookupFlags flags = DONT_FOLLOW_CHAINS;
230 BindingFlags binding_flags; 230 BindingFlags binding_flags;
231 Handle<Object> holder = 231 Handle<Object> holder =
232 context->Lookup(name, flags, &index, &attributes, &binding_flags); 232 context->Lookup(name, flags, &index, &attributes, &binding_flags);
233 // In case of JSProxy, an exception might have been thrown.
234 if (isolate->has_pending_exception()) return isolate->heap()->exception();
Yang 2015/07/08 07:55:18 This looks hacky. I.e. we should have returned a M
233 235
234 Handle<JSObject> object; 236 Handle<JSObject> object;
235 Handle<Object> value = 237 Handle<Object> value =
236 is_function ? initial_value 238 is_function ? initial_value
237 : Handle<Object>::cast(isolate->factory()->undefined_value()); 239 : Handle<Object>::cast(isolate->factory()->undefined_value());
238 240
239 // TODO(verwaest): This case should probably not be covered by this function, 241 // TODO(verwaest): This case should probably not be covered by this function,
240 // but by DeclareGlobals instead. 242 // but by DeclareGlobals instead.
241 if (attributes != ABSENT && holder->IsJSGlobalObject()) { 243 if (attributes != ABSENT && holder->IsJSGlobalObject()) {
242 return DeclareGlobals(isolate, Handle<JSGlobalObject>::cast(holder), name, 244 return DeclareGlobals(isolate, Handle<JSGlobalObject>::cast(holder), name,
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
301 CONVERT_ARG_HANDLE_CHECKED(Context, context_arg, 1); 303 CONVERT_ARG_HANDLE_CHECKED(Context, context_arg, 1);
302 Handle<Context> context(context_arg->declaration_context()); 304 Handle<Context> context(context_arg->declaration_context());
303 CONVERT_ARG_HANDLE_CHECKED(String, name, 2); 305 CONVERT_ARG_HANDLE_CHECKED(String, name, 2);
304 306
305 int index; 307 int index;
306 PropertyAttributes attributes; 308 PropertyAttributes attributes;
307 ContextLookupFlags flags = DONT_FOLLOW_CHAINS; 309 ContextLookupFlags flags = DONT_FOLLOW_CHAINS;
308 BindingFlags binding_flags; 310 BindingFlags binding_flags;
309 Handle<Object> holder = 311 Handle<Object> holder =
310 context->Lookup(name, flags, &index, &attributes, &binding_flags); 312 context->Lookup(name, flags, &index, &attributes, &binding_flags);
313 // In case of JSProxy, an exception might have been thrown.
314 if (isolate->has_pending_exception()) return isolate->heap()->exception();
311 315
312 if (index >= 0) { 316 if (index >= 0) {
313 DCHECK(holder->IsContext()); 317 DCHECK(holder->IsContext());
314 // Property was found in a context. Perform the assignment if the constant 318 // Property was found in a context. Perform the assignment if the constant
315 // was uninitialized. 319 // was uninitialized.
316 Handle<Context> context = Handle<Context>::cast(holder); 320 Handle<Context> context = Handle<Context>::cast(holder);
317 DCHECK((attributes & READ_ONLY) != 0); 321 DCHECK((attributes & READ_ONLY) != 0);
318 if (context->get(index)->IsTheHole()) context->set(index, *value); 322 if (context->get(index)->IsTheHole()) context->set(index, *value);
319 return *value; 323 return *value;
320 } 324 }
(...skipping 527 matching lines...) Expand 10 before | Expand all | Expand 10 after
848 852
849 int index; 853 int index;
850 PropertyAttributes attributes; 854 PropertyAttributes attributes;
851 ContextLookupFlags flags = FOLLOW_CHAINS; 855 ContextLookupFlags flags = FOLLOW_CHAINS;
852 BindingFlags binding_flags; 856 BindingFlags binding_flags;
853 Handle<Object> holder = 857 Handle<Object> holder =
854 context->Lookup(name, flags, &index, &attributes, &binding_flags); 858 context->Lookup(name, flags, &index, &attributes, &binding_flags);
855 859
856 // If the slot was not found the result is true. 860 // If the slot was not found the result is true.
857 if (holder.is_null()) { 861 if (holder.is_null()) {
862 // In case of JSProxy, an exception might have been thrown.
863 if (isolate->has_pending_exception()) return isolate->heap()->exception();
858 return isolate->heap()->true_value(); 864 return isolate->heap()->true_value();
859 } 865 }
860 866
861 // If the slot was found in a context, it should be DONT_DELETE. 867 // If the slot was found in a context, it should be DONT_DELETE.
862 if (holder->IsContext()) { 868 if (holder->IsContext()) {
863 return isolate->heap()->false_value(); 869 return isolate->heap()->false_value();
864 } 870 }
865 871
866 // The slot was found in a JSObject, either a context extension object, 872 // The slot was found in a JSObject, either a context extension object,
867 // the global object, or the subject of a with. Try to delete it 873 // the global object, or the subject of a with. Try to delete it
(...skipping 264 matching lines...) Expand 10 before | Expand all | Expand 10 after
1132 return Smi::FromInt(frame->GetArgumentsLength()); 1138 return Smi::FromInt(frame->GetArgumentsLength());
1133 } 1139 }
1134 1140
1135 1141
1136 RUNTIME_FUNCTION(Runtime_Arguments) { 1142 RUNTIME_FUNCTION(Runtime_Arguments) {
1137 SealHandleScope shs(isolate); 1143 SealHandleScope shs(isolate);
1138 return __RT_impl_Runtime_GetArgumentsProperty(args, isolate); 1144 return __RT_impl_Runtime_GetArgumentsProperty(args, isolate);
1139 } 1145 }
1140 } // namespace internal 1146 } // namespace internal
1141 } // namespace v8 1147 } // namespace v8
OLDNEW
« no previous file with comments | « src/objects.cc ('k') | test/mjsunit/regress/regress-crbug-505907.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698