Chromium Code Reviews| Index: src/accessors.cc | 
| diff --git a/src/accessors.cc b/src/accessors.cc | 
| index 2e3bfb80a4d9e2d5d4167506f753bcc954b2a5e8..866fac0d92a17757de07301f27e8920f18e1c981 100644 | 
| --- a/src/accessors.cc | 
| +++ b/src/accessors.cc | 
| @@ -773,74 +773,55 @@ Handle<AccessorInfo> Accessors::ScriptEvalFromFunctionNameInfo( | 
| // Accessors::FunctionPrototype | 
| // | 
| +static Handle<Object> GetFunctionPrototype(Handle<Object> receiver, | 
| + Isolate* isolate) { | 
| 
 
Yang
2014/04/17 05:55:42
I think the convention is (mostly) to have Isolate
 
 | 
| + Handle<JSFunction> function; | 
| + { | 
| + DisallowHeapAllocation no_allocation; | 
| + JSFunction* function_raw = FindInstanceOf<JSFunction>(isolate, *receiver); | 
| + if (function_raw == NULL) return isolate->factory()->undefined_value(); | 
| + while (!function_raw->should_have_prototype()) { | 
| + function_raw = FindInstanceOf<JSFunction>(isolate, | 
| + function_raw->GetPrototype()); | 
| + // There has to be one because we hit the getter. | 
| + ASSERT(function_raw != NULL); | 
| + } | 
| + function = Handle<JSFunction>(function_raw, isolate); | 
| + } | 
| -Handle<Object> Accessors::FunctionGetPrototype(Handle<JSFunction> function) { | 
| - CALL_HEAP_FUNCTION(function->GetIsolate(), | 
| - Accessors::FunctionGetPrototype(function->GetIsolate(), | 
| - *function, | 
| - NULL), | 
| - Object); | 
| + if (!function->has_prototype()) { | 
| + Handle<Object> proto = isolate->factory()->NewFunctionPrototype(function); | 
| + JSFunction::SetPrototype(function, proto); | 
| + } | 
| + return Handle<Object>(function->prototype(), isolate); | 
| } | 
| -Handle<Object> Accessors::FunctionSetPrototype(Handle<JSFunction> function, | 
| - Handle<Object> prototype) { | 
| - ASSERT(function->should_have_prototype()); | 
| - CALL_HEAP_FUNCTION(function->GetIsolate(), | 
| - Accessors::FunctionSetPrototype(function->GetIsolate(), | 
| - *function, | 
| - *prototype, | 
| - NULL), | 
| - Object); | 
| +Handle<Object> Accessors::FunctionGetPrototype(Handle<JSFunction> function) { | 
| + return GetFunctionPrototype(function, function->GetIsolate()); | 
| } | 
| -MaybeObject* Accessors::FunctionGetPrototype(Isolate* isolate, | 
| - Object* object, | 
| - void*) { | 
| - JSFunction* function_raw = FindInstanceOf<JSFunction>(isolate, object); | 
| - if (function_raw == NULL) return isolate->heap()->undefined_value(); | 
| - while (!function_raw->should_have_prototype()) { | 
| - function_raw = FindInstanceOf<JSFunction>(isolate, | 
| - function_raw->GetPrototype()); | 
| - // There has to be one because we hit the getter. | 
| - ASSERT(function_raw != NULL); | 
| - } | 
| - if (!function_raw->has_prototype()) { | 
| - HandleScope scope(isolate); | 
| - Handle<JSFunction> function(function_raw); | 
| - Handle<Object> proto = isolate->factory()->NewFunctionPrototype(function); | 
| - JSFunction::SetPrototype(function, proto); | 
| - function_raw = *function; | 
| +MaybeHandle<Object> SetFunctionPrototype(Handle<JSObject> receiver, | 
| + Handle<Object> value, | 
| + Isolate* isolate) { | 
| 
 
Yang
2014/04/17 05:55:42
Same here.
 
 | 
| + Handle<JSFunction> function; | 
| + { | 
| + DisallowHeapAllocation no_allocation; | 
| + JSFunction* function_raw = FindInstanceOf<JSFunction>(isolate, *receiver); | 
| + if (function_raw == NULL) return isolate->factory()->undefined_value(); | 
| + function = Handle<JSFunction>(function_raw, isolate); | 
| } | 
| - return function_raw->prototype(); | 
| -} | 
| - | 
| - | 
| -MaybeObject* Accessors::FunctionSetPrototype(Isolate* isolate, | 
| - JSObject* object_raw, | 
| - Object* value_raw, | 
| - void*) { | 
| - JSFunction* function_raw = FindInstanceOf<JSFunction>(isolate, object_raw); | 
| - if (function_raw == NULL) return isolate->heap()->undefined_value(); | 
| - HandleScope scope(isolate); | 
| - Handle<JSFunction> function(function_raw, isolate); | 
| - Handle<JSObject> object(object_raw, isolate); | 
| - Handle<Object> value(value_raw, isolate); | 
| if (!function->should_have_prototype()) { | 
| // Since we hit this accessor, object will have no prototype property. | 
| - Handle<Object> result; | 
| - ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 
| - isolate, result, | 
| - JSObject::SetLocalPropertyIgnoreAttributes( | 
| - object, isolate->factory()->prototype_string(), value, NONE)); | 
| - return *result; | 
| + return JSObject::SetLocalPropertyIgnoreAttributes( | 
| + receiver, isolate->factory()->prototype_string(), value, NONE); | 
| } | 
| Handle<Object> old_value; | 
| - bool is_observed = *function == *object && function->map()->is_observed(); | 
| + bool is_observed = *function == *receiver && function->map()->is_observed(); | 
| if (is_observed) { | 
| if (function->has_prototype()) | 
| old_value = handle(function->prototype(), isolate); | 
| @@ -856,7 +837,39 @@ MaybeObject* Accessors::FunctionSetPrototype(Isolate* isolate, | 
| function, "update", isolate->factory()->prototype_string(), old_value); | 
| } | 
| - return *function; | 
| + return function; | 
| +} | 
| + | 
| + | 
| +Handle<Object> Accessors::FunctionSetPrototype(Handle<JSFunction> function, | 
| + Handle<Object> prototype) { | 
| + ASSERT(function->should_have_prototype()); | 
| + Isolate* isolate = function->GetIsolate(); | 
| + Handle<Object> result; | 
| + SetFunctionPrototype(function, prototype, isolate).ToHandle(&result); | 
| + return result; | 
| +} | 
| + | 
| + | 
| +MaybeObject* Accessors::FunctionGetPrototype(Isolate* isolate, | 
| + Object* object, | 
| + void*) { | 
| + HandleScope scope(isolate); | 
| + return *GetFunctionPrototype(Handle<Object>(object, isolate), isolate); | 
| +} | 
| + | 
| + | 
| +MaybeObject* Accessors::FunctionSetPrototype(Isolate* isolate, | 
| + JSObject* object, | 
| + Object* value, | 
| + void*) { | 
| + Handle<Object> result; | 
| + ASSIGN_RETURN_FAILURE_ON_EXCEPTION( | 
| + isolate, result, | 
| + SetFunctionPrototype(Handle<JSObject>(object, isolate), | 
| + Handle<Object>(value, isolate), | 
| + isolate)); | 
| + return *result; | 
| } |