Index: src/accessors.cc |
diff --git a/src/accessors.cc b/src/accessors.cc |
index aa09e3b4ce1600e6ecef6aaf6181ce30f0fe289f..a7340964dcd172ebde31567eee5244531cd2e6d6 100644 |
--- a/src/accessors.cc |
+++ b/src/accessors.cc |
@@ -889,31 +889,57 @@ Handle<AccessorInfo> Accessors::FunctionPrototypeInfo( |
// |
-Object* Accessors::FunctionGetLength(Isolate* isolate, |
- Object* object, |
- void*) { |
- JSFunction* function = FindInstanceOf<JSFunction>(isolate, object); |
- if (function == NULL) return Smi::FromInt(0); |
- // Check if already compiled. |
- if (function->shared()->is_compiled()) { |
- return Smi::FromInt(function->shared()->length()); |
- } |
- // If the function isn't compiled yet, the length is not computed correctly |
- // yet. Compile it now and return the right length. |
+void Accessors::FunctionLengthGetter( |
+ v8::Local<v8::String> name, |
+ const v8::PropertyCallbackInfo<v8::Value>& info) { |
+ i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate()); |
HandleScope scope(isolate); |
- Handle<JSFunction> function_handle(function); |
- if (Compiler::EnsureCompiled(function_handle, KEEP_EXCEPTION)) { |
- return Smi::FromInt(function_handle->shared()->length()); |
+ Handle<Object> object = Utils::OpenHandle(*info.This()); |
+ MaybeHandle<JSFunction> maybe_function; |
+ |
+ { |
+ DisallowHeapAllocation no_allocation; |
+ JSFunction* function = FindInstanceOf<JSFunction>(isolate, *object); |
+ if (function != NULL) maybe_function = Handle<JSFunction>(function); |
+ } |
+ |
+ int length = 0; |
+ Handle<JSFunction> function; |
+ if (maybe_function.ToHandle(&function)) { |
+ if (function->shared()->is_compiled()) { |
+ length = function->shared()->length(); |
+ } else { |
+ // If the function isn't compiled yet, the length is not computed |
+ // correctly yet. Compile it now and return the right length. |
+ if (Compiler::EnsureCompiled(function, KEEP_EXCEPTION)) { |
+ length = function->shared()->length(); |
+ } |
+ if (isolate->has_pending_exception()) { |
+ isolate->OptionalRescheduleException(false); |
ulan
2014/04/24 10:27:03
I added a test that checks this.
|
+ } |
+ } |
} |
- return isolate->heap()->exception(); |
+ Handle<Object> result(Smi::FromInt(length), isolate); |
+ info.GetReturnValue().Set(Utils::ToLocal(result)); |
} |
-const AccessorDescriptor Accessors::FunctionLength = { |
- FunctionGetLength, |
- ReadOnlySetAccessor, |
- 0 |
-}; |
+void Accessors::FunctionLengthSetter( |
+ v8::Local<v8::String> name, |
+ v8::Local<v8::Value> val, |
+ const v8::PropertyCallbackInfo<void>& info) { |
+ // Do nothing. |
+} |
+ |
+ |
+Handle<AccessorInfo> Accessors::FunctionLengthInfo( |
+ Isolate* isolate, PropertyAttributes attributes) { |
+ return MakeAccessor(isolate, |
+ isolate->factory()->length_string(), |
+ &FunctionLengthGetter, |
+ &FunctionLengthSetter, |
+ attributes); |
+} |
// |