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

Unified Diff: src/messages.cc

Issue 1122973002: Move more parts of stack trace formatting to runtime. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: addressed comments Created 5 years, 7 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 | « src/messages.h ('k') | src/messages.js » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/messages.cc
diff --git a/src/messages.cc b/src/messages.cc
index 7dc5f64f00c9e3ee9966e8105dfc6a0a64970728..81fcdec51cd94421cc1d55263b8dc87be1b7d63b 100644
--- a/src/messages.cc
+++ b/src/messages.cc
@@ -197,6 +197,67 @@ Handle<Object> CallSite::GetScriptNameOrSourceUrl(Isolate* isolate) {
}
+bool CheckMethodName(Handle<JSObject> obj, Handle<Name> name,
+ Handle<JSFunction> fun,
+ LookupIterator::Configuration config) {
+ LookupIterator iter(obj, name, config);
+ if (iter.state() == LookupIterator::DATA) {
+ return iter.GetDataValue().is_identical_to(fun);
+ } else if (iter.state() == LookupIterator::ACCESSOR) {
+ Handle<Object> accessors = iter.GetAccessors();
+ if (accessors->IsAccessorPair()) {
+ Handle<AccessorPair> pair = Handle<AccessorPair>::cast(accessors);
+ return pair->getter() == *fun || pair->setter() == *fun;
+ }
+ }
+ return false;
+}
+
+
+Handle<Object> CallSite::GetMethodName(Isolate* isolate) {
+ MaybeHandle<JSReceiver> maybe = Object::ToObject(isolate, receiver_);
+ Handle<JSReceiver> receiver;
+ if (!maybe.ToHandle(&receiver) || !receiver->IsJSObject()) {
+ return isolate->factory()->null_value();
+ }
+
+ Handle<JSObject> obj = Handle<JSObject>::cast(receiver);
+ Handle<Object> function_name(fun_->shared()->name(), isolate);
+ if (function_name->IsName()) {
+ Handle<Name> name = Handle<Name>::cast(function_name);
+ if (CheckMethodName(obj, name, fun_,
+ LookupIterator::PROTOTYPE_CHAIN_SKIP_INTERCEPTOR))
+ return name;
+ }
+
+ HandleScope outer_scope(isolate);
+ Handle<Object> result;
+ for (PrototypeIterator iter(isolate, obj,
+ PrototypeIterator::START_AT_RECEIVER);
+ !iter.IsAtEnd(); iter.Advance()) {
+ Handle<Object> current = PrototypeIterator::GetCurrent(iter);
+ if (!current->IsJSObject()) break;
+ Handle<JSObject> current_obj = Handle<JSObject>::cast(current);
+ if (current_obj->IsAccessCheckNeeded()) break;
+ Handle<FixedArray> keys = JSObject::GetEnumPropertyKeys(current_obj, false);
+ for (int i = 0; i < keys->length(); i++) {
+ HandleScope inner_scope(isolate);
+ if (!keys->get(i)->IsName()) continue;
+ Handle<Name> name_key(Name::cast(keys->get(i)), isolate);
+ if (!CheckMethodName(current_obj, name_key, fun_,
+ LookupIterator::OWN_SKIP_INTERCEPTOR))
+ continue;
+ // Return null in case of duplicates to avoid confusion.
+ if (!result.is_null()) return isolate->factory()->null_value();
+ result = inner_scope.CloseAndEscape(name_key);
+ }
+ }
+
+ if (!result.is_null()) return outer_scope.CloseAndEscape(result);
+ return isolate->factory()->null_value();
+}
+
+
int CallSite::GetLineNumber(Isolate* isolate) {
if (pos_ >= 0) {
Handle<Object> script_obj(fun_->shared()->script(), isolate);
@@ -242,6 +303,15 @@ bool CallSite::IsEval(Isolate* isolate) {
}
+bool CallSite::IsConstructor(Isolate* isolate) {
+ if (!receiver_->IsJSObject()) return false;
+ Handle<Object> constructor =
+ JSObject::GetDataProperty(Handle<JSObject>::cast(receiver_),
+ isolate->factory()->constructor_string());
+ return constructor.is_identical_to(fun_);
+}
+
+
MaybeHandle<String> MessageTemplate::FormatMessage(int template_index,
Handle<String> arg0,
Handle<String> arg1,
« no previous file with comments | « src/messages.h ('k') | src/messages.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698