| OLD | NEW |
| 1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 96 | 96 |
| 97 | 97 |
| 98 MaybeObject* Accessors::ArraySetLength(JSObject* object, Object* value, void*) { | 98 MaybeObject* Accessors::ArraySetLength(JSObject* object, Object* value, void*) { |
| 99 Isolate* isolate = object->GetIsolate(); | 99 Isolate* isolate = object->GetIsolate(); |
| 100 | 100 |
| 101 // This means one of the object's prototypes is a JSArray and the | 101 // This means one of the object's prototypes is a JSArray and the |
| 102 // object does not have a 'length' property. Calling SetProperty | 102 // object does not have a 'length' property. Calling SetProperty |
| 103 // causes an infinite loop. | 103 // causes an infinite loop. |
| 104 if (!object->IsJSArray()) { | 104 if (!object->IsJSArray()) { |
| 105 return object->SetLocalPropertyIgnoreAttributes( | 105 return object->SetLocalPropertyIgnoreAttributes( |
| 106 isolate->heap()->length_symbol(), value, NONE); | 106 isolate->heap()->length_string(), value, NONE); |
| 107 } | 107 } |
| 108 | 108 |
| 109 value = FlattenNumber(value); | 109 value = FlattenNumber(value); |
| 110 | 110 |
| 111 // Need to call methods that may trigger GC. | 111 // Need to call methods that may trigger GC. |
| 112 HandleScope scope(isolate); | 112 HandleScope scope(isolate); |
| 113 | 113 |
| 114 // Protect raw pointers. | 114 // Protect raw pointers. |
| 115 Handle<JSArray> array_handle(JSArray::cast(object), isolate); | 115 Handle<JSArray> array_handle(JSArray::cast(object), isolate); |
| 116 Handle<Object> value_handle(value, isolate); | 116 Handle<Object> value_handle(value, isolate); |
| (...skipping 349 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 466 | 466 |
| 467 MaybeObject* Accessors::FunctionSetPrototype(JSObject* object, | 467 MaybeObject* Accessors::FunctionSetPrototype(JSObject* object, |
| 468 Object* value_raw, | 468 Object* value_raw, |
| 469 void*) { | 469 void*) { |
| 470 Isolate* isolate = object->GetIsolate(); | 470 Isolate* isolate = object->GetIsolate(); |
| 471 Heap* heap = isolate->heap(); | 471 Heap* heap = isolate->heap(); |
| 472 JSFunction* function_raw = FindInstanceOf<JSFunction>(object); | 472 JSFunction* function_raw = FindInstanceOf<JSFunction>(object); |
| 473 if (function_raw == NULL) return heap->undefined_value(); | 473 if (function_raw == NULL) return heap->undefined_value(); |
| 474 if (!function_raw->should_have_prototype()) { | 474 if (!function_raw->should_have_prototype()) { |
| 475 // Since we hit this accessor, object will have no prototype property. | 475 // Since we hit this accessor, object will have no prototype property. |
| 476 return object->SetLocalPropertyIgnoreAttributes(heap->prototype_symbol(), | 476 return object->SetLocalPropertyIgnoreAttributes(heap->prototype_string(), |
| 477 value_raw, | 477 value_raw, |
| 478 NONE); | 478 NONE); |
| 479 } | 479 } |
| 480 | 480 |
| 481 HandleScope scope(isolate); | 481 HandleScope scope(isolate); |
| 482 Handle<JSFunction> function(function_raw, isolate); | 482 Handle<JSFunction> function(function_raw, isolate); |
| 483 Handle<Object> value(value_raw, isolate); | 483 Handle<Object> value(value_raw, isolate); |
| 484 | 484 |
| 485 Handle<Object> old_value; | 485 Handle<Object> old_value; |
| 486 bool is_observed = | 486 bool is_observed = |
| 487 FLAG_harmony_observation && | 487 FLAG_harmony_observation && |
| 488 *function == object && | 488 *function == object && |
| 489 function->map()->is_observed(); | 489 function->map()->is_observed(); |
| 490 if (is_observed) { | 490 if (is_observed) { |
| 491 if (function->has_prototype()) | 491 if (function->has_prototype()) |
| 492 old_value = handle(function->prototype(), isolate); | 492 old_value = handle(function->prototype(), isolate); |
| 493 else | 493 else |
| 494 old_value = isolate->factory()->NewFunctionPrototype(function); | 494 old_value = isolate->factory()->NewFunctionPrototype(function); |
| 495 } | 495 } |
| 496 | 496 |
| 497 Handle<Object> result; | 497 Handle<Object> result; |
| 498 MaybeObject* maybe_result = function->SetPrototype(*value); | 498 MaybeObject* maybe_result = function->SetPrototype(*value); |
| 499 if (!maybe_result->ToHandle(&result, isolate)) return maybe_result; | 499 if (!maybe_result->ToHandle(&result, isolate)) return maybe_result; |
| 500 ASSERT(function->prototype() == *value); | 500 ASSERT(function->prototype() == *value); |
| 501 | 501 |
| 502 if (is_observed && !old_value->SameValue(*value)) { | 502 if (is_observed && !old_value->SameValue(*value)) { |
| 503 JSObject::EnqueueChangeRecord( | 503 JSObject::EnqueueChangeRecord( |
| 504 function, "updated", isolate->factory()->prototype_symbol(), old_value); | 504 function, "updated", isolate->factory()->prototype_string(), old_value); |
| 505 } | 505 } |
| 506 | 506 |
| 507 return *function; | 507 return *function; |
| 508 } | 508 } |
| 509 | 509 |
| 510 | 510 |
| 511 const AccessorDescriptor Accessors::FunctionPrototype = { | 511 const AccessorDescriptor Accessors::FunctionPrototype = { |
| 512 FunctionGetPrototype, | 512 FunctionGetPrototype, |
| 513 FunctionSetPrototype, | 513 FunctionSetPrototype, |
| 514 0 | 514 0 |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 616 // correct number of arguments and no allocated arguments object, so | 616 // correct number of arguments and no allocated arguments object, so |
| 617 // we can construct a fresh one by interpreting the function's | 617 // we can construct a fresh one by interpreting the function's |
| 618 // deoptimization input data. | 618 // deoptimization input data. |
| 619 return ConstructArgumentsObjectForInlinedFunction(frame, function, i); | 619 return ConstructArgumentsObjectForInlinedFunction(frame, function, i); |
| 620 } | 620 } |
| 621 | 621 |
| 622 if (!frame->is_optimized()) { | 622 if (!frame->is_optimized()) { |
| 623 // If there is an arguments variable in the stack, we return that. | 623 // If there is an arguments variable in the stack, we return that. |
| 624 Handle<ScopeInfo> scope_info(function->shared()->scope_info()); | 624 Handle<ScopeInfo> scope_info(function->shared()->scope_info()); |
| 625 int index = scope_info->StackSlotIndex( | 625 int index = scope_info->StackSlotIndex( |
| 626 isolate->heap()->arguments_symbol()); | 626 isolate->heap()->arguments_string()); |
| 627 if (index >= 0) { | 627 if (index >= 0) { |
| 628 Handle<Object> arguments(frame->GetExpression(index), isolate); | 628 Handle<Object> arguments(frame->GetExpression(index), isolate); |
| 629 if (!arguments->IsArgumentsMarker()) return *arguments; | 629 if (!arguments->IsArgumentsMarker()) return *arguments; |
| 630 } | 630 } |
| 631 } | 631 } |
| 632 | 632 |
| 633 // If there is no arguments variable in the stack or we have an | 633 // If there is no arguments variable in the stack or we have an |
| 634 // optimized frame, we find the frame that holds the actual arguments | 634 // optimized frame, we find the frame that holds the actual arguments |
| 635 // passed to the function. | 635 // passed to the function. |
| 636 it.AdvanceToArgumentsFrame(); | 636 it.AdvanceToArgumentsFrame(); |
| (...skipping 172 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 809 Handle<Object> value(value_raw); | 809 Handle<Object> value(value_raw); |
| 810 Handle<Object> old_value(GetPrototypeSkipHiddenPrototypes(*receiver)); | 810 Handle<Object> old_value(GetPrototypeSkipHiddenPrototypes(*receiver)); |
| 811 | 811 |
| 812 MaybeObject* result = receiver->SetPrototype(*value, kSkipHiddenPrototypes); | 812 MaybeObject* result = receiver->SetPrototype(*value, kSkipHiddenPrototypes); |
| 813 Handle<Object> hresult; | 813 Handle<Object> hresult; |
| 814 if (!result->ToHandle(&hresult, isolate)) return result; | 814 if (!result->ToHandle(&hresult, isolate)) return result; |
| 815 | 815 |
| 816 Handle<Object> new_value(GetPrototypeSkipHiddenPrototypes(*receiver)); | 816 Handle<Object> new_value(GetPrototypeSkipHiddenPrototypes(*receiver)); |
| 817 if (!new_value->SameValue(*old_value)) { | 817 if (!new_value->SameValue(*old_value)) { |
| 818 JSObject::EnqueueChangeRecord(receiver, "prototype", | 818 JSObject::EnqueueChangeRecord(receiver, "prototype", |
| 819 isolate->factory()->Proto_symbol(), | 819 isolate->factory()->proto_string(), |
| 820 old_value); | 820 old_value); |
| 821 } | 821 } |
| 822 return *hresult; | 822 return *hresult; |
| 823 } | 823 } |
| 824 | 824 |
| 825 | 825 |
| 826 const AccessorDescriptor Accessors::ObjectPrototype = { | 826 const AccessorDescriptor Accessors::ObjectPrototype = { |
| 827 ObjectGetPrototype, | 827 ObjectGetPrototype, |
| 828 ObjectSetPrototype, | 828 ObjectSetPrototype, |
| 829 0 | 829 0 |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 888 info->set_data(Smi::FromInt(index)); | 888 info->set_data(Smi::FromInt(index)); |
| 889 Handle<Object> getter = v8::FromCData(&ModuleGetExport); | 889 Handle<Object> getter = v8::FromCData(&ModuleGetExport); |
| 890 Handle<Object> setter = v8::FromCData(&ModuleSetExport); | 890 Handle<Object> setter = v8::FromCData(&ModuleSetExport); |
| 891 info->set_getter(*getter); | 891 info->set_getter(*getter); |
| 892 if (!(attributes & ReadOnly)) info->set_setter(*setter); | 892 if (!(attributes & ReadOnly)) info->set_setter(*setter); |
| 893 return info; | 893 return info; |
| 894 } | 894 } |
| 895 | 895 |
| 896 | 896 |
| 897 } } // namespace v8::internal | 897 } } // namespace v8::internal |
| OLD | NEW |