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; |
| } |