Commit ab38b03d authored by peterwmwong's avatar peterwmwong Committed by Commit Bot

[builtins] Port Object.p.toLocaleString to CSA from JS

- Added ObjectPrototypeToLocaleString TFJ
- Remove v8natives.js
- Move GetMethod and GetIterator into prologue.js

TBR=adamk@chromium.org

Bug: v8:6005
Change-Id: I2b5b65892304e62bf64375458f8ffb9473b2c9b7
Reviewed-on: https://chromium-review.googlesource.com/826479Reviewed-by: 's avatarPeter Wong <peter.wm.wong@gmail.com>
Reviewed-by: 's avatarJakob Gruber <jgruber@chromium.org>
Commit-Queue: Peter Wong <peter.wm.wong@gmail.com>
Cr-Commit-Position: refs/heads/master@{#50120}
parent d6e68f43
...@@ -583,7 +583,6 @@ action("js2c") { ...@@ -583,7 +583,6 @@ action("js2c") {
"src/js/macros.py", "src/js/macros.py",
"src/messages.h", "src/messages.h",
"src/js/prologue.js", "src/js/prologue.js",
"src/js/v8natives.js",
"src/js/array.js", "src/js/array.js",
"src/js/typedarray.js", "src/js/typedarray.js",
"src/js/messages.js", "src/js/messages.js",
......
...@@ -1697,11 +1697,10 @@ class CallNew final : public Expression { ...@@ -1697,11 +1697,10 @@ class CallNew final : public Expression {
ZoneList<Expression*>* arguments_; ZoneList<Expression*>* arguments_;
}; };
// The CallRuntime class does not represent any official JavaScript // The CallRuntime class does not represent any official JavaScript
// language construct. Instead it is used to call a C or JS function // language construct. Instead it is used to call a C or JS function
// with a set of arguments. This is used from the builtins that are // with a set of arguments. This is used from the builtins that are
// implemented in JavaScript (see "v8natives.js"). // implemented in JavaScript.
class CallRuntime final : public Expression { class CallRuntime final : public Expression {
public: public:
ZoneList<Expression*>* arguments() const { return arguments_; } ZoneList<Expression*>* arguments() const { return arguments_; }
......
...@@ -1493,6 +1493,8 @@ void Genesis::InitializeGlobal(Handle<JSGlobalObject> global_object, ...@@ -1493,6 +1493,8 @@ void Genesis::InitializeGlobal(Handle<JSGlobalObject> global_object,
true); true);
SimpleInstallFunction(isolate->initial_object_prototype(), "hasOwnProperty", SimpleInstallFunction(isolate->initial_object_prototype(), "hasOwnProperty",
Builtins::kObjectPrototypeHasOwnProperty, 1, true); Builtins::kObjectPrototypeHasOwnProperty, 1, true);
SimpleInstallFunction(isolate->initial_object_prototype(), "toLocaleString",
Builtins::kObjectPrototypeToLocaleString, 0, true);
SimpleInstallFunction(isolate->initial_object_prototype(), SimpleInstallFunction(isolate->initial_object_prototype(),
"__lookupGetter__", Builtins::kObjectLookupGetter, 1, "__lookupGetter__", Builtins::kObjectLookupGetter, 1,
true); true);
......
...@@ -762,6 +762,8 @@ namespace internal { ...@@ -762,6 +762,8 @@ namespace internal {
CPP(ObjectPrototypePropertyIsEnumerable) \ CPP(ObjectPrototypePropertyIsEnumerable) \
CPP(ObjectPrototypeGetProto) \ CPP(ObjectPrototypeGetProto) \
CPP(ObjectPrototypeSetProto) \ CPP(ObjectPrototypeSetProto) \
/* ES #sec-object.prototype.tolocalestring */ \
TFJ(ObjectPrototypeToLocaleString, 0) \
CPP(ObjectSeal) \ CPP(ObjectSeal) \
CPP(ObjectValues) \ CPP(ObjectValues) \
\ \
......
...@@ -97,6 +97,22 @@ Node* ObjectBuiltinsAssembler::ConstructDataDescriptor(Node* context, ...@@ -97,6 +97,22 @@ Node* ObjectBuiltinsAssembler::ConstructDataDescriptor(Node* context,
return js_desc; return js_desc;
} }
TF_BUILTIN(ObjectPrototypeToLocaleString, CodeStubAssembler) {
TNode<Context> context = CAST(Parameter(Descriptor::kContext));
TNode<Object> receiver = CAST(Parameter(Descriptor::kReceiver));
Label if_null_or_undefined(this, Label::kDeferred);
GotoIf(IsNullOrUndefined(receiver), &if_null_or_undefined);
TNode<Object> method =
CAST(GetProperty(context, receiver, factory()->toString_string()));
Return(CallJS(CodeFactory::Call(isolate()), context, method, receiver));
BIND(&if_null_or_undefined);
ThrowTypeError(context, MessageTemplate::kCalledOnNullOrUndefined,
"Object.prototype.toLocaleString");
}
TF_BUILTIN(ObjectPrototypeHasOwnProperty, ObjectBuiltinsAssembler) { TF_BUILTIN(ObjectPrototypeHasOwnProperty, ObjectBuiltinsAssembler) {
Node* object = Parameter(Descriptor::kReceiver); Node* object = Parameter(Descriptor::kReceiver);
Node* key = Parameter(Descriptor::kKey); Node* key = Parameter(Descriptor::kKey);
......
...@@ -99,6 +99,42 @@ function PostNatives(utils) { ...@@ -99,6 +99,42 @@ function PostNatives(utils) {
utils.PostNatives = UNDEFINED; utils.PostNatives = UNDEFINED;
} }
// ----------------------------------------------------------------------------
// Object
var iteratorSymbol = ImportNow("iterator_symbol");
// ES6 7.3.9
function GetMethod(obj, p) {
var func = obj[p];
if (IS_NULL_OR_UNDEFINED(func)) return UNDEFINED;
if (IS_CALLABLE(func)) return func;
throw %make_type_error(kCalledNonCallable, typeof func);
}
// ----------------------------------------------------------------------------
// Iterator related spec functions.
// ES6 7.4.1 GetIterator(obj, method)
function GetIterator(obj, method) {
if (IS_UNDEFINED(method)) {
method = obj[iteratorSymbol];
}
if (!IS_CALLABLE(method)) {
throw %make_type_error(kNotIterable, obj);
}
var iterator = %_Call(method, obj);
if (!IS_RECEIVER(iterator)) {
throw %make_type_error(kNotAnIterator, iterator);
}
return iterator;
}
exports_container.GetIterator = GetIterator;
exports_container.GetMethod = GetMethod;
// ----------------------------------------------------------------------- // -----------------------------------------------------------------------
%OptimizeObjectForAddingMultipleProperties(utils, 14); %OptimizeObjectForAddingMultipleProperties(utils, 14);
......
// Copyright 2012 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
(function(global, utils) {
"use strict";
%CheckIsBootstrapping();
// ----------------------------------------------------------------------------
// Imports
var GlobalObject = global.Object;
var iteratorSymbol = utils.ImportNow("iterator_symbol");
// ----------------------------------------------------------------------------
// Object
// Set up non-enumerable functions on the Object.prototype object.
DEFINE_METHOD(
GlobalObject.prototype,
// ES6 19.1.3.5 Object.prototype.toLocaleString([reserved1 [,reserved2]])
toLocaleString() {
REQUIRE_OBJECT_COERCIBLE(this, "Object.prototype.toLocaleString");
return this.toString();
}
);
// ES6 7.3.9
function GetMethod(obj, p) {
var func = obj[p];
if (IS_NULL_OR_UNDEFINED(func)) return UNDEFINED;
if (IS_CALLABLE(func)) return func;
throw %make_type_error(kCalledNonCallable, typeof func);
}
// ----------------------------------------------------------------------------
// Iterator related spec functions.
// ES6 7.4.1 GetIterator(obj, method)
function GetIterator(obj, method) {
if (IS_UNDEFINED(method)) {
method = obj[iteratorSymbol];
}
if (!IS_CALLABLE(method)) {
throw %make_type_error(kNotIterable, obj);
}
var iterator = %_Call(method, obj);
if (!IS_RECEIVER(iterator)) {
throw %make_type_error(kNotAnIterator, iterator);
}
return iterator;
}
// ----------------------------------------------------------------------------
// Exports
utils.Export(function(to) {
to.GetIterator = GetIterator;
to.GetMethod = GetMethod;
});
})
...@@ -2354,7 +2354,6 @@ ...@@ -2354,7 +2354,6 @@
'js/macros.py', 'js/macros.py',
'messages.h', 'messages.h',
'js/prologue.js', 'js/prologue.js',
'js/v8natives.js',
'js/array.js', 'js/array.js',
'js/typedarray.js', 'js/typedarray.js',
'js/messages.js', 'js/messages.js',
......
...@@ -122,9 +122,10 @@ struct StartupBlobs { ...@@ -122,9 +122,10 @@ struct StartupBlobs {
static StartupBlobs Serialize(v8::Isolate* isolate) { static StartupBlobs Serialize(v8::Isolate* isolate) {
// We have to create one context. One reason for this is so that the builtins // We have to create one context. One reason for this is so that the builtins
// can be loaded from v8natives.js and their addresses can be processed. This // can be loaded from self hosted JS builtins and their addresses can be
// will clear the pending fixups array, which would otherwise contain GC roots // processed. This will clear the pending fixups array, which would otherwise
// that would confuse the serialization/deserialization process. // contain GC roots that would confuse the serialization/deserialization
// process.
v8::Isolate::Scope isolate_scope(isolate); v8::Isolate::Scope isolate_scope(isolate);
{ {
v8::HandleScope scope(isolate); v8::HandleScope scope(isolate);
......
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