From: hablich Date: Mon, 17 Aug 2015 15:31:46 +0000 (-0700) Subject: Revert of Remove property loads from js builtins objects from runtime. (patchset... X-Git-Tag: upstream/4.7.83~839 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=76dc58c93656046d7ae07166309d8323844dfa38;p=platform%2Fupstream%2Fv8.git Revert of Remove property loads from js builtins objects from runtime. (patchset #1 id:1 of https://codereview.chromium.org/1293113002/ ) Reason for revert: Reverting because it made the waterfall red http://build.chromium.org/p/client.v8/builders/V8%20Win32%20-%20nosnap%20-%20shared/builds/8390 Original issue's description: > Remove property loads from js builtins objects from runtime. > > R=cbruni@chromium.org > > Committed: https://crrev.com/40f6e80d22d2e146b781aa661b76087ab9a492c4 > Cr-Commit-Position: refs/heads/master@{#30199} TBR=cbruni@chromium.org,yangguo@chromium.org NOPRESUBMIT=true NOTREECHECKS=true NOTRY=true Review URL: https://codereview.chromium.org/1294123002 Cr-Commit-Position: refs/heads/master@{#30201} --- diff --git a/src/api.cc b/src/api.cc index 469d9c633..46cac758f 100644 --- a/src/api.cc +++ b/src/api.cc @@ -2275,15 +2275,31 @@ v8::Local Message::GetStackTrace() const { } +MUST_USE_RESULT static i::MaybeHandle CallV8HeapFunction( + i::Isolate* isolate, const char* name, i::Handle recv, int argc, + i::Handle argv[]) { + i::Handle object_fun = + i::Object::GetProperty( + isolate, isolate->js_builtins_object(), name).ToHandleChecked(); + i::Handle fun = i::Handle::cast(object_fun); + return i::Execution::Call(isolate, fun, recv, argc, argv); +} + + +MUST_USE_RESULT static i::MaybeHandle CallV8HeapFunction( + i::Isolate* isolate, const char* name, i::Handle data) { + i::Handle argv[] = { data }; + return CallV8HeapFunction(isolate, name, isolate->js_builtins_object(), + arraysize(argv), argv); +} + + Maybe Message::GetLineNumber(Local context) const { PREPARE_FOR_EXECUTION_PRIMITIVE(context, "v8::Message::GetLineNumber()", int); - i::Handle fun = isolate->message_get_line_number(); - i::Handle undefined = isolate->factory()->undefined_value(); - i::Handle args[] = {Utils::OpenHandle(this)}; i::Handle result; has_pending_exception = - !i::Execution::Call(isolate, fun, undefined, arraysize(args), args) - .ToHandle(&result); + !CallV8HeapFunction(isolate, "$messageGetLineNumber", + Utils::OpenHandle(this)).ToHandle(&result); RETURN_ON_FAILED_EXECUTION_PRIMITIVE(int); return Just(static_cast(result->Number())); } @@ -2310,15 +2326,13 @@ int Message::GetEndPosition() const { Maybe Message::GetStartColumn(Local context) const { PREPARE_FOR_EXECUTION_PRIMITIVE(context, "v8::Message::GetStartColumn()", int); - i::Handle fun = isolate->message_get_column_number(); - i::Handle undefined = isolate->factory()->undefined_value(); - i::Handle args[] = {Utils::OpenHandle(this)}; - i::Handle result; + auto self = Utils::OpenHandle(this); + i::Handle start_col_obj; has_pending_exception = - !i::Execution::Call(isolate, fun, undefined, arraysize(args), args) - .ToHandle(&result); + !CallV8HeapFunction(isolate, "$messageGetPositionInLine", self) + .ToHandle(&start_col_obj); RETURN_ON_FAILED_EXECUTION_PRIMITIVE(int); - return Just(static_cast(result->Number())); + return Just(static_cast(start_col_obj->Number())); } @@ -2330,19 +2344,16 @@ int Message::GetStartColumn() const { Maybe Message::GetEndColumn(Local context) const { - auto self = Utils::OpenHandle(this); PREPARE_FOR_EXECUTION_PRIMITIVE(context, "v8::Message::GetEndColumn()", int); - i::Handle fun = isolate->message_get_column_number(); - i::Handle undefined = isolate->factory()->undefined_value(); - i::Handle args[] = {self}; - i::Handle result; + auto self = Utils::OpenHandle(this); + i::Handle start_col_obj; has_pending_exception = - !i::Execution::Call(isolate, fun, undefined, arraysize(args), args) - .ToHandle(&result); + !CallV8HeapFunction(isolate, "$messageGetPositionInLine", self) + .ToHandle(&start_col_obj); RETURN_ON_FAILED_EXECUTION_PRIMITIVE(int); int start = self->start_position(); int end = self->end_position(); - return Just(static_cast(result->Number()) + (end - start)); + return Just(static_cast(start_col_obj->Number()) + (end - start)); } @@ -2376,13 +2387,10 @@ bool Message::IsOpaque() const { MaybeLocal Message::GetSourceLine(Local context) const { PREPARE_FOR_EXECUTION(context, "v8::Message::GetSourceLine()", String); - i::Handle fun = isolate->message_get_source_line(); - i::Handle undefined = isolate->factory()->undefined_value(); - i::Handle args[] = {Utils::OpenHandle(this)}; i::Handle result; has_pending_exception = - !i::Execution::Call(isolate, fun, undefined, arraysize(args), args) - .ToHandle(&result); + !CallV8HeapFunction(isolate, "$messageGetSourceLine", + Utils::OpenHandle(this)).ToHandle(&result); RETURN_ON_FAILED_EXECUTION(String); Local str; if (result->IsString()) { @@ -3372,11 +3380,9 @@ Maybe Value::Equals(Local context, Local that) const { } PREPARE_FOR_EXECUTION_PRIMITIVE(context, "v8::Value::Equals()", bool); i::Handle args[] = { other }; - i::Handle fun(i::JSFunction::cast( - isolate->js_builtins_object()->javascript_builtin(i::Builtins::EQUALS))); i::Handle result; has_pending_exception = - !i::Execution::Call(isolate, fun, self, arraysize(args), args) + !CallV8HeapFunction(isolate, "EQUALS", self, arraysize(args), args) .ToHandle(&result); RETURN_ON_FAILED_EXECUTION_PRIMITIVE(bool); return Just(*result == i::Smi::FromInt(i::EQUAL)); @@ -3506,12 +3512,11 @@ Maybe v8::Object::DefineOwnProperty(v8::Local context, i::Handle desc_array = isolate->factory()->NewJSArrayWithElements(desc, i::FAST_ELEMENTS, 3); i::Handle args[] = {self, key_obj, value_obj, desc_array}; - i::Handle undefined = isolate->factory()->undefined_value(); - i::Handle fun = isolate->object_define_own_property(); i::Handle result; has_pending_exception = - !i::Execution::Call(isolate, fun, undefined, arraysize(args), args) - .ToHandle(&result); + !CallV8HeapFunction(isolate, "$objectDefineOwnProperty", + isolate->factory()->undefined_value(), + arraysize(args), args).ToHandle(&result); RETURN_ON_FAILED_EXECUTION_PRIMITIVE(bool); return Just(result->BooleanValue()); } @@ -3643,12 +3648,11 @@ MaybeLocal v8::Object::GetOwnPropertyDescriptor(Local context, auto obj = Utils::OpenHandle(this); auto key_name = Utils::OpenHandle(*key); i::Handle args[] = { obj, key_name }; - i::Handle fun = isolate->object_get_own_property_descriptor(); - i::Handle undefined = isolate->factory()->undefined_value(); i::Handle result; has_pending_exception = - !i::Execution::Call(isolate, fun, undefined, arraysize(args), args) - .ToHandle(&result); + !CallV8HeapFunction(isolate, "$objectGetOwnPropertyDescriptor", + isolate->factory()->undefined_value(), + arraysize(args), args).ToHandle(&result); RETURN_ON_FAILED_EXECUTION(Value); RETURN_ESCAPED(Utils::ToLocal(result)); } diff --git a/src/bootstrapper.cc b/src/bootstrapper.cc index 5f4e0995f..62d417e17 100644 --- a/src/bootstrapper.cc +++ b/src/bootstrapper.cc @@ -1754,16 +1754,6 @@ void Bootstrapper::ImportNatives(Isolate* isolate, Handle container) { INSTALL_NATIVE(JSFunction, "GetStackTraceLine", get_stack_trace_line_fun); INSTALL_NATIVE(JSFunction, "ToCompletePropertyDescriptor", to_complete_property_descriptor); - INSTALL_NATIVE(JSFunction, "ObjectDefineOwnProperty", - object_define_own_property); - INSTALL_NATIVE(JSFunction, "ObjectGetOwnPropertyDescriptor", - object_get_own_property_descriptor); - INSTALL_NATIVE(JSFunction, "MessageGetLineNumber", message_get_line_number); - INSTALL_NATIVE(JSFunction, "MessageGetColumnNumber", - message_get_column_number); - INSTALL_NATIVE(JSFunction, "MessageGetSourceLine", message_get_source_line); - INSTALL_NATIVE(JSObject, "StackOverflowBoilerplate", - stack_overflow_boilerplate); INSTALL_NATIVE(JSFunction, "JsonSerializeAdapter", json_serialize_adapter); INSTALL_NATIVE(JSFunction, "Error", error_function); diff --git a/src/contexts.h b/src/contexts.h index 9e6fc0e4f..9271b06dc 100644 --- a/src/contexts.h +++ b/src/contexts.h @@ -172,13 +172,6 @@ enum BindingFlags { promise_has_user_defined_reject_handler) \ V(TO_COMPLETE_PROPERTY_DESCRIPTOR_INDEX, JSFunction, \ to_complete_property_descriptor) \ - V(OBJECT_DEFINE_OWN_PROPERTY_INDEX, JSFunction, object_define_own_property) \ - V(OBJECT_GET_OWN_PROPERTY_DESCROPTOR_INDEX, JSFunction, \ - object_get_own_property_descriptor) \ - V(MESSAGE_GET_LINE_NUMBER_INDEX, JSFunction, message_get_line_number) \ - V(MESSAGE_GET_COLUMN_NUMBER_INDEX, JSFunction, message_get_column_number) \ - V(MESSAGE_GET_SOURCE_LINE_INDEX, JSFunction, message_get_source_line) \ - V(STACK_OVERFLOW_BOILERPLATE_INDEX, JSObject, stack_overflow_boilerplate) \ V(JSON_SERIALIZE_ADAPTER_INDEX, JSFunction, json_serialize_adapter) \ V(DERIVED_HAS_TRAP_INDEX, JSFunction, derived_has_trap) \ V(DERIVED_GET_TRAP_INDEX, JSFunction, derived_get_trap) \ diff --git a/src/isolate.cc b/src/isolate.cc index 298547477..06e3c6113 100644 --- a/src/isolate.cc +++ b/src/isolate.cc @@ -845,8 +845,14 @@ Object* Isolate::StackOverflow() { // At this point we cannot create an Error object using its javascript // constructor. Instead, we copy the pre-constructed boilerplate and // attach the stack trace as a hidden property. - Handle boilerplate = stack_overflow_boilerplate(); - Handle exception = factory()->CopyJSObject(boilerplate); + Handle key = factory()->stack_overflow_string(); + Handle boilerplate = + Object::GetProperty(js_builtins_object(), key).ToHandleChecked(); + if (boilerplate->IsUndefined()) { + return Throw(heap()->undefined_value(), nullptr); + } + Handle exception = + factory()->CopyJSObject(Handle::cast(boilerplate)); Throw(*exception, nullptr); CaptureAndSetSimpleStackTrace(exception, factory()->undefined_value()); diff --git a/src/messages.js b/src/messages.js index a111660bc..712dba428 100644 --- a/src/messages.js +++ b/src/messages.js @@ -5,7 +5,12 @@ // ------------------------------------------------------------------- var $errorToString; +var $getStackTraceLine; var $internalErrorSymbol; +var $messageGetPositionInLine; +var $messageGetLineNumber; +var $messageGetSourceLine; +var $stackOverflowBoilerplate; var $stackTraceSymbol; var MakeError; var MakeEvalError; @@ -208,16 +213,6 @@ function GetLineNumber(message) { } -//Returns the offset of the given position within the containing line. -function GetColumnNumber(message) { - var script = %MessageGetScript(message); - var start_position = %MessageGetStartPosition(message); - var location = script.locationFromPosition(start_position, true); - if (location == null) return -1; - return location.column; -} - - // Returns the source code line containing the given source // position, or the empty string if the position is invalid. function GetSourceLine(message) { @@ -228,7 +223,6 @@ function GetSourceLine(message) { return location.sourceText(); } - /** * Find a line number given a specific source position. * @param {number} position The source position. @@ -562,6 +556,17 @@ utils.SetUpLockedPrototype(SourceSlice, ); +// Returns the offset of the given position within the containing +// line. +function GetPositionInLine(message) { + var script = %MessageGetScript(message); + var start_position = %MessageGetStartPosition(message); + var location = script.locationFromPosition(start_position, true); + if (location == null) return -1; + return location.column; +} + + function GetStackTraceLine(recv, fun, pos, isGlobal) { return new CallSite(recv, fun, pos, false).toString(); } @@ -1000,6 +1005,9 @@ utils.InstallFunctions(GlobalError.prototype, DONT_ENUM, ['toString', ErrorToString]); $errorToString = ErrorToString; +$messageGetPositionInLine = GetPositionInLine; +$messageGetLineNumber = GetLineNumber; +$messageGetSourceLine = GetSourceLine; MakeError = function(type, arg0, arg1, arg2) { return MakeGenericError(GlobalError, type, arg0, arg1, arg2); @@ -1023,8 +1031,8 @@ MakeURIError = function() { // Boilerplate for exceptions for stack overflows. Used from // Isolate::StackOverflow(). -var StackOverflowBoilerplate = MakeRangeError(kStackOverflow); -%DefineAccessorPropertyUnchecked(StackOverflowBoilerplate, 'stack', +$stackOverflowBoilerplate = MakeRangeError(kStackOverflow); +%DefineAccessorPropertyUnchecked($stackOverflowBoilerplate, 'stack', StackTraceGetter, StackTraceSetter, DONT_ENUM); @@ -1051,10 +1059,6 @@ utils.ExportToRuntime(function(to) { to.NoSideEffectToString = NoSideEffectToString; to.ToDetailString = ToDetailString; to.MakeError = MakeGenericError; - to.MessageGetLineNumber = GetLineNumber; - to.MessageGetColumnNumber = GetColumnNumber; - to.MessageGetSourceLine = GetSourceLine; - to.StackOverflowBoilerplate = StackOverflowBoilerplate; }); }); diff --git a/src/v8natives.js b/src/v8natives.js index 9d37e7cf6..a49254736 100644 --- a/src/v8natives.js +++ b/src/v8natives.js @@ -3,6 +3,8 @@ // found in the LICENSE file. var $functionSourceString; +var $objectDefineOwnProperty; +var $objectGetOwnPropertyDescriptor; (function(global, utils) { @@ -1783,6 +1785,8 @@ function GetIterator(obj, method) { // Exports $functionSourceString = FunctionSourceString; +$objectDefineOwnProperty = DefineOwnPropertyFromAPI; +$objectGetOwnPropertyDescriptor = ObjectGetOwnPropertyDescriptor; utils.ObjectDefineProperties = ObjectDefineProperties; utils.ObjectDefineProperty = ObjectDefineProperty; @@ -1808,8 +1812,6 @@ utils.Export(function(to) { utils.ExportToRuntime(function(to) { to.GlobalEval = GlobalEval; - to.ObjectDefineOwnProperty = DefineOwnPropertyFromAPI; - to.ObjectGetOwnPropertyDescriptor = ObjectGetOwnPropertyDescriptor; to.ToCompletePropertyDescriptor = ToCompletePropertyDescriptor; });