Commit 4106a4cb authored by yangguo's avatar yangguo Committed by Commit bot

Revert of Remove property loads from js builtins objects from runtime....

Revert of Remove property loads from js builtins objects from runtime. (patchset #2 id:20001 of https://codereview.chromium.org/1293113002/ )

Reason for revert:
Still failures in debug-isolates tests

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}
>
> Committed: https://crrev.com/f22d0f205031054a5f3116e052c81ae85741e8e0
> Cr-Commit-Position: refs/heads/master@{#30209}

TBR=cbruni@chromium.org,hpayer@chromium.org
NOPRESUBMIT=true
NOTREECHECKS=true
NOTRY=true

Review URL: https://codereview.chromium.org/1297803003

Cr-Commit-Position: refs/heads/master@{#30213}
parent fc17eec9
...@@ -2275,15 +2275,31 @@ v8::Local<v8::StackTrace> Message::GetStackTrace() const { ...@@ -2275,15 +2275,31 @@ v8::Local<v8::StackTrace> Message::GetStackTrace() const {
} }
MUST_USE_RESULT static i::MaybeHandle<i::Object> CallV8HeapFunction(
i::Isolate* isolate, const char* name, i::Handle<i::Object> recv, int argc,
i::Handle<i::Object> argv[]) {
i::Handle<i::Object> object_fun =
i::Object::GetProperty(
isolate, isolate->js_builtins_object(), name).ToHandleChecked();
i::Handle<i::JSFunction> fun = i::Handle<i::JSFunction>::cast(object_fun);
return i::Execution::Call(isolate, fun, recv, argc, argv);
}
MUST_USE_RESULT static i::MaybeHandle<i::Object> CallV8HeapFunction(
i::Isolate* isolate, const char* name, i::Handle<i::Object> data) {
i::Handle<i::Object> argv[] = { data };
return CallV8HeapFunction(isolate, name, isolate->js_builtins_object(),
arraysize(argv), argv);
}
Maybe<int> Message::GetLineNumber(Local<Context> context) const { Maybe<int> Message::GetLineNumber(Local<Context> context) const {
PREPARE_FOR_EXECUTION_PRIMITIVE(context, "v8::Message::GetLineNumber()", int); PREPARE_FOR_EXECUTION_PRIMITIVE(context, "v8::Message::GetLineNumber()", int);
i::Handle<i::JSFunction> fun = isolate->message_get_line_number();
i::Handle<i::Object> undefined = isolate->factory()->undefined_value();
i::Handle<i::Object> args[] = {Utils::OpenHandle(this)};
i::Handle<i::Object> result; i::Handle<i::Object> result;
has_pending_exception = has_pending_exception =
!i::Execution::Call(isolate, fun, undefined, arraysize(args), args) !CallV8HeapFunction(isolate, "$messageGetLineNumber",
.ToHandle(&result); Utils::OpenHandle(this)).ToHandle(&result);
RETURN_ON_FAILED_EXECUTION_PRIMITIVE(int); RETURN_ON_FAILED_EXECUTION_PRIMITIVE(int);
return Just(static_cast<int>(result->Number())); return Just(static_cast<int>(result->Number()));
} }
...@@ -2310,15 +2326,13 @@ int Message::GetEndPosition() const { ...@@ -2310,15 +2326,13 @@ int Message::GetEndPosition() const {
Maybe<int> Message::GetStartColumn(Local<Context> context) const { Maybe<int> Message::GetStartColumn(Local<Context> context) const {
PREPARE_FOR_EXECUTION_PRIMITIVE(context, "v8::Message::GetStartColumn()", PREPARE_FOR_EXECUTION_PRIMITIVE(context, "v8::Message::GetStartColumn()",
int); int);
i::Handle<i::JSFunction> fun = isolate->message_get_column_number(); auto self = Utils::OpenHandle(this);
i::Handle<i::Object> undefined = isolate->factory()->undefined_value(); i::Handle<i::Object> start_col_obj;
i::Handle<i::Object> args[] = {Utils::OpenHandle(this)};
i::Handle<i::Object> result;
has_pending_exception = has_pending_exception =
!i::Execution::Call(isolate, fun, undefined, arraysize(args), args) !CallV8HeapFunction(isolate, "$messageGetPositionInLine", self)
.ToHandle(&result); .ToHandle(&start_col_obj);
RETURN_ON_FAILED_EXECUTION_PRIMITIVE(int); RETURN_ON_FAILED_EXECUTION_PRIMITIVE(int);
return Just(static_cast<int>(result->Number())); return Just(static_cast<int>(start_col_obj->Number()));
} }
...@@ -2330,19 +2344,16 @@ int Message::GetStartColumn() const { ...@@ -2330,19 +2344,16 @@ int Message::GetStartColumn() const {
Maybe<int> Message::GetEndColumn(Local<Context> context) const { Maybe<int> Message::GetEndColumn(Local<Context> context) const {
auto self = Utils::OpenHandle(this);
PREPARE_FOR_EXECUTION_PRIMITIVE(context, "v8::Message::GetEndColumn()", int); PREPARE_FOR_EXECUTION_PRIMITIVE(context, "v8::Message::GetEndColumn()", int);
i::Handle<i::JSFunction> fun = isolate->message_get_column_number(); auto self = Utils::OpenHandle(this);
i::Handle<i::Object> undefined = isolate->factory()->undefined_value(); i::Handle<i::Object> start_col_obj;
i::Handle<i::Object> args[] = {self};
i::Handle<i::Object> result;
has_pending_exception = has_pending_exception =
!i::Execution::Call(isolate, fun, undefined, arraysize(args), args) !CallV8HeapFunction(isolate, "$messageGetPositionInLine", self)
.ToHandle(&result); .ToHandle(&start_col_obj);
RETURN_ON_FAILED_EXECUTION_PRIMITIVE(int); RETURN_ON_FAILED_EXECUTION_PRIMITIVE(int);
int start = self->start_position(); int start = self->start_position();
int end = self->end_position(); int end = self->end_position();
return Just(static_cast<int>(result->Number()) + (end - start)); return Just(static_cast<int>(start_col_obj->Number()) + (end - start));
} }
...@@ -2376,13 +2387,10 @@ bool Message::IsOpaque() const { ...@@ -2376,13 +2387,10 @@ bool Message::IsOpaque() const {
MaybeLocal<String> Message::GetSourceLine(Local<Context> context) const { MaybeLocal<String> Message::GetSourceLine(Local<Context> context) const {
PREPARE_FOR_EXECUTION(context, "v8::Message::GetSourceLine()", String); PREPARE_FOR_EXECUTION(context, "v8::Message::GetSourceLine()", String);
i::Handle<i::JSFunction> fun = isolate->message_get_source_line();
i::Handle<i::Object> undefined = isolate->factory()->undefined_value();
i::Handle<i::Object> args[] = {Utils::OpenHandle(this)};
i::Handle<i::Object> result; i::Handle<i::Object> result;
has_pending_exception = has_pending_exception =
!i::Execution::Call(isolate, fun, undefined, arraysize(args), args) !CallV8HeapFunction(isolate, "$messageGetSourceLine",
.ToHandle(&result); Utils::OpenHandle(this)).ToHandle(&result);
RETURN_ON_FAILED_EXECUTION(String); RETURN_ON_FAILED_EXECUTION(String);
Local<String> str; Local<String> str;
if (result->IsString()) { if (result->IsString()) {
...@@ -3372,11 +3380,9 @@ Maybe<bool> Value::Equals(Local<Context> context, Local<Value> that) const { ...@@ -3372,11 +3380,9 @@ Maybe<bool> Value::Equals(Local<Context> context, Local<Value> that) const {
} }
PREPARE_FOR_EXECUTION_PRIMITIVE(context, "v8::Value::Equals()", bool); PREPARE_FOR_EXECUTION_PRIMITIVE(context, "v8::Value::Equals()", bool);
i::Handle<i::Object> args[] = { other }; i::Handle<i::Object> args[] = { other };
i::Handle<i::JSFunction> fun(i::JSFunction::cast(
isolate->js_builtins_object()->javascript_builtin(i::Builtins::EQUALS)));
i::Handle<i::Object> result; i::Handle<i::Object> result;
has_pending_exception = has_pending_exception =
!i::Execution::Call(isolate, fun, self, arraysize(args), args) !CallV8HeapFunction(isolate, "EQUALS", self, arraysize(args), args)
.ToHandle(&result); .ToHandle(&result);
RETURN_ON_FAILED_EXECUTION_PRIMITIVE(bool); RETURN_ON_FAILED_EXECUTION_PRIMITIVE(bool);
return Just(*result == i::Smi::FromInt(i::EQUAL)); return Just(*result == i::Smi::FromInt(i::EQUAL));
...@@ -3506,12 +3512,11 @@ Maybe<bool> v8::Object::DefineOwnProperty(v8::Local<v8::Context> context, ...@@ -3506,12 +3512,11 @@ Maybe<bool> v8::Object::DefineOwnProperty(v8::Local<v8::Context> context,
i::Handle<i::JSArray> desc_array = i::Handle<i::JSArray> desc_array =
isolate->factory()->NewJSArrayWithElements(desc, i::FAST_ELEMENTS, 3); isolate->factory()->NewJSArrayWithElements(desc, i::FAST_ELEMENTS, 3);
i::Handle<i::Object> args[] = {self, key_obj, value_obj, desc_array}; i::Handle<i::Object> args[] = {self, key_obj, value_obj, desc_array};
i::Handle<i::Object> undefined = isolate->factory()->undefined_value();
i::Handle<i::JSFunction> fun = isolate->object_define_own_property();
i::Handle<i::Object> result; i::Handle<i::Object> result;
has_pending_exception = has_pending_exception =
!i::Execution::Call(isolate, fun, undefined, arraysize(args), args) !CallV8HeapFunction(isolate, "$objectDefineOwnProperty",
.ToHandle(&result); isolate->factory()->undefined_value(),
arraysize(args), args).ToHandle(&result);
RETURN_ON_FAILED_EXECUTION_PRIMITIVE(bool); RETURN_ON_FAILED_EXECUTION_PRIMITIVE(bool);
return Just(result->BooleanValue()); return Just(result->BooleanValue());
} }
...@@ -3643,12 +3648,11 @@ MaybeLocal<Value> v8::Object::GetOwnPropertyDescriptor(Local<Context> context, ...@@ -3643,12 +3648,11 @@ MaybeLocal<Value> v8::Object::GetOwnPropertyDescriptor(Local<Context> context,
auto obj = Utils::OpenHandle(this); auto obj = Utils::OpenHandle(this);
auto key_name = Utils::OpenHandle(*key); auto key_name = Utils::OpenHandle(*key);
i::Handle<i::Object> args[] = { obj, key_name }; i::Handle<i::Object> args[] = { obj, key_name };
i::Handle<i::JSFunction> fun = isolate->object_get_own_property_descriptor();
i::Handle<i::Object> undefined = isolate->factory()->undefined_value();
i::Handle<i::Object> result; i::Handle<i::Object> result;
has_pending_exception = has_pending_exception =
!i::Execution::Call(isolate, fun, undefined, arraysize(args), args) !CallV8HeapFunction(isolate, "$objectGetOwnPropertyDescriptor",
.ToHandle(&result); isolate->factory()->undefined_value(),
arraysize(args), args).ToHandle(&result);
RETURN_ON_FAILED_EXECUTION(Value); RETURN_ON_FAILED_EXECUTION(Value);
RETURN_ESCAPED(Utils::ToLocal(result)); RETURN_ESCAPED(Utils::ToLocal(result));
} }
......
...@@ -1754,16 +1754,6 @@ void Bootstrapper::ImportNatives(Isolate* isolate, Handle<JSObject> container) { ...@@ -1754,16 +1754,6 @@ void Bootstrapper::ImportNatives(Isolate* isolate, Handle<JSObject> container) {
INSTALL_NATIVE(JSFunction, "GetStackTraceLine", get_stack_trace_line_fun); INSTALL_NATIVE(JSFunction, "GetStackTraceLine", get_stack_trace_line_fun);
INSTALL_NATIVE(JSFunction, "ToCompletePropertyDescriptor", INSTALL_NATIVE(JSFunction, "ToCompletePropertyDescriptor",
to_complete_property_descriptor); 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, "JsonSerializeAdapter", json_serialize_adapter);
INSTALL_NATIVE(JSFunction, "Error", error_function); INSTALL_NATIVE(JSFunction, "Error", error_function);
......
...@@ -172,13 +172,6 @@ enum BindingFlags { ...@@ -172,13 +172,6 @@ enum BindingFlags {
promise_has_user_defined_reject_handler) \ promise_has_user_defined_reject_handler) \
V(TO_COMPLETE_PROPERTY_DESCRIPTOR_INDEX, JSFunction, \ V(TO_COMPLETE_PROPERTY_DESCRIPTOR_INDEX, JSFunction, \
to_complete_property_descriptor) \ 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(JSON_SERIALIZE_ADAPTER_INDEX, JSFunction, json_serialize_adapter) \
V(DERIVED_HAS_TRAP_INDEX, JSFunction, derived_has_trap) \ V(DERIVED_HAS_TRAP_INDEX, JSFunction, derived_has_trap) \
V(DERIVED_GET_TRAP_INDEX, JSFunction, derived_get_trap) \ V(DERIVED_GET_TRAP_INDEX, JSFunction, derived_get_trap) \
......
...@@ -275,6 +275,7 @@ namespace internal { ...@@ -275,6 +275,7 @@ namespace internal {
V(toJSON_string, "toJSON") \ V(toJSON_string, "toJSON") \
V(KeyedLoadMonomorphic_string, "KeyedLoadMonomorphic") \ V(KeyedLoadMonomorphic_string, "KeyedLoadMonomorphic") \
V(KeyedStoreMonomorphic_string, "KeyedStoreMonomorphic") \ V(KeyedStoreMonomorphic_string, "KeyedStoreMonomorphic") \
V(stack_overflow_string, "$stackOverflowBoilerplate") \
V(illegal_access_string, "illegal access") \ V(illegal_access_string, "illegal access") \
V(cell_value_string, "%cell_value") \ V(cell_value_string, "%cell_value") \
V(illegal_argument_string, "illegal argument") \ V(illegal_argument_string, "illegal argument") \
......
...@@ -845,19 +845,17 @@ Object* Isolate::StackOverflow() { ...@@ -845,19 +845,17 @@ Object* Isolate::StackOverflow() {
// At this point we cannot create an Error object using its javascript // At this point we cannot create an Error object using its javascript
// constructor. Instead, we copy the pre-constructed boilerplate and // constructor. Instead, we copy the pre-constructed boilerplate and
// attach the stack trace as a hidden property. // attach the stack trace as a hidden property.
Handle<Object> exception; Handle<String> key = factory()->stack_overflow_string();
if (bootstrapper()->IsActive()) { Handle<Object> boilerplate =
// There is no boilerplate to use during bootstrapping. Object::GetProperty(js_builtins_object(), key).ToHandleChecked();
exception = factory()->NewStringFromAsciiChecked( if (boilerplate->IsUndefined()) {
MessageTemplate::TemplateString(MessageTemplate::kStackOverflow)); return Throw(heap()->undefined_value(), nullptr);
} else { }
Handle<JSObject> boilerplate = stack_overflow_boilerplate(); Handle<JSObject> exception =
Handle<JSObject> copy = factory()->CopyJSObject(boilerplate); factory()->CopyJSObject(Handle<JSObject>::cast(boilerplate));
CaptureAndSetSimpleStackTrace(copy, factory()->undefined_value());
exception = copy;
}
Throw(*exception, nullptr); Throw(*exception, nullptr);
CaptureAndSetSimpleStackTrace(exception, factory()->undefined_value());
#ifdef VERIFY_HEAP #ifdef VERIFY_HEAP
if (FLAG_verify_heap && FLAG_stress_compaction) { if (FLAG_verify_heap && FLAG_stress_compaction) {
heap()->CollectAllAvailableGarbage("trigger compaction"); heap()->CollectAllAvailableGarbage("trigger compaction");
......
...@@ -5,7 +5,12 @@ ...@@ -5,7 +5,12 @@
// ------------------------------------------------------------------- // -------------------------------------------------------------------
var $errorToString; var $errorToString;
var $getStackTraceLine;
var $internalErrorSymbol; var $internalErrorSymbol;
var $messageGetPositionInLine;
var $messageGetLineNumber;
var $messageGetSourceLine;
var $stackOverflowBoilerplate;
var $stackTraceSymbol; var $stackTraceSymbol;
var MakeError; var MakeError;
var MakeEvalError; var MakeEvalError;
...@@ -208,16 +213,6 @@ function GetLineNumber(message) { ...@@ -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 // Returns the source code line containing the given source
// position, or the empty string if the position is invalid. // position, or the empty string if the position is invalid.
function GetSourceLine(message) { function GetSourceLine(message) {
...@@ -228,7 +223,6 @@ function GetSourceLine(message) { ...@@ -228,7 +223,6 @@ function GetSourceLine(message) {
return location.sourceText(); return location.sourceText();
} }
/** /**
* Find a line number given a specific source position. * Find a line number given a specific source position.
* @param {number} position The source position. * @param {number} position The source position.
...@@ -562,6 +556,17 @@ utils.SetUpLockedPrototype(SourceSlice, ...@@ -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) { function GetStackTraceLine(recv, fun, pos, isGlobal) {
return new CallSite(recv, fun, pos, false).toString(); return new CallSite(recv, fun, pos, false).toString();
} }
...@@ -1000,6 +1005,9 @@ utils.InstallFunctions(GlobalError.prototype, DONT_ENUM, ...@@ -1000,6 +1005,9 @@ utils.InstallFunctions(GlobalError.prototype, DONT_ENUM,
['toString', ErrorToString]); ['toString', ErrorToString]);
$errorToString = ErrorToString; $errorToString = ErrorToString;
$messageGetPositionInLine = GetPositionInLine;
$messageGetLineNumber = GetLineNumber;
$messageGetSourceLine = GetSourceLine;
MakeError = function(type, arg0, arg1, arg2) { MakeError = function(type, arg0, arg1, arg2) {
return MakeGenericError(GlobalError, type, arg0, arg1, arg2); return MakeGenericError(GlobalError, type, arg0, arg1, arg2);
...@@ -1023,8 +1031,8 @@ MakeURIError = function() { ...@@ -1023,8 +1031,8 @@ MakeURIError = function() {
// Boilerplate for exceptions for stack overflows. Used from // Boilerplate for exceptions for stack overflows. Used from
// Isolate::StackOverflow(). // Isolate::StackOverflow().
var StackOverflowBoilerplate = MakeRangeError(kStackOverflow); $stackOverflowBoilerplate = MakeRangeError(kStackOverflow);
%DefineAccessorPropertyUnchecked(StackOverflowBoilerplate, 'stack', %DefineAccessorPropertyUnchecked($stackOverflowBoilerplate, 'stack',
StackTraceGetter, StackTraceSetter, StackTraceGetter, StackTraceSetter,
DONT_ENUM); DONT_ENUM);
...@@ -1051,10 +1059,6 @@ utils.ExportToRuntime(function(to) { ...@@ -1051,10 +1059,6 @@ utils.ExportToRuntime(function(to) {
to.NoSideEffectToString = NoSideEffectToString; to.NoSideEffectToString = NoSideEffectToString;
to.ToDetailString = ToDetailString; to.ToDetailString = ToDetailString;
to.MakeError = MakeGenericError; to.MakeError = MakeGenericError;
to.MessageGetLineNumber = GetLineNumber;
to.MessageGetColumnNumber = GetColumnNumber;
to.MessageGetSourceLine = GetSourceLine;
to.StackOverflowBoilerplate = StackOverflowBoilerplate;
}); });
}); });
...@@ -3,6 +3,8 @@ ...@@ -3,6 +3,8 @@
// found in the LICENSE file. // found in the LICENSE file.
var $functionSourceString; var $functionSourceString;
var $objectDefineOwnProperty;
var $objectGetOwnPropertyDescriptor;
(function(global, utils) { (function(global, utils) {
...@@ -1783,6 +1785,8 @@ function GetIterator(obj, method) { ...@@ -1783,6 +1785,8 @@ function GetIterator(obj, method) {
// Exports // Exports
$functionSourceString = FunctionSourceString; $functionSourceString = FunctionSourceString;
$objectDefineOwnProperty = DefineOwnPropertyFromAPI;
$objectGetOwnPropertyDescriptor = ObjectGetOwnPropertyDescriptor;
utils.ObjectDefineProperties = ObjectDefineProperties; utils.ObjectDefineProperties = ObjectDefineProperties;
utils.ObjectDefineProperty = ObjectDefineProperty; utils.ObjectDefineProperty = ObjectDefineProperty;
...@@ -1808,8 +1812,6 @@ utils.Export(function(to) { ...@@ -1808,8 +1812,6 @@ utils.Export(function(to) {
utils.ExportToRuntime(function(to) { utils.ExportToRuntime(function(to) {
to.GlobalEval = GlobalEval; to.GlobalEval = GlobalEval;
to.ObjectDefineOwnProperty = DefineOwnPropertyFromAPI;
to.ObjectGetOwnPropertyDescriptor = ObjectGetOwnPropertyDescriptor;
to.ToCompletePropertyDescriptor = ToCompletePropertyDescriptor; to.ToCompletePropertyDescriptor = ToCompletePropertyDescriptor;
}); });
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment