| OLD | NEW |
| 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 5467 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5478 Object* proto = obj->GetPrototype(); | 5478 Object* proto = obj->GetPrototype(); |
| 5479 while (proto->IsJSObject() && | 5479 while (proto->IsJSObject() && |
| 5480 JSObject::cast(proto)->map()->is_hidden_prototype()) { | 5480 JSObject::cast(proto)->map()->is_hidden_prototype()) { |
| 5481 count++; | 5481 count++; |
| 5482 proto = JSObject::cast(proto)->GetPrototype(); | 5482 proto = JSObject::cast(proto)->GetPrototype(); |
| 5483 } | 5483 } |
| 5484 return count; | 5484 return count; |
| 5485 } | 5485 } |
| 5486 | 5486 |
| 5487 | 5487 |
| 5488 static Object* DebugLookupResultValue(Object* receiver, LookupResult* result, | 5488 static Object* DebugLookupResultValue(Object* receiver, String* name, |
| 5489 LookupResult* result, |
| 5489 bool* caught_exception) { | 5490 bool* caught_exception) { |
| 5490 Object* value; | 5491 Object* value; |
| 5491 switch (result->type()) { | 5492 switch (result->type()) { |
| 5492 case NORMAL: { | 5493 case NORMAL: { |
| 5493 Dictionary* dict = | 5494 Dictionary* dict = |
| 5494 JSObject::cast(result->holder())->property_dictionary(); | 5495 JSObject::cast(result->holder())->property_dictionary(); |
| 5495 value = dict->ValueAt(result->GetDictionaryEntry()); | 5496 value = dict->ValueAt(result->GetDictionaryEntry()); |
| 5496 if (value->IsTheHole()) { | 5497 if (value->IsTheHole()) { |
| 5497 return Heap::undefined_value(); | 5498 return Heap::undefined_value(); |
| 5498 } | 5499 } |
| 5499 return value; | 5500 return value; |
| 5500 } | 5501 } |
| 5501 case FIELD: | 5502 case FIELD: |
| 5502 value = | 5503 value = |
| 5503 JSObject::cast( | 5504 JSObject::cast( |
| 5504 result->holder())->FastPropertyAt(result->GetFieldIndex()); | 5505 result->holder())->FastPropertyAt(result->GetFieldIndex()); |
| 5505 if (value->IsTheHole()) { | 5506 if (value->IsTheHole()) { |
| 5506 return Heap::undefined_value(); | 5507 return Heap::undefined_value(); |
| 5507 } | 5508 } |
| 5508 return value; | 5509 return value; |
| 5509 case CONSTANT_FUNCTION: | 5510 case CONSTANT_FUNCTION: |
| 5510 return result->GetConstantFunction(); | 5511 return result->GetConstantFunction(); |
| 5511 case CALLBACKS: { | 5512 case CALLBACKS: { |
| 5512 Object* structure = result->GetCallbackObject(); | 5513 Object* structure = result->GetCallbackObject(); |
| 5513 if (structure->IsProxy()) { | 5514 if (structure->IsProxy() || structure->IsAccessorInfo()) { |
| 5514 AccessorDescriptor* callback = | 5515 if (Debug::debugger_entry()) { |
| 5515 reinterpret_cast<AccessorDescriptor*>( | 5516 // SaveContext scope. It will restore debugger context after the |
| 5516 Proxy::cast(structure)->proxy()); | 5517 // getter execution. |
| 5517 value = (callback->getter)(receiver, callback->data); | 5518 SaveContext save; |
| 5519 Top::set_context(*Debug::debugger_entry()->GetContext()); |
| 5520 value = receiver->GetPropertyWithCallback( |
| 5521 receiver, structure, name, result->holder()); |
| 5522 } else { |
| 5523 value = receiver->GetPropertyWithCallback( |
| 5524 receiver, structure, name, result->holder()); |
| 5525 } |
| 5518 if (value->IsException()) { | 5526 if (value->IsException()) { |
| 5519 value = Top::pending_exception(); | 5527 value = Top::pending_exception(); |
| 5520 Top::clear_pending_exception(); | 5528 Top::clear_pending_exception(); |
| 5521 if (caught_exception != NULL) { | 5529 if (caught_exception != NULL) { |
| 5522 *caught_exception = true; | 5530 *caught_exception = true; |
| 5523 } | 5531 } |
| 5524 } | 5532 } |
| 5525 return value; | 5533 return value; |
| 5526 } else { | 5534 } else { |
| 5527 return Heap::undefined_value(); | 5535 return Heap::undefined_value(); |
| (...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5588 if (result.IsProperty()) { | 5596 if (result.IsProperty()) { |
| 5589 break; | 5597 break; |
| 5590 } | 5598 } |
| 5591 if (i < length - 1) { | 5599 if (i < length - 1) { |
| 5592 jsproto = Handle<JSObject>(JSObject::cast(jsproto->GetPrototype())); | 5600 jsproto = Handle<JSObject>(JSObject::cast(jsproto->GetPrototype())); |
| 5593 } | 5601 } |
| 5594 } | 5602 } |
| 5595 | 5603 |
| 5596 if (result.IsProperty()) { | 5604 if (result.IsProperty()) { |
| 5597 bool caught_exception = false; | 5605 bool caught_exception = false; |
| 5598 Object* value = DebugLookupResultValue(*obj, &result, | 5606 Object* value = DebugLookupResultValue(*obj, *name, &result, |
| 5599 &caught_exception); | 5607 &caught_exception); |
| 5600 if (value->IsFailure()) return value; | 5608 if (value->IsFailure()) return value; |
| 5601 Handle<Object> value_handle(value); | 5609 Handle<Object> value_handle(value); |
| 5602 // If the callback object is a fixed array then it contains JavaScript | 5610 // If the callback object is a fixed array then it contains JavaScript |
| 5603 // getter and/or setter. | 5611 // getter and/or setter. |
| 5604 bool hasJavaScriptAccessors = result.type() == CALLBACKS && | 5612 bool hasJavaScriptAccessors = result.type() == CALLBACKS && |
| 5605 result.GetCallbackObject()->IsFixedArray(); | 5613 result.GetCallbackObject()->IsFixedArray(); |
| 5606 Handle<FixedArray> details = | 5614 Handle<FixedArray> details = |
| 5607 Factory::NewFixedArray(hasJavaScriptAccessors ? 5 : 2); | 5615 Factory::NewFixedArray(hasJavaScriptAccessors ? 5 : 2); |
| 5608 details->set(0, *value_handle); | 5616 details->set(0, *value_handle); |
| (...skipping 15 matching lines...) Expand all Loading... |
| 5624 HandleScope scope; | 5632 HandleScope scope; |
| 5625 | 5633 |
| 5626 ASSERT(args.length() == 2); | 5634 ASSERT(args.length() == 2); |
| 5627 | 5635 |
| 5628 CONVERT_ARG_CHECKED(JSObject, obj, 0); | 5636 CONVERT_ARG_CHECKED(JSObject, obj, 0); |
| 5629 CONVERT_ARG_CHECKED(String, name, 1); | 5637 CONVERT_ARG_CHECKED(String, name, 1); |
| 5630 | 5638 |
| 5631 LookupResult result; | 5639 LookupResult result; |
| 5632 obj->Lookup(*name, &result); | 5640 obj->Lookup(*name, &result); |
| 5633 if (result.IsProperty()) { | 5641 if (result.IsProperty()) { |
| 5634 return DebugLookupResultValue(*obj, &result, NULL); | 5642 return DebugLookupResultValue(*obj, *name, &result, NULL); |
| 5635 } | 5643 } |
| 5636 return Heap::undefined_value(); | 5644 return Heap::undefined_value(); |
| 5637 } | 5645 } |
| 5638 | 5646 |
| 5639 | 5647 |
| 5640 // Return the names of the local named properties. | 5648 // Return the names of the local named properties. |
| 5641 // args[0]: object | 5649 // args[0]: object |
| 5642 static Object* Runtime_DebugLocalPropertyNames(Arguments args) { | 5650 static Object* Runtime_DebugLocalPropertyNames(Arguments args) { |
| 5643 HandleScope scope; | 5651 HandleScope scope; |
| 5644 ASSERT(args.length() == 1); | 5652 ASSERT(args.length() == 1); |
| (...skipping 1392 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7037 } else { | 7045 } else { |
| 7038 // Handle last resort GC and make sure to allow future allocations | 7046 // Handle last resort GC and make sure to allow future allocations |
| 7039 // to grow the heap without causing GCs (if possible). | 7047 // to grow the heap without causing GCs (if possible). |
| 7040 Counters::gc_last_resort_from_js.Increment(); | 7048 Counters::gc_last_resort_from_js.Increment(); |
| 7041 Heap::CollectAllGarbage(); | 7049 Heap::CollectAllGarbage(); |
| 7042 } | 7050 } |
| 7043 } | 7051 } |
| 7044 | 7052 |
| 7045 | 7053 |
| 7046 } } // namespace v8::internal | 7054 } } // namespace v8::internal |
| OLD | NEW |