| 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 432 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 443 | 443 |
| 444 Handle<Object> Accessors::FunctionGetPrototype(Handle<Object> object) { | 444 Handle<Object> Accessors::FunctionGetPrototype(Handle<Object> object) { |
| 445 Isolate* isolate = Isolate::Current(); | 445 Isolate* isolate = Isolate::Current(); |
| 446 CALL_HEAP_FUNCTION( | 446 CALL_HEAP_FUNCTION( |
| 447 isolate, Accessors::FunctionGetPrototype(*object, 0), Object); | 447 isolate, Accessors::FunctionGetPrototype(*object, 0), Object); |
| 448 } | 448 } |
| 449 | 449 |
| 450 | 450 |
| 451 MaybeObject* Accessors::FunctionGetPrototype(Object* object, void*) { | 451 MaybeObject* Accessors::FunctionGetPrototype(Object* object, void*) { |
| 452 Isolate* isolate = Isolate::Current(); | 452 Isolate* isolate = Isolate::Current(); |
| 453 JSFunction* function = FindInstanceOf<JSFunction>(isolate, object); | 453 JSFunction* function_raw = FindInstanceOf<JSFunction>(isolate, object); |
| 454 if (function == NULL) return isolate->heap()->undefined_value(); | 454 if (function_raw == NULL) return isolate->heap()->undefined_value(); |
| 455 while (!function->should_have_prototype()) { | 455 while (!function_raw->should_have_prototype()) { |
| 456 function = FindInstanceOf<JSFunction>(isolate, function->GetPrototype()); | 456 function_raw = FindInstanceOf<JSFunction>(isolate, |
| 457 function_raw->GetPrototype()); |
| 457 // There has to be one because we hit the getter. | 458 // There has to be one because we hit the getter. |
| 458 ASSERT(function != NULL); | 459 ASSERT(function_raw != NULL); |
| 459 } | 460 } |
| 460 | 461 |
| 461 if (!function->has_prototype()) { | 462 if (!function_raw->has_prototype()) { |
| 462 Object* prototype; | 463 HandleScope scope(isolate); |
| 463 { MaybeObject* maybe_prototype | 464 Handle<JSFunction> function(function_raw); |
| 464 = isolate->heap()->AllocateFunctionPrototype(function); | 465 Handle<Object> proto = isolate->factory()->NewFunctionPrototype(function); |
| 465 if (!maybe_prototype->ToObject(&prototype)) return maybe_prototype; | 466 JSFunction::SetPrototype(function, proto); |
| 466 } | 467 function_raw = *function; |
| 467 Object* result; | |
| 468 { MaybeObject* maybe_result = function->SetPrototype(prototype); | |
| 469 if (!maybe_result->ToObject(&result)) return maybe_result; | |
| 470 } | |
| 471 } | 468 } |
| 472 return function->prototype(); | 469 return function_raw->prototype(); |
| 473 } | 470 } |
| 474 | 471 |
| 475 | 472 |
| 476 MaybeObject* Accessors::FunctionSetPrototype(JSObject* object, | 473 MaybeObject* Accessors::FunctionSetPrototype(JSObject* object, |
| 477 Object* value_raw, | 474 Object* value_raw, |
| 478 void*) { | 475 void*) { |
| 479 Isolate* isolate = object->GetIsolate(); | 476 Isolate* isolate = object->GetIsolate(); |
| 480 Heap* heap = isolate->heap(); | 477 Heap* heap = isolate->heap(); |
| 481 JSFunction* function_raw = FindInstanceOf<JSFunction>(isolate, object); | 478 JSFunction* function_raw = FindInstanceOf<JSFunction>(isolate, object); |
| 482 if (function_raw == NULL) return heap->undefined_value(); | 479 if (function_raw == NULL) return heap->undefined_value(); |
| (...skipping 13 matching lines...) Expand all Loading... |
| 496 FLAG_harmony_observation && | 493 FLAG_harmony_observation && |
| 497 *function == object && | 494 *function == object && |
| 498 function->map()->is_observed(); | 495 function->map()->is_observed(); |
| 499 if (is_observed) { | 496 if (is_observed) { |
| 500 if (function->has_prototype()) | 497 if (function->has_prototype()) |
| 501 old_value = handle(function->prototype(), isolate); | 498 old_value = handle(function->prototype(), isolate); |
| 502 else | 499 else |
| 503 old_value = isolate->factory()->NewFunctionPrototype(function); | 500 old_value = isolate->factory()->NewFunctionPrototype(function); |
| 504 } | 501 } |
| 505 | 502 |
| 506 Handle<Object> result; | 503 JSFunction::SetPrototype(function, value); |
| 507 MaybeObject* maybe_result = function->SetPrototype(*value); | |
| 508 if (!maybe_result->ToHandle(&result, isolate)) return maybe_result; | |
| 509 ASSERT(function->prototype() == *value); | 504 ASSERT(function->prototype() == *value); |
| 510 | 505 |
| 511 if (is_observed && !old_value->SameValue(*value)) { | 506 if (is_observed && !old_value->SameValue(*value)) { |
| 512 JSObject::EnqueueChangeRecord( | 507 JSObject::EnqueueChangeRecord( |
| 513 function, "updated", isolate->factory()->prototype_string(), old_value); | 508 function, "updated", isolate->factory()->prototype_string(), old_value); |
| 514 } | 509 } |
| 515 | 510 |
| 516 return *function; | 511 return *function; |
| 517 } | 512 } |
| 518 | 513 |
| (...skipping 328 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 847 info->set_data(Smi::FromInt(index)); | 842 info->set_data(Smi::FromInt(index)); |
| 848 Handle<Object> getter = v8::FromCData(&ModuleGetExport); | 843 Handle<Object> getter = v8::FromCData(&ModuleGetExport); |
| 849 Handle<Object> setter = v8::FromCData(&ModuleSetExport); | 844 Handle<Object> setter = v8::FromCData(&ModuleSetExport); |
| 850 info->set_getter(*getter); | 845 info->set_getter(*getter); |
| 851 if (!(attributes & ReadOnly)) info->set_setter(*setter); | 846 if (!(attributes & ReadOnly)) info->set_setter(*setter); |
| 852 return info; | 847 return info; |
| 853 } | 848 } |
| 854 | 849 |
| 855 | 850 |
| 856 } } // namespace v8::internal | 851 } } // namespace v8::internal |
| OLD | NEW |