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

Side by Side Diff: src/ic.cc

Issue 6523052: CallIC and KeyedCallIC not wrapping this. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: CallIC doesn't wrap this for strict mode functions.wq Created 9 years, 10 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 | Annotate | Revision Log
OLDNEW
1 // Copyright 2006-2009 the V8 project authors. All rights reserved. 1 // Copyright 2006-2009 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 440 matching lines...) Expand 10 before | Expand all | Expand 10 after
451 MaybeObject* CallICBase::LoadFunction(State state, 451 MaybeObject* CallICBase::LoadFunction(State state,
452 Code::ExtraICState extra_ic_state, 452 Code::ExtraICState extra_ic_state,
453 Handle<Object> object, 453 Handle<Object> object,
454 Handle<String> name) { 454 Handle<String> name) {
455 // If the object is undefined or null it's illegal to try to get any 455 // If the object is undefined or null it's illegal to try to get any
456 // of its properties; throw a TypeError in that case. 456 // of its properties; throw a TypeError in that case.
457 if (object->IsUndefined() || object->IsNull()) { 457 if (object->IsUndefined() || object->IsNull()) {
458 return TypeError("non_object_property_call", object, name); 458 return TypeError("non_object_property_call", object, name);
459 } 459 }
460 460
461 if (object->IsString() || object->IsNumber() || object->IsBoolean()) {
462 ReceiverToObject(object);
463 }
464
465 // Check if the name is trivially convertible to an index and get 461 // Check if the name is trivially convertible to an index and get
466 // the element if so. 462 // the element if so.
467 uint32_t index; 463 uint32_t index;
468 if (name->AsArrayIndex(&index)) { 464 // TODO(mmaly): One cannot hang number-indexed functions off of values, right?
Martin Maly 2011/02/16 04:56:17 I couldn't come up with a way where value could ac
Mads Ager (chromium) 2011/02/16 10:43:54 I think that is because we have a bug here. I thin
Martin Maly 2011/02/17 05:25:55 Done.
465 if (object->IsJSObject() && name->AsArrayIndex(&index)) {
469 Object* result; 466 Object* result;
470 { MaybeObject* maybe_result = object->GetElement(index); 467 { MaybeObject* maybe_result = object->GetElement(index);
471 if (!maybe_result->ToObject(&result)) return maybe_result; 468 if (!maybe_result->ToObject(&result)) return maybe_result;
472 } 469 }
473 470
474 if (result->IsJSFunction()) return result; 471 if (result->IsJSFunction()) return result;
475 472
476 // Try to find a suitable function delegate for the object at hand. 473 // Try to find a suitable function delegate for the object at hand.
477 result = TryCallAsFunction(result); 474 result = TryCallAsFunction(result);
478 if (result->IsJSFunction()) return result; 475 if (result->IsJSFunction()) return result;
479 476
480 // Otherwise, it will fail in the lookup step. 477 // Otherwise, it will fail in the lookup step.
481 } 478 }
482 479
483 // Lookup the property in the object. 480 // Lookup the property in the object.
484 LookupResult lookup; 481 LookupResult lookup;
485 LookupForRead(*object, *name, &lookup); 482 LookupForRead(*object, *name, &lookup);
486 483
487 if (!lookup.IsProperty()) { 484 if (!lookup.IsProperty()) {
488 // If the object does not have the requested property, check which 485 // If the object does not have the requested property, check which
489 // exception we need to throw. 486 // exception we need to throw.
490 if (IsContextual(object)) { 487 if (IsContextual(object)) {
491 return ReferenceError("not_defined", name); 488 return ReferenceError("not_defined", name);
492 } 489 }
490 // TODO(mmaly): Should we do ToObject here?
Mads Ager (chromium) 2011/02/16 10:43:54 Nope, there is no change to this code and it makes
Martin Maly 2011/02/17 05:25:55 Done.
493 return TypeError("undefined_method", object, name); 491 return TypeError("undefined_method", object, name);
494 } 492 }
495 493
496 // Lookup is valid: Update inline cache and stub cache. 494 // Lookup is valid: Update inline cache and stub cache.
497 if (FLAG_use_ic) { 495 if (FLAG_use_ic) {
498 UpdateCaches(&lookup, state, extra_ic_state, object, name); 496 UpdateCaches(&lookup, state, extra_ic_state, object, name);
499 } 497 }
500 498
501 // Get the property. 499 // Get the property.
502 PropertyAttributes attr; 500 PropertyAttributes attr;
503 Object* result; 501 Object* result;
504 { MaybeObject* maybe_result = 502 { MaybeObject* maybe_result =
505 object->GetProperty(*object, &lookup, *name, &attr); 503 object->GetProperty(*object, &lookup, *name, &attr);
506 if (!maybe_result->ToObject(&result)) return maybe_result; 504 if (!maybe_result->ToObject(&result)) return maybe_result;
507 } 505 }
506
507 // For non-strict mode functions, make receiver an object.
508 if ((!result->IsJSFunction() ||
509 !JSFunction::cast(result)->shared()->strict_mode()) &&
510 (object->IsString() || object->IsNumber() || object->IsBoolean())) {
511 ReceiverToObject(object);
Vitaly Repeshko 2011/02/16 11:52:12 1. Since this is now done after UpdateCaches, plea
Martin Maly 2011/02/17 05:25:55 Done and done. for the builtin change I ran full t
512 }
513
508 if (lookup.type() == INTERCEPTOR) { 514 if (lookup.type() == INTERCEPTOR) {
509 // If the object does not have the requested property, check which 515 // If the object does not have the requested property, check which
510 // exception we need to throw. 516 // exception we need to throw.
511 if (attr == ABSENT) { 517 if (attr == ABSENT) {
512 if (IsContextual(object)) { 518 if (IsContextual(object)) {
513 return ReferenceError("not_defined", name); 519 return ReferenceError("not_defined", name);
514 } 520 }
515 return TypeError("undefined_method", object, name); 521 return TypeError("undefined_method", object, name);
516 } 522 }
517 } 523 }
(...skipping 1768 matching lines...) Expand 10 before | Expand all | Expand 10 after
2286 #undef ADDR 2292 #undef ADDR
2287 }; 2293 };
2288 2294
2289 2295
2290 Address IC::AddressFromUtilityId(IC::UtilityId id) { 2296 Address IC::AddressFromUtilityId(IC::UtilityId id) {
2291 return IC_utilities[id]; 2297 return IC_utilities[id];
2292 } 2298 }
2293 2299
2294 2300
2295 } } // namespace v8::internal 2301 } } // namespace v8::internal
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698