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

Unified Diff: src/bootstrapper.cc

Issue 1515133002: [proxies] Support proxies in JSON.parse and JSON.stringify. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Rebase Created 5 years 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 | src/contexts.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/bootstrapper.cc
diff --git a/src/bootstrapper.cc b/src/bootstrapper.cc
index 98383897584a6a2ff045cb8495d0e9ce663988e1..fe813510d50f0070cb4d07c51a5e7a1ff9f1841c 100644
--- a/src/bootstrapper.cc
+++ b/src/bootstrapper.cc
@@ -364,17 +364,41 @@ void Bootstrapper::DetachGlobal(Handle<Context> env) {
namespace {
-Handle<JSFunction> InstallFunction(Handle<JSObject> target,
- Handle<Name> property_name,
- Handle<JSFunction> function,
- Handle<String> function_name,
- PropertyAttributes attributes = DONT_ENUM) {
+void InstallFunction(Handle<JSObject> target, Handle<Name> property_name,
+ Handle<JSFunction> function, Handle<String> function_name,
+ PropertyAttributes attributes = DONT_ENUM) {
JSObject::AddProperty(target, property_name, function, attributes);
if (target->IsJSGlobalObject()) {
function->shared()->set_instance_class_name(*function_name);
}
function->shared()->set_native(true);
- return function;
+}
+
+
+static void InstallFunction(Handle<JSObject> target,
+ Handle<JSFunction> function, Handle<Name> name,
+ PropertyAttributes attributes = DONT_ENUM) {
+ Handle<String> name_string = Name::ToFunctionName(name).ToHandleChecked();
+ InstallFunction(target, name, function, name_string, attributes);
+}
+
+
+static Handle<JSFunction> CreateFunction(Isolate* isolate, Handle<String> name,
+ InstanceType type, int instance_size,
+ MaybeHandle<JSObject> maybe_prototype,
+ Builtins::Name call,
+ bool strict_function_map = false) {
+ Factory* factory = isolate->factory();
+ Handle<Code> call_code(isolate->builtins()->builtin(call));
+ Handle<JSObject> prototype;
+ static const bool kReadOnlyPrototype = false;
+ static const bool kInstallConstructor = false;
+ return maybe_prototype.ToHandle(&prototype)
+ ? factory->NewFunction(name, call_code, prototype, type,
+ instance_size, kReadOnlyPrototype,
+ kInstallConstructor, strict_function_map)
+ : factory->NewFunctionWithoutPrototype(name, call_code,
+ strict_function_map);
}
@@ -384,21 +408,12 @@ Handle<JSFunction> InstallFunction(Handle<JSObject> target, Handle<Name> name,
Builtins::Name call,
PropertyAttributes attributes,
bool strict_function_map = false) {
- Isolate* isolate = target->GetIsolate();
- Factory* factory = isolate->factory();
Handle<String> name_string = Name::ToFunctionName(name).ToHandleChecked();
- Handle<Code> call_code(isolate->builtins()->builtin(call));
- Handle<JSObject> prototype;
- static const bool kReadOnlyPrototype = false;
- static const bool kInstallConstructor = false;
Handle<JSFunction> function =
- maybe_prototype.ToHandle(&prototype)
- ? factory->NewFunction(name_string, call_code, prototype, type,
- instance_size, kReadOnlyPrototype,
- kInstallConstructor, strict_function_map)
- : factory->NewFunctionWithoutPrototype(name_string, call_code,
- strict_function_map);
- return InstallFunction(target, name, function, name_string, attributes);
+ CreateFunction(target->GetIsolate(), name_string, type, instance_size,
+ maybe_prototype, call, strict_function_map);
+ InstallFunction(target, name, function, name_string, attributes);
+ return function;
}
@@ -1028,17 +1043,31 @@ void Genesis::HookUpGlobalObject(Handle<JSGlobalObject> global_object) {
}
-static void SimpleInstallFunction(Handle<JSObject> base, Handle<Name> name,
- Builtins::Name call, int len, bool adapt) {
+static Handle<JSFunction> SimpleCreateFunction(Isolate* isolate,
+ Handle<String> name,
+ Builtins::Name call, int len,
+ bool adapt) {
Handle<JSFunction> fun =
- InstallFunction(base, name, JS_OBJECT_TYPE, JSObject::kHeaderSize,
- MaybeHandle<JSObject>(), call, DONT_ENUM);
+ CreateFunction(isolate, name, JS_OBJECT_TYPE, JSObject::kHeaderSize,
+ MaybeHandle<JSObject>(), call);
if (adapt) {
fun->shared()->set_internal_formal_parameter_count(len);
} else {
fun->shared()->DontAdaptArguments();
}
fun->shared()->set_length(len);
+ return fun;
+}
+
+
+static Handle<JSFunction> SimpleInstallFunction(Handle<JSObject> base,
+ Handle<String> name,
+ Builtins::Name call, int len,
+ bool adapt) {
+ Handle<JSFunction> fun =
+ SimpleCreateFunction(base->GetIsolate(), name, call, len, adapt);
+ InstallFunction(base, fun, name, DONT_ENUM);
+ return fun;
}
@@ -1146,9 +1175,10 @@ void Genesis::InitializeGlobal(Handle<JSGlobalObject> global_object,
initial_strong_map->set_is_strong();
CacheInitialJSArrayMaps(native_context(), initial_strong_map);
- SimpleInstallFunction(array_function,
- isolate->factory()->InternalizeUtf8String("isArray"),
- Builtins::kArrayIsArray, 1, true);
+ Handle<JSFunction> is_arraylike = SimpleInstallFunction(
+ array_function, isolate->factory()->InternalizeUtf8String("isArray"),
+ Builtins::kArrayIsArray, 1, true);
+ native_context()->set_is_arraylike(*is_arraylike);
}
{ // --- N u m b e r ---
@@ -2157,9 +2187,23 @@ void Genesis::InitializeGlobal_harmony_regexp_subclass() {
void Genesis::InitializeGlobal_harmony_reflect() {
+ Factory* factory = isolate()->factory();
+
+ // We currently use some of the Reflect functions internally, even when
+ // the --harmony-reflect flag is not given.
+
+ Handle<JSFunction> define_property =
+ SimpleCreateFunction(isolate(), factory->defineProperty_string(),
+ Builtins::kReflectDefineProperty, 3, true);
+ native_context()->set_reflect_define_property(*define_property);
+
+ Handle<JSFunction> delete_property =
+ SimpleCreateFunction(isolate(), factory->deleteProperty_string(),
+ Builtins::kReflectDeleteProperty, 2, true);
+ native_context()->set_reflect_delete_property(*delete_property);
+
if (!FLAG_harmony_reflect) return;
- Factory* factory = isolate()->factory();
Handle<JSGlobalObject> global(JSGlobalObject::cast(
native_context()->global_object()));
Handle<String> reflect_string = factory->NewStringFromStaticChars("Reflect");
@@ -2167,10 +2211,9 @@ void Genesis::InitializeGlobal_harmony_reflect() {
factory->NewJSObject(isolate()->object_function(), TENURED);
JSObject::AddProperty(global, reflect_string, reflect, DONT_ENUM);
- SimpleInstallFunction(reflect, factory->defineProperty_string(),
- Builtins::kReflectDefineProperty, 3, true);
- SimpleInstallFunction(reflect, factory->deleteProperty_string(),
- Builtins::kReflectDeleteProperty, 2, true);
+ InstallFunction(reflect, define_property, factory->defineProperty_string());
+ InstallFunction(reflect, delete_property, factory->deleteProperty_string());
+
SimpleInstallFunction(reflect, factory->get_string(),
Builtins::kReflectGet, 2, false);
SimpleInstallFunction(reflect, factory->getOwnPropertyDescriptor_string(),
« no previous file with comments | « no previous file | src/contexts.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698