Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(31)

Unified Diff: src/accessors.cc

Issue 410923003: Fix accessors to use holder instead of this (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Remove invalid assert and fix comment Created 6 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/accessors.cc
diff --git a/src/accessors.cc b/src/accessors.cc
index 182f0f63420e26e6c20cfbb3239a3e0f5200082d..cc7c22e223b52bce6a06c7dfc4a6c8001c5a7e63 100644
--- a/src/accessors.cc
+++ b/src/accessors.cc
@@ -21,16 +21,6 @@ namespace v8 {
namespace internal {
-// We have a slight impedance mismatch between the external API and the way we
-// use callbacks internally: Externally, callbacks can only be used with
-// v8::Object, but internally we even have callbacks on entities which are
-// higher in the hierarchy, so we can only return i::Object here, not
-// i::JSObject.
-Handle<Object> GetThisFrom(const v8::PropertyCallbackInfo<v8::Value>& info) {
- return Utils::OpenHandle(*v8::Local<v8::Value>(info.This()));
-}
-
-
Handle<AccessorInfo> Accessors::MakeAccessor(
Isolate* isolate,
Handle<String> name,
@@ -172,15 +162,8 @@ void Accessors::ArrayLengthGetter(
i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate());
DisallowHeapAllocation no_allocation;
HandleScope scope(isolate);
- Object* object = *GetThisFrom(info);
- // Traverse the prototype chain until we reach an array.
- JSArray* holder = FindInstanceOf<JSArray>(isolate, object);
- Object* result;
- if (holder != NULL) {
- result = holder->length();
- } else {
- result = Smi::FromInt(0);
- }
+ JSArray* holder = JSArray::cast(*Utils::OpenHandle(*info.Holder()));
+ Object* result = holder->length();
info.GetReturnValue().Set(Utils::ToLocal(Handle<Object>(result, isolate)));
}
@@ -254,16 +237,19 @@ void Accessors::StringLengthGetter(
i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate());
DisallowHeapAllocation no_allocation;
HandleScope scope(isolate);
- Object* value = *GetThisFrom(info);
- Object* result;
- if (value->IsJSValue()) value = JSValue::cast(value)->value();
- if (value->IsString()) {
- result = Smi::FromInt(String::cast(value)->length());
- } else {
- // If object is not a string we return 0 to be compatible with WebKit.
- // Note: Firefox returns the length of ToString(object).
- result = Smi::FromInt(0);
+
+ // We have a slight impedance mismatch between the external API and the way we
+ // use callbacks internally: Externally, callbacks can only be used with
+ // v8::Object, but internally we have callbacks on entities which are higher
+ // in the hierarchy, in this case for String values.
+
+ Object* value = *Utils::OpenHandle(*v8::Local<v8::Value>(info.This()));
+ if (!value->IsString()) {
+ // Not a string value. That means that we either got a String wrapper or
+ // a Value with a String wrapper in its prototype chain.
+ value = JSValue::cast(*Utils::OpenHandle(*info.Holder()))->value();
}
+ Object* result = Smi::FromInt(String::cast(value)->length());
info.GetReturnValue().Set(Utils::ToLocal(Handle<Object>(result, isolate)));
}
@@ -839,21 +825,7 @@ Handle<AccessorInfo> Accessors::ScriptEvalFromFunctionNameInfo(
//
static Handle<Object> GetFunctionPrototype(Isolate* isolate,
- Handle<Object> receiver) {
- 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()) {
- PrototypeIterator iter(isolate, function_raw);
- function_raw = FindInstanceOf<JSFunction>(isolate, iter.GetCurrent());
- // There has to be one because we hit the getter.
- ASSERT(function_raw != NULL);
- }
- function = Handle<JSFunction>(function_raw, isolate);
- }
-
+ Handle<JSFunction> function) {
if (!function->has_prototype()) {
Handle<Object> proto = isolate->factory()->NewFunctionPrototype(function);
JSFunction::SetPrototype(function, proto);
@@ -919,8 +891,9 @@ void Accessors::FunctionPrototypeGetter(
const v8::PropertyCallbackInfo<v8::Value>& info) {
i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate());
HandleScope scope(isolate);
- Handle<Object> object = GetThisFrom(info);
- Handle<Object> result = GetFunctionPrototype(isolate, object);
+ Handle<JSFunction> function =
+ Handle<JSFunction>::cast(Utils::OpenHandle(*info.Holder()));
+ Handle<Object> result = GetFunctionPrototype(isolate, function);
info.GetReturnValue().Set(Utils::ToLocal(result));
}
@@ -959,29 +932,20 @@ void Accessors::FunctionLengthGetter(
const v8::PropertyCallbackInfo<v8::Value>& info) {
i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate());
HandleScope scope(isolate);
- Handle<Object> object = GetThisFrom(info);
- MaybeHandle<JSFunction> maybe_function;
-
- {
- DisallowHeapAllocation no_allocation;
- JSFunction* function = FindInstanceOf<JSFunction>(isolate, *object);
- if (function != NULL) maybe_function = Handle<JSFunction>(function);
- }
+ Handle<JSFunction> function =
+ Handle<JSFunction>::cast(Utils::OpenHandle(*info.Holder()));
int length = 0;
- Handle<JSFunction> function;
- if (maybe_function.ToHandle(&function)) {
- if (function->shared()->is_compiled()) {
+ 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();
- } 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);
- }
+ }
+ if (isolate->has_pending_exception()) {
+ isolate->OptionalRescheduleException(false);
}
}
Handle<Object> result(Smi::FromInt(length), isolate);
@@ -1017,22 +981,9 @@ void Accessors::FunctionNameGetter(
const v8::PropertyCallbackInfo<v8::Value>& info) {
i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate());
HandleScope scope(isolate);
- Handle<Object> object = GetThisFrom(info);
- MaybeHandle<JSFunction> maybe_function;
-
- {
- DisallowHeapAllocation no_allocation;
- JSFunction* function = FindInstanceOf<JSFunction>(isolate, *object);
- if (function != NULL) maybe_function = Handle<JSFunction>(function);
- }
-
- Handle<JSFunction> function;
- Handle<Object> result;
- if (maybe_function.ToHandle(&function)) {
- result = Handle<Object>(function->shared()->name(), isolate);
- } else {
- result = isolate->factory()->undefined_value();
- }
+ Handle<JSFunction> function =
+ Handle<JSFunction>::cast(Utils::OpenHandle(*info.Holder()));
+ Handle<Object> result(function->shared()->name(), isolate);
info.GetReturnValue().Set(Utils::ToLocal(result));
}
@@ -1166,22 +1117,9 @@ void Accessors::FunctionArgumentsGetter(
const v8::PropertyCallbackInfo<v8::Value>& info) {
i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate());
HandleScope scope(isolate);
- Handle<Object> object = GetThisFrom(info);
- MaybeHandle<JSFunction> maybe_function;
-
- {
- DisallowHeapAllocation no_allocation;
- JSFunction* function = FindInstanceOf<JSFunction>(isolate, *object);
- if (function != NULL) maybe_function = Handle<JSFunction>(function);
- }
-
- Handle<JSFunction> function;
- Handle<Object> result;
- if (maybe_function.ToHandle(&function)) {
- result = GetFunctionArguments(isolate, function);
- } else {
- result = isolate->factory()->undefined_value();
- }
+ Handle<JSFunction> function =
+ Handle<JSFunction>::cast(Utils::OpenHandle(*info.Holder()));
+ Handle<Object> result = GetFunctionArguments(isolate, function);
info.GetReturnValue().Set(Utils::ToLocal(result));
}
@@ -1321,26 +1259,16 @@ void Accessors::FunctionCallerGetter(
const v8::PropertyCallbackInfo<v8::Value>& info) {
i::Isolate* isolate = reinterpret_cast<i::Isolate*>(info.GetIsolate());
HandleScope scope(isolate);
- Handle<Object> object = GetThisFrom(info);
- MaybeHandle<JSFunction> maybe_function;
- {
- DisallowHeapAllocation no_allocation;
- JSFunction* function = FindInstanceOf<JSFunction>(isolate, *object);
- if (function != NULL) maybe_function = Handle<JSFunction>(function);
- }
- Handle<JSFunction> function;
+ Handle<JSFunction> function =
+ Handle<JSFunction>::cast(Utils::OpenHandle(*info.Holder()));
Handle<Object> result;
- if (maybe_function.ToHandle(&function)) {
- MaybeHandle<JSFunction> maybe_caller;
- maybe_caller = FindCaller(isolate, function);
- Handle<JSFunction> caller;
- if (maybe_caller.ToHandle(&caller)) {
- result = caller;
- } else {
- result = isolate->factory()->null_value();
- }
+ MaybeHandle<JSFunction> maybe_caller;
+ maybe_caller = FindCaller(isolate, function);
+ Handle<JSFunction> caller;
+ if (maybe_caller.ToHandle(&caller)) {
+ result = caller;
} else {
- result = isolate->factory()->undefined_value();
+ result = isolate->factory()->null_value();
}
info.GetReturnValue().Set(Utils::ToLocal(result));
}
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698