• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2014 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #include "src/bootstrapper.h"
6 
7 #include "src/accessors.h"
8 #include "src/api-inl.h"
9 #include "src/api-natives.h"
10 #include "src/base/ieee754.h"
11 #include "src/code-stubs.h"
12 #include "src/compiler.h"
13 #include "src/debug/debug.h"
14 #include "src/extensions/externalize-string-extension.h"
15 #include "src/extensions/free-buffer-extension.h"
16 #include "src/extensions/gc-extension.h"
17 #include "src/extensions/ignition-statistics-extension.h"
18 #include "src/extensions/statistics-extension.h"
19 #include "src/extensions/trigger-failure-extension.h"
20 #include "src/heap/heap.h"
21 #include "src/isolate-inl.h"
22 #include "src/objects/api-callbacks.h"
23 #include "src/objects/arguments.h"
24 #include "src/objects/hash-table-inl.h"
25 #ifdef V8_INTL_SUPPORT
26 #include "src/objects/intl-objects.h"
27 #include "src/objects/js-collator.h"
28 #include "src/objects/js-list-format.h"
29 #include "src/objects/js-locale.h"
30 #endif  // V8_INTL_SUPPORT
31 #include "src/objects/js-array-buffer-inl.h"
32 #include "src/objects/js-array-inl.h"
33 #include "src/objects/js-regexp-string-iterator.h"
34 #include "src/objects/js-regexp.h"
35 #ifdef V8_INTL_SUPPORT
36 #include "src/objects/js-plural-rules.h"
37 #include "src/objects/js-relative-time-format.h"
38 #endif  // V8_INTL_SUPPORT
39 #include "src/objects/templates.h"
40 #include "src/snapshot/natives.h"
41 #include "src/snapshot/snapshot.h"
42 #include "src/wasm/wasm-js.h"
43 
44 namespace v8 {
45 namespace internal {
46 
Initialize(Isolate * isolate,bool create_heap_objects)47 void SourceCodeCache::Initialize(Isolate* isolate, bool create_heap_objects) {
48   cache_ = create_heap_objects ? ReadOnlyRoots(isolate).empty_fixed_array()
49                                : nullptr;
50 }
51 
Lookup(Isolate * isolate,Vector<const char> name,Handle<SharedFunctionInfo> * handle)52 bool SourceCodeCache::Lookup(Isolate* isolate, Vector<const char> name,
53                              Handle<SharedFunctionInfo>* handle) {
54   for (int i = 0; i < cache_->length(); i += 2) {
55     SeqOneByteString* str = SeqOneByteString::cast(cache_->get(i));
56     if (str->IsUtf8EqualTo(name)) {
57       *handle = Handle<SharedFunctionInfo>(
58           SharedFunctionInfo::cast(cache_->get(i + 1)), isolate);
59       return true;
60     }
61   }
62   return false;
63 }
64 
Add(Isolate * isolate,Vector<const char> name,Handle<SharedFunctionInfo> shared)65 void SourceCodeCache::Add(Isolate* isolate, Vector<const char> name,
66                           Handle<SharedFunctionInfo> shared) {
67   Factory* factory = isolate->factory();
68   HandleScope scope(isolate);
69   int length = cache_->length();
70   Handle<FixedArray> new_array = factory->NewFixedArray(length + 2, TENURED);
71   cache_->CopyTo(0, *new_array, 0, cache_->length());
72   cache_ = *new_array;
73   Handle<String> str =
74       factory->NewStringFromOneByte(Vector<const uint8_t>::cast(name), TENURED)
75           .ToHandleChecked();
76   DCHECK(!str.is_null());
77   cache_->set(length, *str);
78   cache_->set(length + 1, *shared);
79   Script::cast(shared->script())->set_type(type_);
80 }
81 
Bootstrapper(Isolate * isolate)82 Bootstrapper::Bootstrapper(Isolate* isolate)
83     : isolate_(isolate),
84       nesting_(0),
85       extensions_cache_(Script::TYPE_EXTENSION) {}
86 
GetNativeSource(NativeType type,int index)87 Handle<String> Bootstrapper::GetNativeSource(NativeType type, int index) {
88   NativesExternalStringResource* resource =
89       new NativesExternalStringResource(type, index);
90   Handle<ExternalOneByteString> source_code =
91       isolate_->factory()->NewNativeSourceString(resource);
92   DCHECK(source_code->is_short());
93   return source_code;
94 }
95 
Initialize(bool create_heap_objects)96 void Bootstrapper::Initialize(bool create_heap_objects) {
97   extensions_cache_.Initialize(isolate_, create_heap_objects);
98 }
99 
100 
GCFunctionName()101 static const char* GCFunctionName() {
102   bool flag_given =
103       FLAG_expose_gc_as != nullptr && strlen(FLAG_expose_gc_as) != 0;
104   return flag_given ? FLAG_expose_gc_as : "gc";
105 }
106 
107 v8::Extension* Bootstrapper::free_buffer_extension_ = nullptr;
108 v8::Extension* Bootstrapper::gc_extension_ = nullptr;
109 v8::Extension* Bootstrapper::externalize_string_extension_ = nullptr;
110 v8::Extension* Bootstrapper::statistics_extension_ = nullptr;
111 v8::Extension* Bootstrapper::trigger_failure_extension_ = nullptr;
112 v8::Extension* Bootstrapper::ignition_statistics_extension_ = nullptr;
113 
InitializeOncePerProcess()114 void Bootstrapper::InitializeOncePerProcess() {
115   free_buffer_extension_ = new FreeBufferExtension;
116   v8::RegisterExtension(free_buffer_extension_);
117   gc_extension_ = new GCExtension(GCFunctionName());
118   v8::RegisterExtension(gc_extension_);
119   externalize_string_extension_ = new ExternalizeStringExtension;
120   v8::RegisterExtension(externalize_string_extension_);
121   statistics_extension_ = new StatisticsExtension;
122   v8::RegisterExtension(statistics_extension_);
123   trigger_failure_extension_ = new TriggerFailureExtension;
124   v8::RegisterExtension(trigger_failure_extension_);
125   ignition_statistics_extension_ = new IgnitionStatisticsExtension;
126   v8::RegisterExtension(ignition_statistics_extension_);
127 }
128 
129 
TearDownExtensions()130 void Bootstrapper::TearDownExtensions() {
131   delete free_buffer_extension_;
132   free_buffer_extension_ = nullptr;
133   delete gc_extension_;
134   gc_extension_ = nullptr;
135   delete externalize_string_extension_;
136   externalize_string_extension_ = nullptr;
137   delete statistics_extension_;
138   statistics_extension_ = nullptr;
139   delete trigger_failure_extension_;
140   trigger_failure_extension_ = nullptr;
141   delete ignition_statistics_extension_;
142   ignition_statistics_extension_ = nullptr;
143 }
144 
TearDown()145 void Bootstrapper::TearDown() {
146   extensions_cache_.Initialize(isolate_, false);  // Yes, symmetrical
147 }
148 
149 
150 class Genesis BASE_EMBEDDED {
151  public:
152   Genesis(Isolate* isolate, MaybeHandle<JSGlobalProxy> maybe_global_proxy,
153           v8::Local<v8::ObjectTemplate> global_proxy_template,
154           size_t context_snapshot_index,
155           v8::DeserializeEmbedderFieldsCallback embedder_fields_deserializer,
156           GlobalContextType context_type);
157   Genesis(Isolate* isolate, MaybeHandle<JSGlobalProxy> maybe_global_proxy,
158           v8::Local<v8::ObjectTemplate> global_proxy_template);
~Genesis()159   ~Genesis() { }
160 
isolate() const161   Isolate* isolate() const { return isolate_; }
factory() const162   Factory* factory() const { return isolate_->factory(); }
builtins() const163   Builtins* builtins() const { return isolate_->builtins(); }
heap() const164   Heap* heap() const { return isolate_->heap(); }
165 
result()166   Handle<Context> result() { return result_; }
167 
global_proxy()168   Handle<JSGlobalProxy> global_proxy() { return global_proxy_; }
169 
170  private:
native_context()171   Handle<NativeContext> native_context() { return native_context_; }
172 
173   // Creates some basic objects. Used for creating a context from scratch.
174   void CreateRoots();
175   // Creates the empty function.  Used for creating a context from scratch.
176   Handle<JSFunction> CreateEmptyFunction();
177   // Returns the %ThrowTypeError% intrinsic function.
178   // See ES#sec-%throwtypeerror% for details.
179   Handle<JSFunction> GetThrowTypeErrorIntrinsic();
180 
181   void CreateSloppyModeFunctionMaps(Handle<JSFunction> empty);
182   void CreateStrictModeFunctionMaps(Handle<JSFunction> empty);
183   void CreateObjectFunction(Handle<JSFunction> empty);
184   void CreateIteratorMaps(Handle<JSFunction> empty);
185   void CreateAsyncIteratorMaps(Handle<JSFunction> empty);
186   void CreateAsyncFunctionMaps(Handle<JSFunction> empty);
187   void CreateJSProxyMaps();
188 
189   // Make the "arguments" and "caller" properties throw a TypeError on access.
190   void AddRestrictedFunctionProperties(Handle<JSFunction> empty);
191 
192   // Creates the global objects using the global proxy and the template passed
193   // in through the API.  We call this regardless of whether we are building a
194   // context from scratch or using a deserialized one from the partial snapshot
195   // but in the latter case we don't use the objects it produces directly, as
196   // we have to use the deserialized ones that are linked together with the
197   // rest of the context snapshot. At the end we link the global proxy and the
198   // context to each other.
199   Handle<JSGlobalObject> CreateNewGlobals(
200       v8::Local<v8::ObjectTemplate> global_proxy_template,
201       Handle<JSGlobalProxy> global_proxy);
202   // Similarly, we want to use the global that has been created by the templates
203   // passed through the API.  The global from the snapshot is detached from the
204   // other objects in the snapshot.
205   void HookUpGlobalObject(Handle<JSGlobalObject> global_object);
206   // Hooks the given global proxy into the context in the case we do not
207   // replace the global object from the deserialized native context.
208   void HookUpGlobalProxy(Handle<JSGlobalProxy> global_proxy);
209   // The native context has a ScriptContextTable that store declarative bindings
210   // made in script scopes.  Add a "this" binding to that table pointing to the
211   // global proxy.
212   void InstallGlobalThisBinding();
213   // New context initialization.  Used for creating a context from scratch.
214   void InitializeGlobal(Handle<JSGlobalObject> global_object,
215                         Handle<JSFunction> empty_function,
216                         GlobalContextType context_type);
217   void InitializeExperimentalGlobal();
218   // Depending on the situation, expose and/or get rid of the utils object.
219   void ConfigureUtilsObject(GlobalContextType context_type);
220 
221 #define DECLARE_FEATURE_INITIALIZATION(id, descr) \
222   void InitializeGlobal_##id();
223 
224   HARMONY_INPROGRESS(DECLARE_FEATURE_INITIALIZATION)
225   HARMONY_STAGED(DECLARE_FEATURE_INITIALIZATION)
226   HARMONY_SHIPPING(DECLARE_FEATURE_INITIALIZATION)
227 #undef DECLARE_FEATURE_INITIALIZATION
228 
229   enum ArrayBufferKind {
230     ARRAY_BUFFER,
231     SHARED_ARRAY_BUFFER,
232   };
233   Handle<JSFunction> CreateArrayBuffer(Handle<String> name,
234                                        ArrayBufferKind array_buffer_kind);
235   Handle<JSFunction> InstallInternalArray(Handle<JSObject> target,
236                                           const char* name,
237                                           ElementsKind elements_kind);
238   bool InstallNatives(GlobalContextType context_type);
239 
240   Handle<JSFunction> InstallTypedArray(const char* name,
241                                        ElementsKind elements_kind);
242   bool InstallExtraNatives();
243   bool InstallExperimentalExtraNatives();
244   bool InstallDebuggerNatives();
245   void InstallBuiltinFunctionIds();
246   void InstallExperimentalBuiltinFunctionIds();
247   void InitializeNormalizedMapCaches();
248 
249   enum ExtensionTraversalState {
250     UNVISITED, VISITED, INSTALLED
251   };
252 
253   class ExtensionStates {
254    public:
255     ExtensionStates();
256     ExtensionTraversalState get_state(RegisteredExtension* extension);
257     void set_state(RegisteredExtension* extension,
258                    ExtensionTraversalState state);
259    private:
260     base::HashMap map_;
261     DISALLOW_COPY_AND_ASSIGN(ExtensionStates);
262   };
263 
264   // Used both for deserialized and from-scratch contexts to add the extensions
265   // provided.
266   static bool InstallExtensions(Isolate* isolate,
267                                 Handle<Context> native_context,
268                                 v8::ExtensionConfiguration* extensions);
269   static bool InstallAutoExtensions(Isolate* isolate,
270                                     ExtensionStates* extension_states);
271   static bool InstallRequestedExtensions(Isolate* isolate,
272                                          v8::ExtensionConfiguration* extensions,
273                                          ExtensionStates* extension_states);
274   static bool InstallExtension(Isolate* isolate,
275                                const char* name,
276                                ExtensionStates* extension_states);
277   static bool InstallExtension(Isolate* isolate,
278                                v8::RegisteredExtension* current,
279                                ExtensionStates* extension_states);
280   static bool InstallSpecialObjects(Isolate* isolate,
281                                     Handle<Context> native_context);
282   bool ConfigureApiObject(Handle<JSObject> object,
283                           Handle<ObjectTemplateInfo> object_template);
284   bool ConfigureGlobalObjects(
285       v8::Local<v8::ObjectTemplate> global_proxy_template);
286 
287   // Migrates all properties from the 'from' object to the 'to'
288   // object and overrides the prototype in 'to' with the one from
289   // 'from'.
290   void TransferObject(Handle<JSObject> from, Handle<JSObject> to);
291   void TransferNamedProperties(Handle<JSObject> from, Handle<JSObject> to);
292   void TransferIndexedProperties(Handle<JSObject> from, Handle<JSObject> to);
293 
294   static bool CallUtilsFunction(Isolate* isolate, const char* name);
295 
296   static bool CompileExtension(Isolate* isolate, v8::Extension* extension);
297 
298   Isolate* isolate_;
299   Handle<Context> result_;
300   Handle<NativeContext> native_context_;
301   Handle<JSGlobalProxy> global_proxy_;
302 
303   // Temporary function maps needed only during bootstrapping.
304   Handle<Map> strict_function_with_home_object_map_;
305   Handle<Map> strict_function_with_name_and_home_object_map_;
306 
307   // %ThrowTypeError%. See ES#sec-%throwtypeerror% for details.
308   Handle<JSFunction> restricted_properties_thrower_;
309 
310   BootstrapperActive active_;
311   friend class Bootstrapper;
312 };
313 
Iterate(RootVisitor * v)314 void Bootstrapper::Iterate(RootVisitor* v) {
315   extensions_cache_.Iterate(v);
316   v->Synchronize(VisitorSynchronization::kExtensions);
317 }
318 
CreateEnvironment(MaybeHandle<JSGlobalProxy> maybe_global_proxy,v8::Local<v8::ObjectTemplate> global_proxy_template,v8::ExtensionConfiguration * extensions,size_t context_snapshot_index,v8::DeserializeEmbedderFieldsCallback embedder_fields_deserializer,GlobalContextType context_type)319 Handle<Context> Bootstrapper::CreateEnvironment(
320     MaybeHandle<JSGlobalProxy> maybe_global_proxy,
321     v8::Local<v8::ObjectTemplate> global_proxy_template,
322     v8::ExtensionConfiguration* extensions, size_t context_snapshot_index,
323     v8::DeserializeEmbedderFieldsCallback embedder_fields_deserializer,
324     GlobalContextType context_type) {
325   HandleScope scope(isolate_);
326   Handle<Context> env;
327   {
328     Genesis genesis(isolate_, maybe_global_proxy, global_proxy_template,
329                     context_snapshot_index, embedder_fields_deserializer,
330                     context_type);
331     env = genesis.result();
332     if (env.is_null() || !InstallExtensions(env, extensions)) {
333       return Handle<Context>();
334     }
335   }
336   // Log all maps created during bootstrapping.
337   if (FLAG_trace_maps) LOG(isolate_, LogMaps());
338   return scope.CloseAndEscape(env);
339 }
340 
NewRemoteContext(MaybeHandle<JSGlobalProxy> maybe_global_proxy,v8::Local<v8::ObjectTemplate> global_proxy_template)341 Handle<JSGlobalProxy> Bootstrapper::NewRemoteContext(
342     MaybeHandle<JSGlobalProxy> maybe_global_proxy,
343     v8::Local<v8::ObjectTemplate> global_proxy_template) {
344   HandleScope scope(isolate_);
345   Handle<JSGlobalProxy> global_proxy;
346   {
347     Genesis genesis(isolate_, maybe_global_proxy, global_proxy_template);
348     global_proxy = genesis.global_proxy();
349     if (global_proxy.is_null()) return Handle<JSGlobalProxy>();
350   }
351   // Log all maps created during bootstrapping.
352   if (FLAG_trace_maps) LOG(isolate_, LogMaps());
353   return scope.CloseAndEscape(global_proxy);
354 }
355 
DetachGlobal(Handle<Context> env)356 void Bootstrapper::DetachGlobal(Handle<Context> env) {
357   isolate_->counters()->errors_thrown_per_context()->AddSample(
358       env->GetErrorsThrown());
359 
360   ReadOnlyRoots roots(isolate_);
361   Handle<JSGlobalProxy> global_proxy(JSGlobalProxy::cast(env->global_proxy()),
362                                      isolate_);
363   global_proxy->set_native_context(roots.null_value());
364   JSObject::ForceSetPrototype(global_proxy, isolate_->factory()->null_value());
365   global_proxy->map()->SetConstructor(roots.null_value());
366   if (FLAG_track_detached_contexts) {
367     isolate_->AddDetachedContext(env);
368   }
369 }
370 
371 namespace {
372 
SimpleCreateSharedFunctionInfo(Isolate * isolate,Builtins::Name builtin_id,Handle<String> name,int len,FunctionKind kind=FunctionKind::kNormalFunction)373 V8_NOINLINE Handle<SharedFunctionInfo> SimpleCreateSharedFunctionInfo(
374     Isolate* isolate, Builtins::Name builtin_id, Handle<String> name, int len,
375     FunctionKind kind = FunctionKind::kNormalFunction) {
376   Handle<SharedFunctionInfo> shared =
377       isolate->factory()->NewSharedFunctionInfoForBuiltin(name, builtin_id,
378                                                           kind);
379   shared->set_internal_formal_parameter_count(len);
380   shared->set_length(len);
381   return shared;
382 }
383 
SimpleCreateBuiltinSharedFunctionInfo(Isolate * isolate,Builtins::Name builtin_id,Handle<String> name,int len)384 V8_NOINLINE Handle<SharedFunctionInfo> SimpleCreateBuiltinSharedFunctionInfo(
385     Isolate* isolate, Builtins::Name builtin_id, Handle<String> name, int len) {
386   Handle<SharedFunctionInfo> shared =
387       isolate->factory()->NewSharedFunctionInfoForBuiltin(name, builtin_id,
388                                                           kNormalFunction);
389   shared->set_internal_formal_parameter_count(len);
390   shared->set_length(len);
391   return shared;
392 }
393 
InstallFunction(Isolate * isolate,Handle<JSObject> target,Handle<Name> property_name,Handle<JSFunction> function,Handle<String> function_name,PropertyAttributes attributes=DONT_ENUM)394 V8_NOINLINE void InstallFunction(Isolate* isolate, Handle<JSObject> target,
395                                  Handle<Name> property_name,
396                                  Handle<JSFunction> function,
397                                  Handle<String> function_name,
398                                  PropertyAttributes attributes = DONT_ENUM) {
399   JSObject::AddProperty(isolate, target, property_name, function, attributes);
400 }
401 
InstallFunction(Isolate * isolate,Handle<JSObject> target,Handle<JSFunction> function,Handle<Name> name,PropertyAttributes attributes=DONT_ENUM)402 V8_NOINLINE void InstallFunction(Isolate* isolate, Handle<JSObject> target,
403                                  Handle<JSFunction> function, Handle<Name> name,
404                                  PropertyAttributes attributes = DONT_ENUM) {
405   Handle<String> name_string =
406       Name::ToFunctionName(isolate, name).ToHandleChecked();
407   InstallFunction(isolate, target, name, function, name_string, attributes);
408 }
409 
CreateFunction(Isolate * isolate,Handle<String> name,InstanceType type,int instance_size,int inobject_properties,MaybeHandle<Object> maybe_prototype,Builtins::Name builtin_id)410 V8_NOINLINE Handle<JSFunction> CreateFunction(
411     Isolate* isolate, Handle<String> name, InstanceType type, int instance_size,
412     int inobject_properties, MaybeHandle<Object> maybe_prototype,
413     Builtins::Name builtin_id) {
414   Handle<Object> prototype;
415   Handle<JSFunction> result;
416 
417   if (maybe_prototype.ToHandle(&prototype)) {
418     NewFunctionArgs args = NewFunctionArgs::ForBuiltinWithPrototype(
419         name, prototype, type, instance_size, inobject_properties, builtin_id,
420         IMMUTABLE);
421 
422     result = isolate->factory()->NewFunction(args);
423     // Make the JSFunction's prototype object fast.
424     JSObject::MakePrototypesFast(handle(result->prototype(), isolate),
425                                  kStartAtReceiver, isolate);
426   } else {
427     NewFunctionArgs args = NewFunctionArgs::ForBuiltinWithoutPrototype(
428         name, builtin_id, LanguageMode::kStrict);
429     result = isolate->factory()->NewFunction(args);
430   }
431 
432   // Make the resulting JSFunction object fast.
433   JSObject::MakePrototypesFast(result, kStartAtReceiver, isolate);
434   result->shared()->set_native(true);
435   return result;
436 }
437 
InstallFunction(Isolate * isolate,Handle<JSObject> target,Handle<Name> name,InstanceType type,int instance_size,int inobject_properties,MaybeHandle<Object> maybe_prototype,Builtins::Name call,PropertyAttributes attributes)438 V8_NOINLINE Handle<JSFunction> InstallFunction(
439     Isolate* isolate, Handle<JSObject> target, Handle<Name> name,
440     InstanceType type, int instance_size, int inobject_properties,
441     MaybeHandle<Object> maybe_prototype, Builtins::Name call,
442     PropertyAttributes attributes) {
443   Handle<String> name_string =
444       Name::ToFunctionName(isolate, name).ToHandleChecked();
445   Handle<JSFunction> function =
446       CreateFunction(isolate, name_string, type, instance_size,
447                      inobject_properties, maybe_prototype, call);
448   InstallFunction(isolate, target, name, function, name_string, attributes);
449   return function;
450 }
451 
InstallFunction(Isolate * isolate,Handle<JSObject> target,const char * name,InstanceType type,int instance_size,int inobject_properties,MaybeHandle<Object> maybe_prototype,Builtins::Name call)452 V8_NOINLINE Handle<JSFunction> InstallFunction(
453     Isolate* isolate, Handle<JSObject> target, const char* name,
454     InstanceType type, int instance_size, int inobject_properties,
455     MaybeHandle<Object> maybe_prototype, Builtins::Name call) {
456   PropertyAttributes attributes = DONT_ENUM;
457   return InstallFunction(
458       isolate, target, isolate->factory()->InternalizeUtf8String(name), type,
459       instance_size, inobject_properties, maybe_prototype, call, attributes);
460 }
461 
SimpleCreateFunction(Isolate * isolate,Handle<String> name,Builtins::Name call,int len,bool adapt)462 V8_NOINLINE Handle<JSFunction> SimpleCreateFunction(Isolate* isolate,
463                                                     Handle<String> name,
464                                                     Builtins::Name call,
465                                                     int len, bool adapt) {
466   Handle<JSFunction> fun =
467       CreateFunction(isolate, name, JS_OBJECT_TYPE, JSObject::kHeaderSize, 0,
468                      MaybeHandle<JSObject>(), call);
469   if (adapt) {
470     fun->shared()->set_internal_formal_parameter_count(len);
471   } else {
472     fun->shared()->DontAdaptArguments();
473   }
474   fun->shared()->set_length(len);
475   return fun;
476 }
477 
SimpleInstallFunction(Isolate * isolate,Handle<JSObject> base,Handle<Name> property_name,Handle<String> function_name,Builtins::Name call,int len,bool adapt,PropertyAttributes attrs=DONT_ENUM,BuiltinFunctionId id=BuiltinFunctionId::kInvalidBuiltinFunctionId)478 V8_NOINLINE Handle<JSFunction> SimpleInstallFunction(
479     Isolate* isolate, Handle<JSObject> base, Handle<Name> property_name,
480     Handle<String> function_name, Builtins::Name call, int len, bool adapt,
481     PropertyAttributes attrs = DONT_ENUM,
482     BuiltinFunctionId id = BuiltinFunctionId::kInvalidBuiltinFunctionId) {
483   Handle<JSFunction> fun =
484       SimpleCreateFunction(isolate, function_name, call, len, adapt);
485   if (id != BuiltinFunctionId::kInvalidBuiltinFunctionId) {
486     fun->shared()->set_builtin_function_id(id);
487   }
488   InstallFunction(isolate, base, fun, property_name, attrs);
489   return fun;
490 }
491 
SimpleInstallFunction(Isolate * isolate,Handle<JSObject> base,Handle<String> name,Builtins::Name call,int len,bool adapt,PropertyAttributes attrs=DONT_ENUM,BuiltinFunctionId id=BuiltinFunctionId::kInvalidBuiltinFunctionId)492 V8_NOINLINE Handle<JSFunction> SimpleInstallFunction(
493     Isolate* isolate, Handle<JSObject> base, Handle<String> name,
494     Builtins::Name call, int len, bool adapt,
495     PropertyAttributes attrs = DONT_ENUM,
496     BuiltinFunctionId id = BuiltinFunctionId::kInvalidBuiltinFunctionId) {
497   return SimpleInstallFunction(isolate, base, name, name, call, len, adapt,
498                                attrs, id);
499 }
500 
SimpleInstallFunction(Isolate * isolate,Handle<JSObject> base,Handle<Name> property_name,const char * function_name,Builtins::Name call,int len,bool adapt,PropertyAttributes attrs=DONT_ENUM,BuiltinFunctionId id=BuiltinFunctionId::kInvalidBuiltinFunctionId)501 V8_NOINLINE Handle<JSFunction> SimpleInstallFunction(
502     Isolate* isolate, Handle<JSObject> base, Handle<Name> property_name,
503     const char* function_name, Builtins::Name call, int len, bool adapt,
504     PropertyAttributes attrs = DONT_ENUM,
505     BuiltinFunctionId id = BuiltinFunctionId::kInvalidBuiltinFunctionId) {
506   // Function name does not have to be internalized.
507   return SimpleInstallFunction(
508       isolate, base, property_name,
509       isolate->factory()->NewStringFromAsciiChecked(function_name), call, len,
510       adapt, attrs, id);
511 }
512 
SimpleInstallFunction(Isolate * isolate,Handle<JSObject> base,const char * name,Builtins::Name call,int len,bool adapt,PropertyAttributes attrs=DONT_ENUM,BuiltinFunctionId id=BuiltinFunctionId::kInvalidBuiltinFunctionId)513 V8_NOINLINE Handle<JSFunction> SimpleInstallFunction(
514     Isolate* isolate, Handle<JSObject> base, const char* name,
515     Builtins::Name call, int len, bool adapt,
516     PropertyAttributes attrs = DONT_ENUM,
517     BuiltinFunctionId id = BuiltinFunctionId::kInvalidBuiltinFunctionId) {
518   // Although function name does not have to be internalized the property name
519   // will be internalized during property addition anyway, so do it here now.
520   return SimpleInstallFunction(isolate, base,
521                                isolate->factory()->InternalizeUtf8String(name),
522                                call, len, adapt, attrs, id);
523 }
524 
SimpleInstallFunction(Isolate * isolate,Handle<JSObject> base,const char * name,Builtins::Name call,int len,bool adapt,BuiltinFunctionId id)525 V8_NOINLINE Handle<JSFunction> SimpleInstallFunction(
526     Isolate* isolate, Handle<JSObject> base, const char* name,
527     Builtins::Name call, int len, bool adapt, BuiltinFunctionId id) {
528   return SimpleInstallFunction(isolate, base, name, call, len, adapt, DONT_ENUM,
529                                id);
530 }
531 
SimpleInstallGetterSetter(Isolate * isolate,Handle<JSObject> base,Handle<String> name,Builtins::Name call_getter,Builtins::Name call_setter,PropertyAttributes attribs)532 V8_NOINLINE void SimpleInstallGetterSetter(Isolate* isolate,
533                                            Handle<JSObject> base,
534                                            Handle<String> name,
535                                            Builtins::Name call_getter,
536                                            Builtins::Name call_setter,
537                                            PropertyAttributes attribs) {
538   Handle<String> getter_name =
539       Name::ToFunctionName(isolate, name, isolate->factory()->get_string())
540           .ToHandleChecked();
541   Handle<JSFunction> getter =
542       SimpleCreateFunction(isolate, getter_name, call_getter, 0, true);
543 
544   Handle<String> setter_name =
545       Name::ToFunctionName(isolate, name, isolate->factory()->set_string())
546           .ToHandleChecked();
547   Handle<JSFunction> setter =
548       SimpleCreateFunction(isolate, setter_name, call_setter, 1, true);
549 
550   JSObject::DefineAccessor(base, name, getter, setter, attribs).Check();
551 }
552 
SimpleInstallGetter(Isolate * isolate,Handle<JSObject> base,Handle<Name> name,Handle<Name> property_name,Builtins::Name call,bool adapt)553 V8_NOINLINE Handle<JSFunction> SimpleInstallGetter(
554     Isolate* isolate, Handle<JSObject> base, Handle<Name> name,
555     Handle<Name> property_name, Builtins::Name call, bool adapt) {
556   Handle<String> getter_name =
557       Name::ToFunctionName(isolate, name, isolate->factory()->get_string())
558           .ToHandleChecked();
559   Handle<JSFunction> getter =
560       SimpleCreateFunction(isolate, getter_name, call, 0, adapt);
561 
562   Handle<Object> setter = isolate->factory()->undefined_value();
563 
564   JSObject::DefineAccessor(base, property_name, getter, setter, DONT_ENUM)
565       .Check();
566 
567   return getter;
568 }
569 
SimpleInstallGetter(Isolate * isolate,Handle<JSObject> base,Handle<Name> name,Builtins::Name call,bool adapt)570 V8_NOINLINE Handle<JSFunction> SimpleInstallGetter(Isolate* isolate,
571                                                    Handle<JSObject> base,
572                                                    Handle<Name> name,
573                                                    Builtins::Name call,
574                                                    bool adapt) {
575   return SimpleInstallGetter(isolate, base, name, name, call, adapt);
576 }
577 
SimpleInstallGetter(Isolate * isolate,Handle<JSObject> base,Handle<Name> name,Builtins::Name call,bool adapt,BuiltinFunctionId id)578 V8_NOINLINE Handle<JSFunction> SimpleInstallGetter(
579     Isolate* isolate, Handle<JSObject> base, Handle<Name> name,
580     Builtins::Name call, bool adapt, BuiltinFunctionId id) {
581   Handle<JSFunction> fun =
582       SimpleInstallGetter(isolate, base, name, call, adapt);
583   fun->shared()->set_builtin_function_id(id);
584   return fun;
585 }
586 
InstallConstant(Isolate * isolate,Handle<JSObject> holder,const char * name,Handle<Object> value)587 V8_NOINLINE void InstallConstant(Isolate* isolate, Handle<JSObject> holder,
588                                  const char* name, Handle<Object> value) {
589   JSObject::AddProperty(
590       isolate, holder, isolate->factory()->NewStringFromAsciiChecked(name),
591       value,
592       static_cast<PropertyAttributes>(DONT_DELETE | DONT_ENUM | READ_ONLY));
593 }
594 
InstallSpeciesGetter(Isolate * isolate,Handle<JSFunction> constructor)595 V8_NOINLINE void InstallSpeciesGetter(Isolate* isolate,
596                                       Handle<JSFunction> constructor) {
597   Factory* factory = isolate->factory();
598   // TODO(adamk): We should be able to share a SharedFunctionInfo
599   // between all these JSFunctins.
600   SimpleInstallGetter(isolate, constructor, factory->symbol_species_string(),
601                       factory->species_symbol(), Builtins::kReturnReceiver,
602                       true);
603 }
604 
605 }  // namespace
606 
CreateEmptyFunction()607 Handle<JSFunction> Genesis::CreateEmptyFunction() {
608   // Allocate the function map first and then patch the prototype later.
609   Handle<Map> empty_function_map = factory()->CreateSloppyFunctionMap(
610       FUNCTION_WITHOUT_PROTOTYPE, MaybeHandle<JSFunction>());
611   empty_function_map->set_is_prototype_map(true);
612   DCHECK(!empty_function_map->is_dictionary_map());
613 
614   // Allocate ScopeInfo for the empty function.
615   Handle<ScopeInfo> scope_info = ScopeInfo::CreateForEmptyFunction(isolate());
616 
617   // Allocate the empty function as the prototype for function according to
618   // ES#sec-properties-of-the-function-prototype-object
619   NewFunctionArgs args = NewFunctionArgs::ForBuiltin(
620       factory()->empty_string(), empty_function_map, Builtins::kEmptyFunction);
621   Handle<JSFunction> empty_function = factory()->NewFunction(args);
622   native_context()->set_empty_function(*empty_function);
623 
624   // --- E m p t y ---
625   Handle<String> source = factory()->NewStringFromStaticChars("() {}");
626   Handle<Script> script = factory()->NewScript(source);
627   script->set_type(Script::TYPE_NATIVE);
628   Handle<WeakFixedArray> infos = factory()->NewWeakFixedArray(2);
629   script->set_shared_function_infos(*infos);
630   empty_function->shared()->set_scope_info(*scope_info);
631   empty_function->shared()->DontAdaptArguments();
632   SharedFunctionInfo::SetScript(handle(empty_function->shared(), isolate()),
633                                 script, 1);
634 
635   return empty_function;
636 }
637 
CreateSloppyModeFunctionMaps(Handle<JSFunction> empty)638 void Genesis::CreateSloppyModeFunctionMaps(Handle<JSFunction> empty) {
639   Factory* factory = isolate_->factory();
640   Handle<Map> map;
641 
642   //
643   // Allocate maps for sloppy functions without prototype.
644   //
645   map = factory->CreateSloppyFunctionMap(FUNCTION_WITHOUT_PROTOTYPE, empty);
646   native_context()->set_sloppy_function_without_prototype_map(*map);
647 
648   //
649   // Allocate maps for sloppy functions with readonly prototype.
650   //
651   map =
652       factory->CreateSloppyFunctionMap(FUNCTION_WITH_READONLY_PROTOTYPE, empty);
653   native_context()->set_sloppy_function_with_readonly_prototype_map(*map);
654 
655   //
656   // Allocate maps for sloppy functions with writable prototype.
657   //
658   map = factory->CreateSloppyFunctionMap(FUNCTION_WITH_WRITEABLE_PROTOTYPE,
659                                          empty);
660   native_context()->set_sloppy_function_map(*map);
661 
662   map = factory->CreateSloppyFunctionMap(
663       FUNCTION_WITH_NAME_AND_WRITEABLE_PROTOTYPE, empty);
664   native_context()->set_sloppy_function_with_name_map(*map);
665 }
666 
GetThrowTypeErrorIntrinsic()667 Handle<JSFunction> Genesis::GetThrowTypeErrorIntrinsic() {
668   if (!restricted_properties_thrower_.is_null()) {
669     return restricted_properties_thrower_;
670   }
671   Handle<String> name = factory()->empty_string();
672   NewFunctionArgs args = NewFunctionArgs::ForBuiltinWithoutPrototype(
673       name, Builtins::kStrictPoisonPillThrower, i::LanguageMode::kStrict);
674   Handle<JSFunction> function = factory()->NewFunction(args);
675   function->shared()->DontAdaptArguments();
676 
677   // %ThrowTypeError% must not have a name property.
678   if (JSReceiver::DeleteProperty(function, factory()->name_string())
679           .IsNothing()) {
680     DCHECK(false);
681   }
682 
683   // length needs to be non configurable.
684   Handle<Object> value(Smi::FromInt(function->shared()->GetLength()),
685                        isolate());
686   JSObject::SetOwnPropertyIgnoreAttributes(
687       function, factory()->length_string(), value,
688       static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY))
689       .Assert();
690 
691   if (JSObject::PreventExtensions(function, kThrowOnError).IsNothing()) {
692     DCHECK(false);
693   }
694 
695   JSObject::MigrateSlowToFast(function, 0, "Bootstrapping");
696 
697   restricted_properties_thrower_ = function;
698   return function;
699 }
700 
CreateStrictModeFunctionMaps(Handle<JSFunction> empty)701 void Genesis::CreateStrictModeFunctionMaps(Handle<JSFunction> empty) {
702   Factory* factory = isolate_->factory();
703   Handle<Map> map;
704 
705   //
706   // Allocate maps for strict functions without prototype.
707   //
708   map = factory->CreateStrictFunctionMap(FUNCTION_WITHOUT_PROTOTYPE, empty);
709   native_context()->set_strict_function_without_prototype_map(*map);
710 
711   map = factory->CreateStrictFunctionMap(METHOD_WITH_NAME, empty);
712   native_context()->set_method_with_name_map(*map);
713 
714   map = factory->CreateStrictFunctionMap(METHOD_WITH_HOME_OBJECT, empty);
715   native_context()->set_method_with_home_object_map(*map);
716 
717   map =
718       factory->CreateStrictFunctionMap(METHOD_WITH_NAME_AND_HOME_OBJECT, empty);
719   native_context()->set_method_with_name_and_home_object_map(*map);
720 
721   //
722   // Allocate maps for strict functions with writable prototype.
723   //
724   map = factory->CreateStrictFunctionMap(FUNCTION_WITH_WRITEABLE_PROTOTYPE,
725                                          empty);
726   native_context()->set_strict_function_map(*map);
727 
728   map = factory->CreateStrictFunctionMap(
729       FUNCTION_WITH_NAME_AND_WRITEABLE_PROTOTYPE, empty);
730   native_context()->set_strict_function_with_name_map(*map);
731 
732   strict_function_with_home_object_map_ = factory->CreateStrictFunctionMap(
733       FUNCTION_WITH_HOME_OBJECT_AND_WRITEABLE_PROTOTYPE, empty);
734   strict_function_with_name_and_home_object_map_ =
735       factory->CreateStrictFunctionMap(
736           FUNCTION_WITH_NAME_AND_HOME_OBJECT_AND_WRITEABLE_PROTOTYPE, empty);
737 
738   //
739   // Allocate maps for strict functions with readonly prototype.
740   //
741   map =
742       factory->CreateStrictFunctionMap(FUNCTION_WITH_READONLY_PROTOTYPE, empty);
743   native_context()->set_strict_function_with_readonly_prototype_map(*map);
744 
745   //
746   // Allocate map for class functions.
747   //
748   map = factory->CreateClassFunctionMap(empty);
749   native_context()->set_class_function_map(*map);
750 
751   // Now that the strict mode function map is available, set up the
752   // restricted "arguments" and "caller" getters.
753   AddRestrictedFunctionProperties(empty);
754 }
755 
CreateObjectFunction(Handle<JSFunction> empty_function)756 void Genesis::CreateObjectFunction(Handle<JSFunction> empty_function) {
757   Factory* factory = isolate_->factory();
758 
759   // --- O b j e c t ---
760   int inobject_properties = JSObject::kInitialGlobalObjectUnusedPropertiesCount;
761   int instance_size =
762       JSObject::kHeaderSize + kPointerSize * inobject_properties;
763 
764   Handle<JSFunction> object_fun = CreateFunction(
765       isolate_, factory->Object_string(), JS_OBJECT_TYPE, instance_size,
766       inobject_properties, factory->null_value(), Builtins::kObjectConstructor);
767   object_fun->shared()->set_length(1);
768   object_fun->shared()->DontAdaptArguments();
769   native_context()->set_object_function(*object_fun);
770 
771   {
772     // Finish setting up Object function's initial map.
773     Map* initial_map = object_fun->initial_map();
774     initial_map->set_elements_kind(HOLEY_ELEMENTS);
775   }
776 
777   // Allocate a new prototype for the object function.
778   Handle<JSObject> object_function_prototype =
779       factory->NewFunctionPrototype(object_fun);
780 
781   Handle<Map> map =
782       Map::Copy(isolate(), handle(object_function_prototype->map(), isolate()),
783                 "EmptyObjectPrototype");
784   map->set_is_prototype_map(true);
785   // Ban re-setting Object.prototype.__proto__ to prevent Proxy security bug
786   map->set_is_immutable_proto(true);
787   object_function_prototype->set_map(*map);
788 
789   // Complete setting up empty function.
790   {
791     Handle<Map> empty_function_map(empty_function->map(), isolate_);
792     Map::SetPrototype(isolate(), empty_function_map, object_function_prototype);
793   }
794 
795   native_context()->set_initial_object_prototype(*object_function_prototype);
796   JSFunction::SetPrototype(object_fun, object_function_prototype);
797 
798   {
799     // Set up slow map for Object.create(null) instances without in-object
800     // properties.
801     Handle<Map> map(object_fun->initial_map(), isolate_);
802     map = Map::CopyInitialMapNormalized(isolate(), map);
803     Map::SetPrototype(isolate(), map, factory->null_value());
804     native_context()->set_slow_object_with_null_prototype_map(*map);
805 
806     // Set up slow map for literals with too many properties.
807     map = Map::Copy(isolate(), map, "slow_object_with_object_prototype_map");
808     Map::SetPrototype(isolate(), map, object_function_prototype);
809     native_context()->set_slow_object_with_object_prototype_map(*map);
810   }
811 }
812 
813 namespace {
814 
CreateNonConstructorMap(Isolate * isolate,Handle<Map> source_map,Handle<JSObject> prototype,const char * reason)815 Handle<Map> CreateNonConstructorMap(Isolate* isolate, Handle<Map> source_map,
816                                     Handle<JSObject> prototype,
817                                     const char* reason) {
818   Handle<Map> map = Map::Copy(isolate, source_map, reason);
819   // Ensure the resulting map has prototype slot (it is necessary for storing
820   // inital map even when the prototype property is not required).
821   if (!map->has_prototype_slot()) {
822     // Re-set the unused property fields after changing the instance size.
823     // TODO(ulan): Do not change instance size after map creation.
824     int unused_property_fields = map->UnusedPropertyFields();
825     map->set_instance_size(map->instance_size() + kPointerSize);
826     // The prototype slot shifts the in-object properties area by one slot.
827     map->SetInObjectPropertiesStartInWords(
828         map->GetInObjectPropertiesStartInWords() + 1);
829     map->set_has_prototype_slot(true);
830     map->SetInObjectUnusedPropertyFields(unused_property_fields);
831   }
832   map->set_is_constructor(false);
833   Map::SetPrototype(isolate, map, prototype);
834   return map;
835 }
836 
837 }  // namespace
838 
CreateIteratorMaps(Handle<JSFunction> empty)839 void Genesis::CreateIteratorMaps(Handle<JSFunction> empty) {
840   // Create iterator-related meta-objects.
841   Handle<JSObject> iterator_prototype =
842       factory()->NewJSObject(isolate()->object_function(), TENURED);
843 
844   SimpleInstallFunction(isolate(), iterator_prototype,
845                         factory()->iterator_symbol(), "[Symbol.iterator]",
846                         Builtins::kReturnReceiver, 0, true);
847   native_context()->set_initial_iterator_prototype(*iterator_prototype);
848 
849   Handle<JSObject> generator_object_prototype =
850       factory()->NewJSObject(isolate()->object_function(), TENURED);
851   native_context()->set_initial_generator_prototype(
852       *generator_object_prototype);
853   JSObject::ForceSetPrototype(generator_object_prototype, iterator_prototype);
854   Handle<JSObject> generator_function_prototype =
855       factory()->NewJSObject(isolate()->object_function(), TENURED);
856   JSObject::ForceSetPrototype(generator_function_prototype, empty);
857 
858   JSObject::AddProperty(
859       isolate(), generator_function_prototype,
860       factory()->to_string_tag_symbol(),
861       factory()->NewStringFromAsciiChecked("GeneratorFunction"),
862       static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
863   JSObject::AddProperty(isolate(), generator_function_prototype,
864                         factory()->prototype_string(),
865                         generator_object_prototype,
866                         static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
867 
868   JSObject::AddProperty(isolate(), generator_object_prototype,
869                         factory()->constructor_string(),
870                         generator_function_prototype,
871                         static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
872   JSObject::AddProperty(isolate(), generator_object_prototype,
873                         factory()->to_string_tag_symbol(),
874                         factory()->NewStringFromAsciiChecked("Generator"),
875                         static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
876   SimpleInstallFunction(isolate(), generator_object_prototype, "next",
877                         Builtins::kGeneratorPrototypeNext, 1, false);
878   SimpleInstallFunction(isolate(), generator_object_prototype, "return",
879                         Builtins::kGeneratorPrototypeReturn, 1, false);
880   SimpleInstallFunction(isolate(), generator_object_prototype, "throw",
881                         Builtins::kGeneratorPrototypeThrow, 1, false);
882 
883   // Internal version of generator_prototype_next, flagged as non-native such
884   // that it doesn't show up in Error traces.
885   Handle<JSFunction> generator_next_internal =
886       SimpleCreateFunction(isolate(), factory()->next_string(),
887                            Builtins::kGeneratorPrototypeNext, 1, false);
888   generator_next_internal->shared()->set_native(false);
889   native_context()->set_generator_next_internal(*generator_next_internal);
890 
891   // Create maps for generator functions and their prototypes.  Store those
892   // maps in the native context. The "prototype" property descriptor is
893   // writable, non-enumerable, and non-configurable (as per ES6 draft
894   // 04-14-15, section 25.2.4.3).
895   // Generator functions do not have "caller" or "arguments" accessors.
896   Handle<Map> map;
897   map = CreateNonConstructorMap(isolate(), isolate()->strict_function_map(),
898                                 generator_function_prototype,
899                                 "GeneratorFunction");
900   native_context()->set_generator_function_map(*map);
901 
902   map = CreateNonConstructorMap(
903       isolate(), isolate()->strict_function_with_name_map(),
904       generator_function_prototype, "GeneratorFunction with name");
905   native_context()->set_generator_function_with_name_map(*map);
906 
907   map = CreateNonConstructorMap(
908       isolate(), strict_function_with_home_object_map_,
909       generator_function_prototype, "GeneratorFunction with home object");
910   native_context()->set_generator_function_with_home_object_map(*map);
911 
912   map = CreateNonConstructorMap(isolate(),
913                                 strict_function_with_name_and_home_object_map_,
914                                 generator_function_prototype,
915                                 "GeneratorFunction with name and home object");
916   native_context()->set_generator_function_with_name_and_home_object_map(*map);
917 
918   Handle<JSFunction> object_function(native_context()->object_function(),
919                                      isolate());
920   Handle<Map> generator_object_prototype_map = Map::Create(isolate(), 0);
921   Map::SetPrototype(isolate(), generator_object_prototype_map,
922                     generator_object_prototype);
923   native_context()->set_generator_object_prototype_map(
924       *generator_object_prototype_map);
925 }
926 
CreateAsyncIteratorMaps(Handle<JSFunction> empty)927 void Genesis::CreateAsyncIteratorMaps(Handle<JSFunction> empty) {
928   // %AsyncIteratorPrototype%
929   // proposal-async-iteration/#sec-asynciteratorprototype
930   Handle<JSObject> async_iterator_prototype =
931       factory()->NewJSObject(isolate()->object_function(), TENURED);
932 
933   SimpleInstallFunction(
934       isolate(), async_iterator_prototype, factory()->async_iterator_symbol(),
935       "[Symbol.asyncIterator]", Builtins::kReturnReceiver, 0, true);
936 
937   // %AsyncFromSyncIteratorPrototype%
938   // proposal-async-iteration/#sec-%asyncfromsynciteratorprototype%-object
939   Handle<JSObject> async_from_sync_iterator_prototype =
940       factory()->NewJSObject(isolate()->object_function(), TENURED);
941   SimpleInstallFunction(isolate(), async_from_sync_iterator_prototype,
942                         factory()->next_string(),
943                         Builtins::kAsyncFromSyncIteratorPrototypeNext, 1, true);
944   SimpleInstallFunction(
945       isolate(), async_from_sync_iterator_prototype, factory()->return_string(),
946       Builtins::kAsyncFromSyncIteratorPrototypeReturn, 1, true);
947   SimpleInstallFunction(
948       isolate(), async_from_sync_iterator_prototype, factory()->throw_string(),
949       Builtins::kAsyncFromSyncIteratorPrototypeThrow, 1, true);
950 
951   JSObject::AddProperty(
952       isolate(), async_from_sync_iterator_prototype,
953       factory()->to_string_tag_symbol(),
954       factory()->NewStringFromAsciiChecked("Async-from-Sync Iterator"),
955       static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
956 
957   JSObject::ForceSetPrototype(async_from_sync_iterator_prototype,
958                               async_iterator_prototype);
959 
960   Handle<Map> async_from_sync_iterator_map = factory()->NewMap(
961       JS_ASYNC_FROM_SYNC_ITERATOR_TYPE, JSAsyncFromSyncIterator::kSize);
962   Map::SetPrototype(isolate(), async_from_sync_iterator_map,
963                     async_from_sync_iterator_prototype);
964   native_context()->set_async_from_sync_iterator_map(
965       *async_from_sync_iterator_map);
966 
967   // Async Generators
968   Handle<String> AsyncGeneratorFunction_string =
969       factory()->NewStringFromAsciiChecked("AsyncGeneratorFunction", TENURED);
970 
971   Handle<JSObject> async_generator_object_prototype =
972       factory()->NewJSObject(isolate()->object_function(), TENURED);
973   Handle<JSObject> async_generator_function_prototype =
974       factory()->NewJSObject(isolate()->object_function(), TENURED);
975 
976   // %AsyncGenerator% / %AsyncGeneratorFunction%.prototype
977   JSObject::ForceSetPrototype(async_generator_function_prototype, empty);
978 
979   // The value of AsyncGeneratorFunction.prototype.prototype is the
980   //     %AsyncGeneratorPrototype% intrinsic object.
981   // This property has the attributes
982   //     { [[Writable]]: false, [[Enumerable]]: false, [[Configurable]]: true }.
983   JSObject::AddProperty(isolate(), async_generator_function_prototype,
984                         factory()->prototype_string(),
985                         async_generator_object_prototype,
986                         static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
987   JSObject::AddProperty(isolate(), async_generator_object_prototype,
988                         factory()->constructor_string(),
989                         async_generator_function_prototype,
990                         static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
991   JSObject::AddProperty(isolate(), async_generator_function_prototype,
992                         factory()->to_string_tag_symbol(),
993                         AsyncGeneratorFunction_string,
994                         static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
995 
996   // %AsyncGeneratorPrototype%
997   JSObject::ForceSetPrototype(async_generator_object_prototype,
998                               async_iterator_prototype);
999   native_context()->set_initial_async_generator_prototype(
1000       *async_generator_object_prototype);
1001 
1002   JSObject::AddProperty(isolate(), async_generator_object_prototype,
1003                         factory()->to_string_tag_symbol(),
1004                         factory()->NewStringFromAsciiChecked("AsyncGenerator"),
1005                         static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
1006   SimpleInstallFunction(isolate(), async_generator_object_prototype, "next",
1007                         Builtins::kAsyncGeneratorPrototypeNext, 1, false);
1008   SimpleInstallFunction(isolate(), async_generator_object_prototype, "return",
1009                         Builtins::kAsyncGeneratorPrototypeReturn, 1, false);
1010   SimpleInstallFunction(isolate(), async_generator_object_prototype, "throw",
1011                         Builtins::kAsyncGeneratorPrototypeThrow, 1, false);
1012 
1013   // Create maps for generator functions and their prototypes.  Store those
1014   // maps in the native context. The "prototype" property descriptor is
1015   // writable, non-enumerable, and non-configurable (as per ES6 draft
1016   // 04-14-15, section 25.2.4.3).
1017   // Async Generator functions do not have "caller" or "arguments" accessors.
1018   Handle<Map> map;
1019   map = CreateNonConstructorMap(isolate(), isolate()->strict_function_map(),
1020                                 async_generator_function_prototype,
1021                                 "AsyncGeneratorFunction");
1022   native_context()->set_async_generator_function_map(*map);
1023 
1024   map = CreateNonConstructorMap(
1025       isolate(), isolate()->strict_function_with_name_map(),
1026       async_generator_function_prototype, "AsyncGeneratorFunction with name");
1027   native_context()->set_async_generator_function_with_name_map(*map);
1028 
1029   map =
1030       CreateNonConstructorMap(isolate(), strict_function_with_home_object_map_,
1031                               async_generator_function_prototype,
1032                               "AsyncGeneratorFunction with home object");
1033   native_context()->set_async_generator_function_with_home_object_map(*map);
1034 
1035   map = CreateNonConstructorMap(
1036       isolate(), strict_function_with_name_and_home_object_map_,
1037       async_generator_function_prototype,
1038       "AsyncGeneratorFunction with name and home object");
1039   native_context()->set_async_generator_function_with_name_and_home_object_map(
1040       *map);
1041 
1042   Handle<JSFunction> object_function(native_context()->object_function(),
1043                                      isolate());
1044   Handle<Map> async_generator_object_prototype_map = Map::Create(isolate(), 0);
1045   Map::SetPrototype(isolate(), async_generator_object_prototype_map,
1046                     async_generator_object_prototype);
1047   native_context()->set_async_generator_object_prototype_map(
1048       *async_generator_object_prototype_map);
1049 }
1050 
CreateAsyncFunctionMaps(Handle<JSFunction> empty)1051 void Genesis::CreateAsyncFunctionMaps(Handle<JSFunction> empty) {
1052   // %AsyncFunctionPrototype% intrinsic
1053   Handle<JSObject> async_function_prototype =
1054       factory()->NewJSObject(isolate()->object_function(), TENURED);
1055   JSObject::ForceSetPrototype(async_function_prototype, empty);
1056 
1057   JSObject::AddProperty(isolate(), async_function_prototype,
1058                         factory()->to_string_tag_symbol(),
1059                         factory()->NewStringFromAsciiChecked("AsyncFunction"),
1060                         static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
1061 
1062   Handle<Map> map;
1063   map = CreateNonConstructorMap(
1064       isolate(), isolate()->strict_function_without_prototype_map(),
1065       async_function_prototype, "AsyncFunction");
1066   native_context()->set_async_function_map(*map);
1067 
1068   map = CreateNonConstructorMap(isolate(), isolate()->method_with_name_map(),
1069                                 async_function_prototype,
1070                                 "AsyncFunction with name");
1071   native_context()->set_async_function_with_name_map(*map);
1072 
1073   map = CreateNonConstructorMap(
1074       isolate(), isolate()->method_with_home_object_map(),
1075       async_function_prototype, "AsyncFunction with home object");
1076   native_context()->set_async_function_with_home_object_map(*map);
1077 
1078   map = CreateNonConstructorMap(
1079       isolate(), isolate()->method_with_name_and_home_object_map(),
1080       async_function_prototype, "AsyncFunction with name and home object");
1081   native_context()->set_async_function_with_name_and_home_object_map(*map);
1082 }
1083 
CreateJSProxyMaps()1084 void Genesis::CreateJSProxyMaps() {
1085   // Allocate maps for all Proxy types.
1086   // Next to the default proxy, we need maps indicating callable and
1087   // constructable proxies.
1088   Handle<Map> proxy_map = factory()->NewMap(JS_PROXY_TYPE, JSProxy::kSize,
1089                                             TERMINAL_FAST_ELEMENTS_KIND);
1090   proxy_map->set_is_dictionary_map(true);
1091   proxy_map->set_may_have_interesting_symbols(true);
1092   native_context()->set_proxy_map(*proxy_map);
1093 
1094   Handle<Map> proxy_callable_map =
1095       Map::Copy(isolate_, proxy_map, "callable Proxy");
1096   proxy_callable_map->set_is_callable(true);
1097   native_context()->set_proxy_callable_map(*proxy_callable_map);
1098   proxy_callable_map->SetConstructor(native_context()->function_function());
1099 
1100   Handle<Map> proxy_constructor_map =
1101       Map::Copy(isolate_, proxy_callable_map, "constructor Proxy");
1102   proxy_constructor_map->set_is_constructor(true);
1103   native_context()->set_proxy_constructor_map(*proxy_constructor_map);
1104 
1105   {
1106     Handle<Map> map =
1107         factory()->NewMap(JS_OBJECT_TYPE, JSProxyRevocableResult::kSize,
1108                           TERMINAL_FAST_ELEMENTS_KIND, 2);
1109     Map::EnsureDescriptorSlack(isolate_, map, 2);
1110 
1111     {  // proxy
1112       Descriptor d = Descriptor::DataField(isolate(), factory()->proxy_string(),
1113                                            JSProxyRevocableResult::kProxyIndex,
1114                                            NONE, Representation::Tagged());
1115       map->AppendDescriptor(&d);
1116     }
1117     {  // revoke
1118       Descriptor d = Descriptor::DataField(
1119           isolate(), factory()->revoke_string(),
1120           JSProxyRevocableResult::kRevokeIndex, NONE, Representation::Tagged());
1121       map->AppendDescriptor(&d);
1122     }
1123 
1124     Map::SetPrototype(isolate(), map, isolate()->initial_object_prototype());
1125     map->SetConstructor(native_context()->object_function());
1126 
1127     native_context()->set_proxy_revocable_result_map(*map);
1128   }
1129 }
1130 
1131 namespace {
ReplaceAccessors(Isolate * isolate,Handle<Map> map,Handle<String> name,PropertyAttributes attributes,Handle<AccessorPair> accessor_pair)1132 void ReplaceAccessors(Isolate* isolate, Handle<Map> map, Handle<String> name,
1133                       PropertyAttributes attributes,
1134                       Handle<AccessorPair> accessor_pair) {
1135   DescriptorArray* descriptors = map->instance_descriptors();
1136   int idx = descriptors->SearchWithCache(isolate, *name, *map);
1137   Descriptor d = Descriptor::AccessorConstant(name, accessor_pair, attributes);
1138   descriptors->Replace(idx, &d);
1139 }
1140 }  // namespace
1141 
AddRestrictedFunctionProperties(Handle<JSFunction> empty)1142 void Genesis::AddRestrictedFunctionProperties(Handle<JSFunction> empty) {
1143   PropertyAttributes rw_attribs = static_cast<PropertyAttributes>(DONT_ENUM);
1144   Handle<JSFunction> thrower = GetThrowTypeErrorIntrinsic();
1145   Handle<AccessorPair> accessors = factory()->NewAccessorPair();
1146   accessors->set_getter(*thrower);
1147   accessors->set_setter(*thrower);
1148 
1149   Handle<Map> map(empty->map(), isolate());
1150   ReplaceAccessors(isolate(), map, factory()->arguments_string(), rw_attribs,
1151                    accessors);
1152   ReplaceAccessors(isolate(), map, factory()->caller_string(), rw_attribs,
1153                    accessors);
1154 }
1155 
AddToWeakNativeContextList(Isolate * isolate,Context * context)1156 static void AddToWeakNativeContextList(Isolate* isolate, Context* context) {
1157   DCHECK(context->IsNativeContext());
1158   Heap* heap = isolate->heap();
1159 #ifdef DEBUG
1160   { // NOLINT
1161     DCHECK(context->next_context_link()->IsUndefined(isolate));
1162     // Check that context is not in the list yet.
1163     for (Object* current = heap->native_contexts_list();
1164          !current->IsUndefined(isolate);
1165          current = Context::cast(current)->next_context_link()) {
1166       DCHECK(current != context);
1167     }
1168   }
1169 #endif
1170   context->set(Context::NEXT_CONTEXT_LINK, heap->native_contexts_list(),
1171                UPDATE_WEAK_WRITE_BARRIER);
1172   heap->set_native_contexts_list(context);
1173 }
1174 
1175 
CreateRoots()1176 void Genesis::CreateRoots() {
1177   // Allocate the native context FixedArray first and then patch the
1178   // closure and extension object later (we need the empty function
1179   // and the global object, but in order to create those, we need the
1180   // native context).
1181   native_context_ = factory()->NewNativeContext();
1182   AddToWeakNativeContextList(isolate(), *native_context());
1183   isolate()->set_context(*native_context());
1184 
1185   // Allocate the message listeners object.
1186   {
1187     Handle<TemplateList> list = TemplateList::New(isolate(), 1);
1188     native_context()->set_message_listeners(*list);
1189   }
1190 }
1191 
1192 
InstallGlobalThisBinding()1193 void Genesis::InstallGlobalThisBinding() {
1194   Handle<ScriptContextTable> script_contexts(
1195       native_context()->script_context_table(), isolate());
1196   Handle<ScopeInfo> scope_info = ScopeInfo::CreateGlobalThisBinding(isolate());
1197   Handle<Context> context =
1198       factory()->NewScriptContext(native_context(), scope_info);
1199 
1200   // Go ahead and hook it up while we're at it.
1201   int slot = scope_info->ReceiverContextSlotIndex();
1202   DCHECK_EQ(slot, Context::MIN_CONTEXT_SLOTS);
1203   context->set(slot, native_context()->global_proxy());
1204 
1205   Handle<ScriptContextTable> new_script_contexts =
1206       ScriptContextTable::Extend(script_contexts, context);
1207   native_context()->set_script_context_table(*new_script_contexts);
1208 }
1209 
1210 
CreateNewGlobals(v8::Local<v8::ObjectTemplate> global_proxy_template,Handle<JSGlobalProxy> global_proxy)1211 Handle<JSGlobalObject> Genesis::CreateNewGlobals(
1212     v8::Local<v8::ObjectTemplate> global_proxy_template,
1213     Handle<JSGlobalProxy> global_proxy) {
1214   // The argument global_proxy_template aka data is an ObjectTemplateInfo.
1215   // It has a constructor pointer that points at global_constructor which is a
1216   // FunctionTemplateInfo.
1217   // The global_proxy_constructor is used to (re)initialize the
1218   // global_proxy. The global_proxy_constructor also has a prototype_template
1219   // pointer that points at js_global_object_template which is an
1220   // ObjectTemplateInfo.
1221   // That in turn has a constructor pointer that points at
1222   // js_global_object_constructor which is a FunctionTemplateInfo.
1223   // js_global_object_constructor is used to make js_global_object_function
1224   // js_global_object_function is used to make the new global_object.
1225   //
1226   // --- G l o b a l ---
1227   // Step 1: Create a fresh JSGlobalObject.
1228   Handle<JSFunction> js_global_object_function;
1229   Handle<ObjectTemplateInfo> js_global_object_template;
1230   if (!global_proxy_template.IsEmpty()) {
1231     // Get prototype template of the global_proxy_template.
1232     Handle<ObjectTemplateInfo> data =
1233         v8::Utils::OpenHandle(*global_proxy_template);
1234     Handle<FunctionTemplateInfo> global_constructor =
1235         Handle<FunctionTemplateInfo>(
1236             FunctionTemplateInfo::cast(data->constructor()), isolate());
1237     Handle<Object> proto_template(global_constructor->prototype_template(),
1238                                   isolate());
1239     if (!proto_template->IsUndefined(isolate())) {
1240       js_global_object_template =
1241           Handle<ObjectTemplateInfo>::cast(proto_template);
1242     }
1243   }
1244 
1245   if (js_global_object_template.is_null()) {
1246     Handle<String> name = factory()->empty_string();
1247     Handle<JSObject> prototype =
1248         factory()->NewFunctionPrototype(isolate()->object_function());
1249     NewFunctionArgs args = NewFunctionArgs::ForBuiltinWithPrototype(
1250         name, prototype, JS_GLOBAL_OBJECT_TYPE, JSGlobalObject::kSize, 0,
1251         Builtins::kIllegal, MUTABLE);
1252     js_global_object_function = factory()->NewFunction(args);
1253 #ifdef DEBUG
1254     LookupIterator it(isolate(), prototype, factory()->constructor_string(),
1255                       LookupIterator::OWN_SKIP_INTERCEPTOR);
1256     Handle<Object> value = Object::GetProperty(&it).ToHandleChecked();
1257     DCHECK(it.IsFound());
1258     DCHECK_EQ(*isolate()->object_function(), *value);
1259 #endif
1260   } else {
1261     Handle<FunctionTemplateInfo> js_global_object_constructor(
1262         FunctionTemplateInfo::cast(js_global_object_template->constructor()),
1263         isolate());
1264     js_global_object_function = ApiNatives::CreateApiFunction(
1265         isolate(), js_global_object_constructor, factory()->the_hole_value(),
1266         ApiNatives::GlobalObjectType);
1267   }
1268 
1269   js_global_object_function->initial_map()->set_is_prototype_map(true);
1270   js_global_object_function->initial_map()->set_is_dictionary_map(true);
1271   js_global_object_function->initial_map()->set_may_have_interesting_symbols(
1272       true);
1273   Handle<JSGlobalObject> global_object =
1274       factory()->NewJSGlobalObject(js_global_object_function);
1275 
1276   // Step 2: (re)initialize the global proxy object.
1277   Handle<JSFunction> global_proxy_function;
1278   if (global_proxy_template.IsEmpty()) {
1279     Handle<String> name = factory()->empty_string();
1280     NewFunctionArgs args = NewFunctionArgs::ForBuiltinWithPrototype(
1281         name, factory()->the_hole_value(), JS_GLOBAL_PROXY_TYPE,
1282         JSGlobalProxy::SizeWithEmbedderFields(0), 0, Builtins::kIllegal,
1283         MUTABLE);
1284     global_proxy_function = factory()->NewFunction(args);
1285   } else {
1286     Handle<ObjectTemplateInfo> data =
1287         v8::Utils::OpenHandle(*global_proxy_template);
1288     Handle<FunctionTemplateInfo> global_constructor(
1289         FunctionTemplateInfo::cast(data->constructor()), isolate());
1290     global_proxy_function = ApiNatives::CreateApiFunction(
1291         isolate(), global_constructor, factory()->the_hole_value(),
1292         ApiNatives::GlobalProxyType);
1293   }
1294   global_proxy_function->initial_map()->set_is_access_check_needed(true);
1295   global_proxy_function->initial_map()->set_has_hidden_prototype(true);
1296   global_proxy_function->initial_map()->set_may_have_interesting_symbols(true);
1297   native_context()->set_global_proxy_function(*global_proxy_function);
1298 
1299   // Set global_proxy.__proto__ to js_global after ConfigureGlobalObjects
1300   // Return the global proxy.
1301 
1302   factory()->ReinitializeJSGlobalProxy(global_proxy, global_proxy_function);
1303 
1304   // Set the native context for the global object.
1305   global_object->set_native_context(*native_context());
1306   global_object->set_global_proxy(*global_proxy);
1307   // Set the native context of the global proxy.
1308   global_proxy->set_native_context(*native_context());
1309   // Set the global proxy of the native context. If the native context has been
1310   // deserialized, the global proxy is already correctly set up by the
1311   // deserializer. Otherwise it's undefined.
1312   DCHECK(native_context()
1313              ->get(Context::GLOBAL_PROXY_INDEX)
1314              ->IsUndefined(isolate()) ||
1315          native_context()->global_proxy() == *global_proxy);
1316   native_context()->set_global_proxy(*global_proxy);
1317 
1318   return global_object;
1319 }
1320 
HookUpGlobalProxy(Handle<JSGlobalProxy> global_proxy)1321 void Genesis::HookUpGlobalProxy(Handle<JSGlobalProxy> global_proxy) {
1322   // Re-initialize the global proxy with the global proxy function from the
1323   // snapshot, and then set up the link to the native context.
1324   Handle<JSFunction> global_proxy_function(
1325       native_context()->global_proxy_function(), isolate());
1326   factory()->ReinitializeJSGlobalProxy(global_proxy, global_proxy_function);
1327   Handle<JSObject> global_object(
1328       JSObject::cast(native_context()->global_object()), isolate());
1329   JSObject::ForceSetPrototype(global_proxy, global_object);
1330   global_proxy->set_native_context(*native_context());
1331   DCHECK(native_context()->global_proxy() == *global_proxy);
1332 }
1333 
HookUpGlobalObject(Handle<JSGlobalObject> global_object)1334 void Genesis::HookUpGlobalObject(Handle<JSGlobalObject> global_object) {
1335   Handle<JSGlobalObject> global_object_from_snapshot(
1336       JSGlobalObject::cast(native_context()->extension()), isolate());
1337   native_context()->set_extension(*global_object);
1338   native_context()->set_security_token(*global_object);
1339 
1340   TransferNamedProperties(global_object_from_snapshot, global_object);
1341   TransferIndexedProperties(global_object_from_snapshot, global_object);
1342 }
1343 
InstallWithIntrinsicDefaultProto(Isolate * isolate,Handle<JSFunction> function,int context_index)1344 static void InstallWithIntrinsicDefaultProto(Isolate* isolate,
1345                                              Handle<JSFunction> function,
1346                                              int context_index) {
1347   Handle<Smi> index(Smi::FromInt(context_index), isolate);
1348   JSObject::AddProperty(isolate, function,
1349                         isolate->factory()->native_context_index_symbol(),
1350                         index, NONE);
1351   isolate->native_context()->set(context_index, *function);
1352 }
1353 
InstallError(Isolate * isolate,Handle<JSObject> global,Handle<String> name,int context_index)1354 static void InstallError(Isolate* isolate, Handle<JSObject> global,
1355                          Handle<String> name, int context_index) {
1356   Factory* factory = isolate->factory();
1357 
1358   Handle<JSFunction> error_fun = InstallFunction(
1359       isolate, global, name, JS_ERROR_TYPE, JSObject::kHeaderSize, 0,
1360       factory->the_hole_value(), Builtins::kErrorConstructor, DONT_ENUM);
1361   error_fun->shared()->DontAdaptArguments();
1362   error_fun->shared()->set_length(1);
1363 
1364   if (context_index == Context::ERROR_FUNCTION_INDEX) {
1365     SimpleInstallFunction(isolate, error_fun, "captureStackTrace",
1366                           Builtins::kErrorCaptureStackTrace, 2, false);
1367   }
1368 
1369   InstallWithIntrinsicDefaultProto(isolate, error_fun, context_index);
1370 
1371   {
1372     // Setup %XXXErrorPrototype%.
1373     Handle<JSObject> prototype(JSObject::cast(error_fun->instance_prototype()),
1374                                isolate);
1375 
1376     JSObject::AddProperty(isolate, prototype, factory->name_string(), name,
1377                           DONT_ENUM);
1378     JSObject::AddProperty(isolate, prototype, factory->message_string(),
1379                           factory->empty_string(), DONT_ENUM);
1380 
1381     if (context_index == Context::ERROR_FUNCTION_INDEX) {
1382       Handle<JSFunction> to_string_fun =
1383           SimpleInstallFunction(isolate, prototype, factory->toString_string(),
1384                                 Builtins::kErrorPrototypeToString, 0, true);
1385       isolate->native_context()->set_error_to_string(*to_string_fun);
1386       isolate->native_context()->set_initial_error_prototype(*prototype);
1387     } else {
1388       DCHECK(isolate->native_context()->error_to_string()->IsJSFunction());
1389 
1390       InstallFunction(isolate, prototype, isolate->error_to_string(),
1391                       factory->toString_string(), DONT_ENUM);
1392 
1393       Handle<JSFunction> global_error = isolate->error_function();
1394       CHECK(JSReceiver::SetPrototype(error_fun, global_error, false,
1395                                      kThrowOnError)
1396                 .FromMaybe(false));
1397       CHECK(JSReceiver::SetPrototype(prototype,
1398                                      handle(global_error->prototype(), isolate),
1399                                      false, kThrowOnError)
1400                 .FromMaybe(false));
1401     }
1402   }
1403 
1404   Handle<Map> initial_map(error_fun->initial_map(), isolate);
1405   Map::EnsureDescriptorSlack(isolate, initial_map, 1);
1406 
1407   {
1408     Handle<AccessorInfo> info = factory->error_stack_accessor();
1409     Descriptor d = Descriptor::AccessorConstant(handle(info->name(), isolate),
1410                                                 info, DONT_ENUM);
1411     initial_map->AppendDescriptor(&d);
1412   }
1413 }
1414 
1415 namespace {
1416 
InstallMakeError(Isolate * isolate,int builtin_id,int context_index)1417 void InstallMakeError(Isolate* isolate, int builtin_id, int context_index) {
1418   NewFunctionArgs args = NewFunctionArgs::ForBuiltinWithPrototype(
1419       isolate->factory()->empty_string(), isolate->factory()->the_hole_value(),
1420       JS_OBJECT_TYPE, JSObject::kHeaderSize, 0, builtin_id, MUTABLE);
1421 
1422   Handle<JSFunction> function = isolate->factory()->NewFunction(args);
1423   function->shared()->DontAdaptArguments();
1424   isolate->native_context()->set(context_index, *function);
1425 }
1426 
1427 }  // namespace
1428 
1429 // This is only called if we are not using snapshots.  The equivalent
1430 // work in the snapshot case is done in HookUpGlobalObject.
InitializeGlobal(Handle<JSGlobalObject> global_object,Handle<JSFunction> empty_function,GlobalContextType context_type)1431 void Genesis::InitializeGlobal(Handle<JSGlobalObject> global_object,
1432                                Handle<JSFunction> empty_function,
1433                                GlobalContextType context_type) {
1434   // --- N a t i v e   C o n t e x t ---
1435   // Use the empty scope info.
1436   native_context()->set_scope_info(empty_function->shared()->scope_info());
1437   native_context()->set_previous(nullptr);
1438   // Set extension and global object.
1439   native_context()->set_extension(*global_object);
1440   // Security setup: Set the security token of the native context to the global
1441   // object. This makes the security check between two different contexts fail
1442   // by default even in case of global object reinitialization.
1443   native_context()->set_security_token(*global_object);
1444 
1445   Factory* factory = isolate_->factory();
1446 
1447   Handle<ScriptContextTable> script_context_table =
1448       factory->NewScriptContextTable();
1449   native_context()->set_script_context_table(*script_context_table);
1450   InstallGlobalThisBinding();
1451 
1452   {  // --- O b j e c t ---
1453     Handle<String> object_name = factory->Object_string();
1454     Handle<JSFunction> object_function = isolate_->object_function();
1455     JSObject::AddProperty(isolate_, global_object, object_name, object_function,
1456                           DONT_ENUM);
1457 
1458     SimpleInstallFunction(isolate_, object_function, factory->assign_string(),
1459                           Builtins::kObjectAssign, 2, false);
1460     SimpleInstallFunction(isolate_, object_function, "getOwnPropertyDescriptor",
1461                           Builtins::kObjectGetOwnPropertyDescriptor, 2, false);
1462     SimpleInstallFunction(isolate_, object_function,
1463                           factory->getOwnPropertyDescriptors_string(),
1464                           Builtins::kObjectGetOwnPropertyDescriptors, 1, false);
1465     SimpleInstallFunction(isolate_, object_function, "getOwnPropertyNames",
1466                           Builtins::kObjectGetOwnPropertyNames, 1, true);
1467     SimpleInstallFunction(isolate_, object_function, "getOwnPropertySymbols",
1468                           Builtins::kObjectGetOwnPropertySymbols, 1, false);
1469     SimpleInstallFunction(isolate_, object_function, "is", Builtins::kObjectIs,
1470                           2, true);
1471     SimpleInstallFunction(isolate_, object_function, "preventExtensions",
1472                           Builtins::kObjectPreventExtensions, 1, false);
1473     SimpleInstallFunction(isolate_, object_function, "seal",
1474                           Builtins::kObjectSeal, 1, false);
1475 
1476     Handle<JSFunction> object_create = SimpleInstallFunction(
1477         isolate_, object_function, factory->create_string(),
1478         Builtins::kObjectCreate, 2, false);
1479     native_context()->set_object_create(*object_create);
1480 
1481     Handle<JSFunction> object_define_properties =
1482         SimpleInstallFunction(isolate_, object_function, "defineProperties",
1483                               Builtins::kObjectDefineProperties, 2, true);
1484     native_context()->set_object_define_properties(*object_define_properties);
1485 
1486     Handle<JSFunction> object_define_property = SimpleInstallFunction(
1487         isolate_, object_function, factory->defineProperty_string(),
1488         Builtins::kObjectDefineProperty, 3, true);
1489     native_context()->set_object_define_property(*object_define_property);
1490 
1491     SimpleInstallFunction(isolate_, object_function, "freeze",
1492                           Builtins::kObjectFreeze, 1, false);
1493 
1494     Handle<JSFunction> object_get_prototype_of =
1495         SimpleInstallFunction(isolate_, object_function, "getPrototypeOf",
1496                               Builtins::kObjectGetPrototypeOf, 1, false);
1497     native_context()->set_object_get_prototype_of(*object_get_prototype_of);
1498     SimpleInstallFunction(isolate_, object_function, "setPrototypeOf",
1499                           Builtins::kObjectSetPrototypeOf, 2, false);
1500 
1501     SimpleInstallFunction(isolate_, object_function, "isExtensible",
1502                           Builtins::kObjectIsExtensible, 1, false);
1503     SimpleInstallFunction(isolate_, object_function, "isFrozen",
1504                           Builtins::kObjectIsFrozen, 1, false);
1505 
1506     Handle<JSFunction> object_is_sealed =
1507         SimpleInstallFunction(isolate_, object_function, "isSealed",
1508                               Builtins::kObjectIsSealed, 1, false);
1509     native_context()->set_object_is_sealed(*object_is_sealed);
1510 
1511     Handle<JSFunction> object_keys = SimpleInstallFunction(
1512         isolate_, object_function, "keys", Builtins::kObjectKeys, 1, true);
1513     native_context()->set_object_keys(*object_keys);
1514     SimpleInstallFunction(isolate_, object_function, factory->entries_string(),
1515                           Builtins::kObjectEntries, 1, true);
1516     SimpleInstallFunction(isolate_, object_function, factory->values_string(),
1517                           Builtins::kObjectValues, 1, true);
1518 
1519     SimpleInstallFunction(isolate_, isolate_->initial_object_prototype(),
1520                           "__defineGetter__", Builtins::kObjectDefineGetter, 2,
1521                           true);
1522     SimpleInstallFunction(isolate_, isolate_->initial_object_prototype(),
1523                           "__defineSetter__", Builtins::kObjectDefineSetter, 2,
1524                           true);
1525     SimpleInstallFunction(isolate_, isolate_->initial_object_prototype(),
1526                           "hasOwnProperty",
1527                           Builtins::kObjectPrototypeHasOwnProperty, 1, true);
1528     SimpleInstallFunction(isolate_, isolate_->initial_object_prototype(),
1529                           "__lookupGetter__", Builtins::kObjectLookupGetter, 1,
1530                           true);
1531     SimpleInstallFunction(isolate_, isolate_->initial_object_prototype(),
1532                           "__lookupSetter__", Builtins::kObjectLookupSetter, 1,
1533                           true);
1534     SimpleInstallFunction(isolate_, isolate_->initial_object_prototype(),
1535                           "isPrototypeOf",
1536                           Builtins::kObjectPrototypeIsPrototypeOf, 1, true);
1537     SimpleInstallFunction(
1538         isolate_, isolate_->initial_object_prototype(), "propertyIsEnumerable",
1539         Builtins::kObjectPrototypePropertyIsEnumerable, 1, false);
1540     Handle<JSFunction> object_to_string =
1541         SimpleInstallFunction(isolate_, isolate_->initial_object_prototype(),
1542                               factory->toString_string(),
1543                               Builtins::kObjectPrototypeToString, 0, true);
1544     native_context()->set_object_to_string(*object_to_string);
1545     Handle<JSFunction> object_value_of = SimpleInstallFunction(
1546         isolate_, isolate_->initial_object_prototype(), "valueOf",
1547         Builtins::kObjectPrototypeValueOf, 0, true);
1548     native_context()->set_object_value_of(*object_value_of);
1549 
1550     SimpleInstallGetterSetter(isolate_, isolate_->initial_object_prototype(),
1551                               factory->proto_string(),
1552                               Builtins::kObjectPrototypeGetProto,
1553                               Builtins::kObjectPrototypeSetProto, DONT_ENUM);
1554 
1555     SimpleInstallFunction(isolate_, isolate_->initial_object_prototype(),
1556                           "toLocaleString",
1557                           Builtins::kObjectPrototypeToLocaleString, 0, true);
1558   }
1559 
1560   Handle<JSObject> global(native_context()->global_object(), isolate());
1561 
1562   {  // --- F u n c t i o n ---
1563     Handle<JSFunction> prototype = empty_function;
1564     Handle<JSFunction> function_fun =
1565         InstallFunction(isolate_, global, "Function", JS_FUNCTION_TYPE,
1566                         JSFunction::kSizeWithPrototype, 0, prototype,
1567                         Builtins::kFunctionConstructor);
1568     // Function instances are sloppy by default.
1569     function_fun->set_prototype_or_initial_map(
1570         *isolate_->sloppy_function_map());
1571     function_fun->shared()->DontAdaptArguments();
1572     function_fun->shared()->set_length(1);
1573     InstallWithIntrinsicDefaultProto(isolate_, function_fun,
1574                                      Context::FUNCTION_FUNCTION_INDEX);
1575 
1576     // Setup the methods on the %FunctionPrototype%.
1577     JSObject::AddProperty(isolate_, prototype, factory->constructor_string(),
1578                           function_fun, DONT_ENUM);
1579     SimpleInstallFunction(isolate_, prototype, factory->apply_string(),
1580                           Builtins::kFunctionPrototypeApply, 2, false);
1581     SimpleInstallFunction(isolate_, prototype, factory->bind_string(),
1582                           Builtins::kFastFunctionPrototypeBind, 1, false);
1583     SimpleInstallFunction(isolate_, prototype, factory->call_string(),
1584                           Builtins::kFunctionPrototypeCall, 1, false);
1585     SimpleInstallFunction(isolate_, prototype, factory->toString_string(),
1586                           Builtins::kFunctionPrototypeToString, 0, false);
1587 
1588     // Install the @@hasInstance function.
1589     Handle<JSFunction> has_instance = SimpleInstallFunction(
1590         isolate_, prototype, factory->has_instance_symbol(),
1591         "[Symbol.hasInstance]", Builtins::kFunctionPrototypeHasInstance, 1,
1592         true,
1593         static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY),
1594         BuiltinFunctionId::kFunctionHasInstance);
1595     native_context()->set_function_has_instance(*has_instance);
1596 
1597     // Complete setting up function maps.
1598     {
1599       isolate_->sloppy_function_map()->SetConstructor(*function_fun);
1600       isolate_->sloppy_function_with_name_map()->SetConstructor(*function_fun);
1601       isolate_->sloppy_function_with_readonly_prototype_map()->SetConstructor(
1602           *function_fun);
1603 
1604       isolate_->strict_function_map()->SetConstructor(*function_fun);
1605       isolate_->strict_function_with_name_map()->SetConstructor(*function_fun);
1606       strict_function_with_home_object_map_->SetConstructor(*function_fun);
1607       strict_function_with_name_and_home_object_map_->SetConstructor(
1608           *function_fun);
1609       isolate_->strict_function_with_readonly_prototype_map()->SetConstructor(
1610           *function_fun);
1611 
1612       isolate_->class_function_map()->SetConstructor(*function_fun);
1613     }
1614   }
1615 
1616   {  // --- A s y n c F r o m S y n c I t e r a t o r
1617     Handle<SharedFunctionInfo> info = SimpleCreateSharedFunctionInfo(
1618         isolate_, Builtins::kAsyncIteratorValueUnwrap, factory->empty_string(),
1619         1);
1620     native_context()->set_async_iterator_value_unwrap_shared_fun(*info);
1621   }
1622 
1623   {  // --- A s y n c G e n e r a t o r ---
1624     Handle<JSFunction> await_caught =
1625         SimpleCreateFunction(isolate_, factory->empty_string(),
1626                              Builtins::kAsyncGeneratorAwaitCaught, 1, false);
1627     native_context()->set_async_generator_await_caught(*await_caught);
1628 
1629     Handle<JSFunction> await_uncaught =
1630         SimpleCreateFunction(isolate_, factory->empty_string(),
1631                              Builtins::kAsyncGeneratorAwaitUncaught, 1, false);
1632     native_context()->set_async_generator_await_uncaught(*await_uncaught);
1633 
1634     Handle<SharedFunctionInfo> info = SimpleCreateSharedFunctionInfo(
1635         isolate_, Builtins::kAsyncGeneratorAwaitResolveClosure,
1636         factory->empty_string(), 1);
1637     native_context()->set_async_generator_await_resolve_shared_fun(*info);
1638 
1639     info = SimpleCreateSharedFunctionInfo(
1640         isolate_, Builtins::kAsyncGeneratorAwaitRejectClosure,
1641         factory->empty_string(), 1);
1642     native_context()->set_async_generator_await_reject_shared_fun(*info);
1643 
1644     info = SimpleCreateSharedFunctionInfo(
1645         isolate_, Builtins::kAsyncGeneratorYieldResolveClosure,
1646         factory->empty_string(), 1);
1647     native_context()->set_async_generator_yield_resolve_shared_fun(*info);
1648 
1649     info = SimpleCreateSharedFunctionInfo(
1650         isolate_, Builtins::kAsyncGeneratorReturnResolveClosure,
1651         factory->empty_string(), 1);
1652     native_context()->set_async_generator_return_resolve_shared_fun(*info);
1653 
1654     info = SimpleCreateSharedFunctionInfo(
1655         isolate_, Builtins::kAsyncGeneratorReturnClosedResolveClosure,
1656         factory->empty_string(), 1);
1657     native_context()->set_async_generator_return_closed_resolve_shared_fun(
1658         *info);
1659 
1660     info = SimpleCreateSharedFunctionInfo(
1661         isolate_, Builtins::kAsyncGeneratorReturnClosedRejectClosure,
1662         factory->empty_string(), 1);
1663     native_context()->set_async_generator_return_closed_reject_shared_fun(
1664         *info);
1665   }
1666 
1667   {  // --- A r r a y ---
1668     Handle<JSFunction> array_function = InstallFunction(
1669         isolate_, global, "Array", JS_ARRAY_TYPE, JSArray::kSize, 0,
1670         isolate_->initial_object_prototype(), Builtins::kArrayConstructor);
1671     array_function->shared()->DontAdaptArguments();
1672     array_function->shared()->set_builtin_function_id(
1673         BuiltinFunctionId::kArrayConstructor);
1674 
1675     // This seems a bit hackish, but we need to make sure Array.length
1676     // is 1.
1677     array_function->shared()->set_length(1);
1678 
1679     Handle<Map> initial_map(array_function->initial_map(), isolate());
1680 
1681     // This assert protects an optimization in
1682     // HGraphBuilder::JSArrayBuilder::EmitMapCode()
1683     DCHECK(initial_map->elements_kind() == GetInitialFastElementsKind());
1684     Map::EnsureDescriptorSlack(isolate_, initial_map, 1);
1685 
1686     PropertyAttributes attribs = static_cast<PropertyAttributes>(
1687         DONT_ENUM | DONT_DELETE);
1688 
1689     STATIC_ASSERT(JSArray::kLengthDescriptorIndex == 0);
1690     {  // Add length.
1691       Descriptor d = Descriptor::AccessorConstant(
1692           factory->length_string(), factory->array_length_accessor(), attribs);
1693       initial_map->AppendDescriptor(&d);
1694     }
1695 
1696     InstallWithIntrinsicDefaultProto(isolate_, array_function,
1697                                      Context::ARRAY_FUNCTION_INDEX);
1698     InstallSpeciesGetter(isolate_, array_function);
1699 
1700     // Cache the array maps, needed by ArrayConstructorStub
1701     CacheInitialJSArrayMaps(native_context(), initial_map);
1702 
1703     // Set up %ArrayPrototype%.
1704     // The %ArrayPrototype% has TERMINAL_FAST_ELEMENTS_KIND in order to ensure
1705     // that constant functions stay constant after turning prototype to setup
1706     // mode and back when constant field tracking is enabled.
1707     Handle<JSArray> proto =
1708         factory->NewJSArray(0, TERMINAL_FAST_ELEMENTS_KIND, TENURED);
1709     JSFunction::SetPrototype(array_function, proto);
1710     native_context()->set_initial_array_prototype(*proto);
1711 
1712     Handle<JSFunction> is_arraylike = SimpleInstallFunction(
1713         isolate_, array_function, "isArray", Builtins::kArrayIsArray, 1, true);
1714     native_context()->set_is_arraylike(*is_arraylike);
1715 
1716     SimpleInstallFunction(isolate_, array_function, "from",
1717                           Builtins::kArrayFrom, 1, false);
1718     SimpleInstallFunction(isolate_, array_function, "of", Builtins::kArrayOf, 0,
1719                           false);
1720 
1721     JSObject::AddProperty(isolate_, proto, factory->constructor_string(),
1722                           array_function, DONT_ENUM);
1723 
1724     SimpleInstallFunction(isolate_, proto, "concat", Builtins::kArrayConcat, 1,
1725                           false);
1726     SimpleInstallFunction(isolate_, proto, "copyWithin",
1727                           Builtins::kArrayPrototypeCopyWithin, 2, false);
1728     SimpleInstallFunction(isolate_, proto, "fill",
1729                           Builtins::kArrayPrototypeFill, 1, false);
1730     SimpleInstallFunction(isolate_, proto, "find",
1731                           Builtins::kArrayPrototypeFind, 1, false);
1732     SimpleInstallFunction(isolate_, proto, "findIndex",
1733                           Builtins::kArrayPrototypeFindIndex, 1, false);
1734     SimpleInstallFunction(isolate_, proto, "pop", Builtins::kArrayPrototypePop,
1735                           0, false);
1736     SimpleInstallFunction(isolate_, proto, "push",
1737                           Builtins::kArrayPrototypePush, 1, false);
1738     SimpleInstallFunction(isolate_, proto, "reverse",
1739                           Builtins::kArrayPrototypeReverse, 0, false);
1740     SimpleInstallFunction(isolate_, proto, "shift",
1741                           Builtins::kArrayPrototypeShift, 0, false);
1742     SimpleInstallFunction(isolate_, proto, "unshift", Builtins::kArrayUnshift,
1743                           1, false);
1744     SimpleInstallFunction(isolate_, proto, "slice",
1745                           Builtins::kArrayPrototypeSlice, 2, false);
1746     SimpleInstallFunction(isolate_, proto, "sort",
1747                           Builtins::kArrayPrototypeSort, 1, false);
1748     if (FLAG_enable_experimental_builtins) {
1749       SimpleInstallFunction(isolate_, proto, "splice",
1750                             Builtins::kArraySpliceTorque, 2, false);
1751     } else {
1752       SimpleInstallFunction(isolate_, proto, "splice", Builtins::kArraySplice,
1753                             2, false);
1754     }
1755     SimpleInstallFunction(isolate_, proto, "includes", Builtins::kArrayIncludes,
1756                           1, false);
1757     SimpleInstallFunction(isolate_, proto, "indexOf", Builtins::kArrayIndexOf,
1758                           1, false);
1759     SimpleInstallFunction(isolate_, proto, "keys",
1760                           Builtins::kArrayPrototypeKeys, 0, true,
1761                           BuiltinFunctionId::kArrayKeys);
1762     SimpleInstallFunction(isolate_, proto, "entries",
1763                           Builtins::kArrayPrototypeEntries, 0, true,
1764                           BuiltinFunctionId::kArrayEntries);
1765     SimpleInstallFunction(isolate_, proto, factory->iterator_symbol(), "values",
1766                           Builtins::kArrayPrototypeValues, 0, true, DONT_ENUM,
1767                           BuiltinFunctionId::kArrayValues);
1768     SimpleInstallFunction(isolate_, proto, "forEach", Builtins::kArrayForEach,
1769                           1, false);
1770     SimpleInstallFunction(isolate_, proto, "filter", Builtins::kArrayFilter, 1,
1771                           false);
1772     SimpleInstallFunction(isolate_, proto, "map", Builtins::kArrayMap, 1,
1773                           false);
1774     SimpleInstallFunction(isolate_, proto, "every", Builtins::kArrayEvery, 1,
1775                           false);
1776     SimpleInstallFunction(isolate_, proto, "some", Builtins::kArraySome, 1,
1777                           false);
1778     SimpleInstallFunction(isolate_, proto, "reduce", Builtins::kArrayReduce, 1,
1779                           false);
1780     SimpleInstallFunction(isolate_, proto, "reduceRight",
1781                           Builtins::kArrayReduceRight, 1, false);
1782   }
1783 
1784   {  // --- A r r a y I t e r a t o r ---
1785     Handle<JSObject> iterator_prototype(
1786         native_context()->initial_iterator_prototype(), isolate());
1787 
1788     Handle<JSObject> array_iterator_prototype =
1789         factory->NewJSObject(isolate_->object_function(), TENURED);
1790     JSObject::ForceSetPrototype(array_iterator_prototype, iterator_prototype);
1791 
1792     JSObject::AddProperty(
1793         isolate_, array_iterator_prototype, factory->to_string_tag_symbol(),
1794         factory->ArrayIterator_string(),
1795         static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
1796 
1797     SimpleInstallFunction(isolate_, array_iterator_prototype, "next",
1798                           Builtins::kArrayIteratorPrototypeNext, 0, true,
1799                           BuiltinFunctionId::kArrayIteratorNext);
1800 
1801     Handle<JSFunction> array_iterator_function =
1802         CreateFunction(isolate_, factory->ArrayIterator_string(),
1803                        JS_ARRAY_ITERATOR_TYPE, JSArrayIterator::kSize, 0,
1804                        array_iterator_prototype, Builtins::kIllegal);
1805     array_iterator_function->shared()->set_native(false);
1806 
1807     native_context()->set_initial_array_iterator_map(
1808         array_iterator_function->initial_map());
1809     native_context()->set_initial_array_iterator_prototype(
1810         *array_iterator_prototype);
1811   }
1812 
1813   {  // --- N u m b e r ---
1814     Handle<JSFunction> number_fun = InstallFunction(
1815         isolate_, global, "Number", JS_VALUE_TYPE, JSValue::kSize, 0,
1816         isolate_->initial_object_prototype(), Builtins::kNumberConstructor);
1817     number_fun->shared()->set_builtin_function_id(
1818         BuiltinFunctionId::kNumberConstructor);
1819     number_fun->shared()->DontAdaptArguments();
1820     number_fun->shared()->set_length(1);
1821     InstallWithIntrinsicDefaultProto(isolate_, number_fun,
1822                                      Context::NUMBER_FUNCTION_INDEX);
1823 
1824     // Create the %NumberPrototype%
1825     Handle<JSValue> prototype =
1826         Handle<JSValue>::cast(factory->NewJSObject(number_fun, TENURED));
1827     prototype->set_value(Smi::kZero);
1828     JSFunction::SetPrototype(number_fun, prototype);
1829 
1830     // Install the "constructor" property on the {prototype}.
1831     JSObject::AddProperty(isolate_, prototype, factory->constructor_string(),
1832                           number_fun, DONT_ENUM);
1833 
1834     // Install the Number.prototype methods.
1835     SimpleInstallFunction(isolate_, prototype, "toExponential",
1836                           Builtins::kNumberPrototypeToExponential, 1, false);
1837     SimpleInstallFunction(isolate_, prototype, "toFixed",
1838                           Builtins::kNumberPrototypeToFixed, 1, false);
1839     SimpleInstallFunction(isolate_, prototype, "toPrecision",
1840                           Builtins::kNumberPrototypeToPrecision, 1, false);
1841     SimpleInstallFunction(isolate_, prototype, "toString",
1842                           Builtins::kNumberPrototypeToString, 1, false);
1843     SimpleInstallFunction(isolate_, prototype, "valueOf",
1844                           Builtins::kNumberPrototypeValueOf, 0, true);
1845 
1846     SimpleInstallFunction(isolate_, prototype, "toLocaleString",
1847                           Builtins::kNumberPrototypeToLocaleString, 0, false);
1848 
1849     // Install the Number functions.
1850     SimpleInstallFunction(isolate_, number_fun, "isFinite",
1851                           Builtins::kNumberIsFinite, 1, true);
1852     SimpleInstallFunction(isolate_, number_fun, "isInteger",
1853                           Builtins::kNumberIsInteger, 1, true);
1854     SimpleInstallFunction(isolate_, number_fun, "isNaN", Builtins::kNumberIsNaN,
1855                           1, true);
1856     SimpleInstallFunction(isolate_, number_fun, "isSafeInteger",
1857                           Builtins::kNumberIsSafeInteger, 1, true);
1858 
1859     // Install Number.parseFloat and Global.parseFloat.
1860     Handle<JSFunction> parse_float_fun =
1861         SimpleInstallFunction(isolate_, number_fun, "parseFloat",
1862                               Builtins::kNumberParseFloat, 1, true);
1863     JSObject::AddProperty(isolate_, global_object,
1864                           factory->NewStringFromAsciiChecked("parseFloat"),
1865                           parse_float_fun, DONT_ENUM);
1866 
1867     // Install Number.parseInt and Global.parseInt.
1868     Handle<JSFunction> parse_int_fun = SimpleInstallFunction(
1869         isolate_, number_fun, "parseInt", Builtins::kNumberParseInt, 2, true);
1870     JSObject::AddProperty(isolate_, global_object,
1871                           factory->NewStringFromAsciiChecked("parseInt"),
1872                           parse_int_fun, DONT_ENUM);
1873 
1874     // Install Number constants
1875     double kMaxValue = 1.7976931348623157e+308;
1876     double kMinValue = 5e-324;
1877     double kMinSafeInteger = -kMaxSafeInteger;
1878     double kEPS = 2.220446049250313e-16;
1879 
1880     Handle<Object> infinity = factory->infinity_value();
1881     Handle<Object> nan = factory->nan_value();
1882     Handle<String> nan_name = factory->NewStringFromAsciiChecked("NaN");
1883 
1884     JSObject::AddProperty(
1885         isolate_, number_fun, factory->NewStringFromAsciiChecked("MAX_VALUE"),
1886         factory->NewNumber(kMaxValue),
1887         static_cast<PropertyAttributes>(DONT_DELETE | DONT_ENUM | READ_ONLY));
1888     JSObject::AddProperty(
1889         isolate_, number_fun, factory->NewStringFromAsciiChecked("MIN_VALUE"),
1890         factory->NewNumber(kMinValue),
1891         static_cast<PropertyAttributes>(DONT_DELETE | DONT_ENUM | READ_ONLY));
1892     JSObject::AddProperty(
1893         isolate_, number_fun, nan_name, nan,
1894         static_cast<PropertyAttributes>(DONT_DELETE | DONT_ENUM | READ_ONLY));
1895     JSObject::AddProperty(
1896         isolate_, number_fun,
1897         factory->NewStringFromAsciiChecked("NEGATIVE_INFINITY"),
1898         factory->NewNumber(-V8_INFINITY),
1899         static_cast<PropertyAttributes>(DONT_DELETE | DONT_ENUM | READ_ONLY));
1900     JSObject::AddProperty(
1901         isolate_, number_fun,
1902         factory->NewStringFromAsciiChecked("POSITIVE_INFINITY"), infinity,
1903         static_cast<PropertyAttributes>(DONT_DELETE | DONT_ENUM | READ_ONLY));
1904     JSObject::AddProperty(
1905         isolate_, number_fun,
1906         factory->NewStringFromAsciiChecked("MAX_SAFE_INTEGER"),
1907         factory->NewNumber(kMaxSafeInteger),
1908         static_cast<PropertyAttributes>(DONT_DELETE | DONT_ENUM | READ_ONLY));
1909     JSObject::AddProperty(
1910         isolate_, number_fun,
1911         factory->NewStringFromAsciiChecked("MIN_SAFE_INTEGER"),
1912         factory->NewNumber(kMinSafeInteger),
1913         static_cast<PropertyAttributes>(DONT_DELETE | DONT_ENUM | READ_ONLY));
1914     JSObject::AddProperty(
1915         isolate_, number_fun, factory->NewStringFromAsciiChecked("EPSILON"),
1916         factory->NewNumber(kEPS),
1917         static_cast<PropertyAttributes>(DONT_DELETE | DONT_ENUM | READ_ONLY));
1918 
1919     JSObject::AddProperty(
1920         isolate_, global, factory->NewStringFromAsciiChecked("Infinity"),
1921         infinity,
1922         static_cast<PropertyAttributes>(DONT_DELETE | DONT_ENUM | READ_ONLY));
1923     JSObject::AddProperty(
1924         isolate_, global, nan_name, nan,
1925         static_cast<PropertyAttributes>(DONT_DELETE | DONT_ENUM | READ_ONLY));
1926     JSObject::AddProperty(
1927         isolate_, global, factory->NewStringFromAsciiChecked("undefined"),
1928         factory->undefined_value(),
1929         static_cast<PropertyAttributes>(DONT_DELETE | DONT_ENUM | READ_ONLY));
1930   }
1931 
1932   {  // --- B o o l e a n ---
1933     Handle<JSFunction> boolean_fun = InstallFunction(
1934         isolate_, global, "Boolean", JS_VALUE_TYPE, JSValue::kSize, 0,
1935         isolate_->initial_object_prototype(), Builtins::kBooleanConstructor);
1936     boolean_fun->shared()->DontAdaptArguments();
1937     boolean_fun->shared()->set_length(1);
1938     InstallWithIntrinsicDefaultProto(isolate_, boolean_fun,
1939                                      Context::BOOLEAN_FUNCTION_INDEX);
1940 
1941     // Create the %BooleanPrototype%
1942     Handle<JSValue> prototype =
1943         Handle<JSValue>::cast(factory->NewJSObject(boolean_fun, TENURED));
1944     prototype->set_value(ReadOnlyRoots(isolate_).false_value());
1945     JSFunction::SetPrototype(boolean_fun, prototype);
1946 
1947     // Install the "constructor" property on the {prototype}.
1948     JSObject::AddProperty(isolate_, prototype, factory->constructor_string(),
1949                           boolean_fun, DONT_ENUM);
1950 
1951     // Install the Boolean.prototype methods.
1952     SimpleInstallFunction(isolate_, prototype, "toString",
1953                           Builtins::kBooleanPrototypeToString, 0, true);
1954     SimpleInstallFunction(isolate_, prototype, "valueOf",
1955                           Builtins::kBooleanPrototypeValueOf, 0, true);
1956   }
1957 
1958   {  // --- S t r i n g ---
1959     Handle<JSFunction> string_fun = InstallFunction(
1960         isolate_, global, "String", JS_VALUE_TYPE, JSValue::kSize, 0,
1961         isolate_->initial_object_prototype(), Builtins::kStringConstructor);
1962     string_fun->shared()->set_builtin_function_id(
1963         BuiltinFunctionId::kStringConstructor);
1964     string_fun->shared()->DontAdaptArguments();
1965     string_fun->shared()->set_length(1);
1966     InstallWithIntrinsicDefaultProto(isolate_, string_fun,
1967                                      Context::STRING_FUNCTION_INDEX);
1968 
1969     Handle<Map> string_map = Handle<Map>(
1970         native_context()->string_function()->initial_map(), isolate());
1971     string_map->set_elements_kind(FAST_STRING_WRAPPER_ELEMENTS);
1972     Map::EnsureDescriptorSlack(isolate_, string_map, 1);
1973 
1974     PropertyAttributes attribs = static_cast<PropertyAttributes>(
1975         DONT_ENUM | DONT_DELETE | READ_ONLY);
1976 
1977     {  // Add length.
1978       Descriptor d = Descriptor::AccessorConstant(
1979           factory->length_string(), factory->string_length_accessor(), attribs);
1980       string_map->AppendDescriptor(&d);
1981     }
1982 
1983     // Install the String.fromCharCode function.
1984     SimpleInstallFunction(isolate_, string_fun, "fromCharCode",
1985                           Builtins::kStringFromCharCode, 1, false);
1986 
1987     // Install the String.fromCodePoint function.
1988     SimpleInstallFunction(isolate_, string_fun, "fromCodePoint",
1989                           Builtins::kStringFromCodePoint, 1, false);
1990 
1991     // Install the String.raw function.
1992     SimpleInstallFunction(isolate_, string_fun, "raw", Builtins::kStringRaw, 1,
1993                           false);
1994 
1995     // Create the %StringPrototype%
1996     Handle<JSValue> prototype =
1997         Handle<JSValue>::cast(factory->NewJSObject(string_fun, TENURED));
1998     prototype->set_value(ReadOnlyRoots(isolate_).empty_string());
1999     JSFunction::SetPrototype(string_fun, prototype);
2000     native_context()->set_initial_string_prototype(*prototype);
2001 
2002     // Install the "constructor" property on the {prototype}.
2003     JSObject::AddProperty(isolate_, prototype, factory->constructor_string(),
2004                           string_fun, DONT_ENUM);
2005 
2006     // Install the String.prototype methods.
2007     SimpleInstallFunction(isolate_, prototype, "anchor",
2008                           Builtins::kStringPrototypeAnchor, 1, true);
2009     SimpleInstallFunction(isolate_, prototype, "big",
2010                           Builtins::kStringPrototypeBig, 0, true);
2011     SimpleInstallFunction(isolate_, prototype, "blink",
2012                           Builtins::kStringPrototypeBlink, 0, true);
2013     SimpleInstallFunction(isolate_, prototype, "bold",
2014                           Builtins::kStringPrototypeBold, 0, true);
2015     SimpleInstallFunction(isolate_, prototype, "charAt",
2016                           Builtins::kStringPrototypeCharAt, 1, true);
2017     SimpleInstallFunction(isolate_, prototype, "charCodeAt",
2018                           Builtins::kStringPrototypeCharCodeAt, 1, true);
2019     SimpleInstallFunction(isolate_, prototype, "codePointAt",
2020                           Builtins::kStringPrototypeCodePointAt, 1, true);
2021     SimpleInstallFunction(isolate_, prototype, "concat",
2022                           Builtins::kStringPrototypeConcat, 1, false);
2023     SimpleInstallFunction(isolate_, prototype, "endsWith",
2024                           Builtins::kStringPrototypeEndsWith, 1, false);
2025     SimpleInstallFunction(isolate_, prototype, "fontcolor",
2026                           Builtins::kStringPrototypeFontcolor, 1, true);
2027     SimpleInstallFunction(isolate_, prototype, "fontsize",
2028                           Builtins::kStringPrototypeFontsize, 1, true);
2029     SimpleInstallFunction(isolate_, prototype, "fixed",
2030                           Builtins::kStringPrototypeFixed, 0, true);
2031     SimpleInstallFunction(isolate_, prototype, "includes",
2032                           Builtins::kStringPrototypeIncludes, 1, false);
2033     SimpleInstallFunction(isolate_, prototype, "indexOf",
2034                           Builtins::kStringPrototypeIndexOf, 1, false);
2035     SimpleInstallFunction(isolate_, prototype, "italics",
2036                           Builtins::kStringPrototypeItalics, 0, true);
2037     SimpleInstallFunction(isolate_, prototype, "lastIndexOf",
2038                           Builtins::kStringPrototypeLastIndexOf, 1, false);
2039     SimpleInstallFunction(isolate_, prototype, "link",
2040                           Builtins::kStringPrototypeLink, 1, true);
2041 #ifdef V8_INTL_SUPPORT
2042     SimpleInstallFunction(isolate_, prototype, "localeCompare",
2043                           Builtins::kStringPrototypeLocaleCompare, 1, false);
2044 #else
2045     SimpleInstallFunction(isolate_, prototype, "localeCompare",
2046                           Builtins::kStringPrototypeLocaleCompare, 1, true);
2047 #endif  // V8_INTL_SUPPORT
2048     SimpleInstallFunction(isolate_, prototype, "match",
2049                           Builtins::kStringPrototypeMatch, 1, true);
2050 #ifdef V8_INTL_SUPPORT
2051     SimpleInstallFunction(isolate_, prototype, "normalize",
2052                           Builtins::kStringPrototypeNormalizeIntl, 0, false);
2053 #else
2054     SimpleInstallFunction(isolate_, prototype, "normalize",
2055                           Builtins::kStringPrototypeNormalize, 0, false);
2056 #endif  // V8_INTL_SUPPORT
2057     SimpleInstallFunction(isolate_, prototype, "padEnd",
2058                           Builtins::kStringPrototypePadEnd, 1, false);
2059     SimpleInstallFunction(isolate_, prototype, "padStart",
2060                           Builtins::kStringPrototypePadStart, 1, false);
2061     SimpleInstallFunction(isolate_, prototype, "repeat",
2062                           Builtins::kStringPrototypeRepeat, 1, true);
2063     SimpleInstallFunction(isolate_, prototype, "replace",
2064                           Builtins::kStringPrototypeReplace, 2, true);
2065     SimpleInstallFunction(isolate_, prototype, "search",
2066                           Builtins::kStringPrototypeSearch, 1, true);
2067     SimpleInstallFunction(isolate_, prototype, "slice",
2068                           Builtins::kStringPrototypeSlice, 2, false);
2069     SimpleInstallFunction(isolate_, prototype, "small",
2070                           Builtins::kStringPrototypeSmall, 0, true);
2071     SimpleInstallFunction(isolate_, prototype, "split",
2072                           Builtins::kStringPrototypeSplit, 2, false);
2073     SimpleInstallFunction(isolate_, prototype, "strike",
2074                           Builtins::kStringPrototypeStrike, 0, true);
2075     SimpleInstallFunction(isolate_, prototype, "sub",
2076                           Builtins::kStringPrototypeSub, 0, true);
2077     SimpleInstallFunction(isolate_, prototype, "substr",
2078                           Builtins::kStringPrototypeSubstr, 2, false);
2079     SimpleInstallFunction(isolate_, prototype, "substring",
2080                           Builtins::kStringPrototypeSubstring, 2, false);
2081     SimpleInstallFunction(isolate_, prototype, "sup",
2082                           Builtins::kStringPrototypeSup, 0, true);
2083     SimpleInstallFunction(isolate_, prototype, "startsWith",
2084                           Builtins::kStringPrototypeStartsWith, 1, false);
2085     SimpleInstallFunction(isolate_, prototype, "toString",
2086                           Builtins::kStringPrototypeToString, 0, true);
2087     SimpleInstallFunction(isolate_, prototype, "trim",
2088                           Builtins::kStringPrototypeTrim, 0, false);
2089     SimpleInstallFunction(isolate_, prototype, "trimLeft",
2090                           Builtins::kStringPrototypeTrimStart, 0, false);
2091     SimpleInstallFunction(isolate_, prototype, "trimRight",
2092                           Builtins::kStringPrototypeTrimEnd, 0, false);
2093     SimpleInstallFunction(isolate_, prototype, "toLocaleLowerCase",
2094                           Builtins::kStringPrototypeToLocaleLowerCase, 0,
2095                           false);
2096     SimpleInstallFunction(isolate_, prototype, "toLocaleUpperCase",
2097                           Builtins::kStringPrototypeToLocaleUpperCase, 0,
2098                           false);
2099 #ifdef V8_INTL_SUPPORT
2100     SimpleInstallFunction(isolate_, prototype, "toLowerCase",
2101                           Builtins::kStringPrototypeToLowerCaseIntl, 0, true);
2102     SimpleInstallFunction(isolate_, prototype, "toUpperCase",
2103                           Builtins::kStringPrototypeToUpperCaseIntl, 0, false);
2104 #else
2105     SimpleInstallFunction(isolate_, prototype, "toLowerCase",
2106                           Builtins::kStringPrototypeToLowerCase, 0, false);
2107     SimpleInstallFunction(isolate_, prototype, "toUpperCase",
2108                           Builtins::kStringPrototypeToUpperCase, 0, false);
2109 #endif
2110     SimpleInstallFunction(isolate_, prototype, "valueOf",
2111                           Builtins::kStringPrototypeValueOf, 0, true);
2112 
2113     SimpleInstallFunction(isolate_, prototype, factory->iterator_symbol(),
2114                           "[Symbol.iterator]",
2115                           Builtins::kStringPrototypeIterator, 0, true,
2116                           DONT_ENUM, BuiltinFunctionId::kStringIterator);
2117   }
2118 
2119   {  // --- S t r i n g I t e r a t o r ---
2120     Handle<JSObject> iterator_prototype(
2121         native_context()->initial_iterator_prototype(), isolate());
2122 
2123     Handle<JSObject> string_iterator_prototype =
2124         factory->NewJSObject(isolate_->object_function(), TENURED);
2125     JSObject::ForceSetPrototype(string_iterator_prototype, iterator_prototype);
2126 
2127     JSObject::AddProperty(
2128         isolate_, string_iterator_prototype, factory->to_string_tag_symbol(),
2129         factory->NewStringFromAsciiChecked("String Iterator"),
2130         static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
2131 
2132     SimpleInstallFunction(isolate_, string_iterator_prototype, "next",
2133                           Builtins::kStringIteratorPrototypeNext, 0, true,
2134                           BuiltinFunctionId::kStringIteratorNext);
2135 
2136     Handle<JSFunction> string_iterator_function = CreateFunction(
2137         isolate_, factory->NewStringFromAsciiChecked("StringIterator"),
2138         JS_STRING_ITERATOR_TYPE, JSStringIterator::kSize, 0,
2139         string_iterator_prototype, Builtins::kIllegal);
2140     string_iterator_function->shared()->set_native(false);
2141     native_context()->set_string_iterator_map(
2142         string_iterator_function->initial_map());
2143   }
2144 
2145   {  // --- S y m b o l ---
2146     Handle<JSFunction> symbol_fun = InstallFunction(
2147         isolate_, global, "Symbol", JS_VALUE_TYPE, JSValue::kSize, 0,
2148         factory->the_hole_value(), Builtins::kSymbolConstructor);
2149     symbol_fun->shared()->set_builtin_function_id(
2150         BuiltinFunctionId::kSymbolConstructor);
2151     symbol_fun->shared()->set_length(0);
2152     symbol_fun->shared()->DontAdaptArguments();
2153     native_context()->set_symbol_function(*symbol_fun);
2154 
2155     // Install the Symbol.for and Symbol.keyFor functions.
2156     SimpleInstallFunction(isolate_, symbol_fun, "for", Builtins::kSymbolFor, 1,
2157                           false);
2158     SimpleInstallFunction(isolate_, symbol_fun, "keyFor",
2159                           Builtins::kSymbolKeyFor, 1, false);
2160 
2161     // Install well-known symbols.
2162     InstallConstant(isolate_, symbol_fun, "asyncIterator",
2163                     factory->async_iterator_symbol());
2164     InstallConstant(isolate_, symbol_fun, "hasInstance",
2165                     factory->has_instance_symbol());
2166     InstallConstant(isolate_, symbol_fun, "isConcatSpreadable",
2167                     factory->is_concat_spreadable_symbol());
2168     InstallConstant(isolate_, symbol_fun, "iterator",
2169                     factory->iterator_symbol());
2170     InstallConstant(isolate_, symbol_fun, "match", factory->match_symbol());
2171     InstallConstant(isolate_, symbol_fun, "replace", factory->replace_symbol());
2172     InstallConstant(isolate_, symbol_fun, "search", factory->search_symbol());
2173     InstallConstant(isolate_, symbol_fun, "species", factory->species_symbol());
2174     InstallConstant(isolate_, symbol_fun, "split", factory->split_symbol());
2175     InstallConstant(isolate_, symbol_fun, "toPrimitive",
2176                     factory->to_primitive_symbol());
2177     InstallConstant(isolate_, symbol_fun, "toStringTag",
2178                     factory->to_string_tag_symbol());
2179     InstallConstant(isolate_, symbol_fun, "unscopables",
2180                     factory->unscopables_symbol());
2181 
2182     // Setup %SymbolPrototype%.
2183     Handle<JSObject> prototype(JSObject::cast(symbol_fun->instance_prototype()),
2184                                isolate());
2185 
2186     // Install the @@toStringTag property on the {prototype}.
2187     JSObject::AddProperty(
2188         isolate_, prototype, factory->to_string_tag_symbol(),
2189         factory->NewStringFromAsciiChecked("Symbol"),
2190         static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
2191 
2192     // Install the Symbol.prototype methods.
2193     SimpleInstallFunction(isolate_, prototype, "toString",
2194                           Builtins::kSymbolPrototypeToString, 0, true);
2195     SimpleInstallFunction(isolate_, prototype, "valueOf",
2196                           Builtins::kSymbolPrototypeValueOf, 0, true);
2197 
2198     // Install the @@toPrimitive function.
2199     Handle<JSFunction> to_primitive = InstallFunction(
2200         isolate_, prototype, factory->to_primitive_symbol(), JS_OBJECT_TYPE,
2201         JSObject::kHeaderSize, 0, MaybeHandle<JSObject>(),
2202         Builtins::kSymbolPrototypeToPrimitive,
2203         static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
2204 
2205     // Set the expected parameters for @@toPrimitive to 1; required by builtin.
2206     to_primitive->shared()->set_internal_formal_parameter_count(1);
2207 
2208     // Set the length for the function to satisfy ECMA-262.
2209     to_primitive->shared()->set_length(1);
2210   }
2211 
2212   {  // --- D a t e ---
2213     Handle<JSFunction> date_fun = InstallFunction(
2214         isolate_, global, "Date", JS_DATE_TYPE, JSDate::kSize, 0,
2215         factory->the_hole_value(), Builtins::kDateConstructor);
2216     InstallWithIntrinsicDefaultProto(isolate_, date_fun,
2217                                      Context::DATE_FUNCTION_INDEX);
2218     date_fun->shared()->set_length(7);
2219     date_fun->shared()->DontAdaptArguments();
2220 
2221     // Install the Date.now, Date.parse and Date.UTC functions.
2222     SimpleInstallFunction(isolate_, date_fun, "now", Builtins::kDateNow, 0,
2223                           false);
2224     SimpleInstallFunction(isolate_, date_fun, "parse", Builtins::kDateParse, 1,
2225                           false);
2226     SimpleInstallFunction(isolate_, date_fun, "UTC", Builtins::kDateUTC, 7,
2227                           false);
2228 
2229     // Setup %DatePrototype%.
2230     Handle<JSObject> prototype(JSObject::cast(date_fun->instance_prototype()),
2231                                isolate());
2232 
2233     // Install the Date.prototype methods.
2234     SimpleInstallFunction(isolate_, prototype, "toString",
2235                           Builtins::kDatePrototypeToString, 0, false);
2236     SimpleInstallFunction(isolate_, prototype, "toDateString",
2237                           Builtins::kDatePrototypeToDateString, 0, false);
2238     SimpleInstallFunction(isolate_, prototype, "toTimeString",
2239                           Builtins::kDatePrototypeToTimeString, 0, false);
2240     SimpleInstallFunction(isolate_, prototype, "toISOString",
2241                           Builtins::kDatePrototypeToISOString, 0, false);
2242     Handle<JSFunction> to_utc_string =
2243         SimpleInstallFunction(isolate_, prototype, "toUTCString",
2244                               Builtins::kDatePrototypeToUTCString, 0, false);
2245     InstallFunction(isolate_, prototype, to_utc_string,
2246                     factory->InternalizeUtf8String("toGMTString"), DONT_ENUM);
2247     SimpleInstallFunction(isolate_, prototype, "getDate",
2248                           Builtins::kDatePrototypeGetDate, 0, true);
2249     SimpleInstallFunction(isolate_, prototype, "setDate",
2250                           Builtins::kDatePrototypeSetDate, 1, false);
2251     SimpleInstallFunction(isolate_, prototype, "getDay",
2252                           Builtins::kDatePrototypeGetDay, 0, true);
2253     SimpleInstallFunction(isolate_, prototype, "getFullYear",
2254                           Builtins::kDatePrototypeGetFullYear, 0, true);
2255     SimpleInstallFunction(isolate_, prototype, "setFullYear",
2256                           Builtins::kDatePrototypeSetFullYear, 3, false);
2257     SimpleInstallFunction(isolate_, prototype, "getHours",
2258                           Builtins::kDatePrototypeGetHours, 0, true);
2259     SimpleInstallFunction(isolate_, prototype, "setHours",
2260                           Builtins::kDatePrototypeSetHours, 4, false);
2261     SimpleInstallFunction(isolate_, prototype, "getMilliseconds",
2262                           Builtins::kDatePrototypeGetMilliseconds, 0, true);
2263     SimpleInstallFunction(isolate_, prototype, "setMilliseconds",
2264                           Builtins::kDatePrototypeSetMilliseconds, 1, false);
2265     SimpleInstallFunction(isolate_, prototype, "getMinutes",
2266                           Builtins::kDatePrototypeGetMinutes, 0, true);
2267     SimpleInstallFunction(isolate_, prototype, "setMinutes",
2268                           Builtins::kDatePrototypeSetMinutes, 3, false);
2269     SimpleInstallFunction(isolate_, prototype, "getMonth",
2270                           Builtins::kDatePrototypeGetMonth, 0, true);
2271     SimpleInstallFunction(isolate_, prototype, "setMonth",
2272                           Builtins::kDatePrototypeSetMonth, 2, false);
2273     SimpleInstallFunction(isolate_, prototype, "getSeconds",
2274                           Builtins::kDatePrototypeGetSeconds, 0, true);
2275     SimpleInstallFunction(isolate_, prototype, "setSeconds",
2276                           Builtins::kDatePrototypeSetSeconds, 2, false);
2277     SimpleInstallFunction(isolate_, prototype, "getTime",
2278                           Builtins::kDatePrototypeGetTime, 0, true);
2279     SimpleInstallFunction(isolate_, prototype, "setTime",
2280                           Builtins::kDatePrototypeSetTime, 1, false);
2281     SimpleInstallFunction(isolate_, prototype, "getTimezoneOffset",
2282                           Builtins::kDatePrototypeGetTimezoneOffset, 0, true);
2283     SimpleInstallFunction(isolate_, prototype, "getUTCDate",
2284                           Builtins::kDatePrototypeGetUTCDate, 0, true);
2285     SimpleInstallFunction(isolate_, prototype, "setUTCDate",
2286                           Builtins::kDatePrototypeSetUTCDate, 1, false);
2287     SimpleInstallFunction(isolate_, prototype, "getUTCDay",
2288                           Builtins::kDatePrototypeGetUTCDay, 0, true);
2289     SimpleInstallFunction(isolate_, prototype, "getUTCFullYear",
2290                           Builtins::kDatePrototypeGetUTCFullYear, 0, true);
2291     SimpleInstallFunction(isolate_, prototype, "setUTCFullYear",
2292                           Builtins::kDatePrototypeSetUTCFullYear, 3, false);
2293     SimpleInstallFunction(isolate_, prototype, "getUTCHours",
2294                           Builtins::kDatePrototypeGetUTCHours, 0, true);
2295     SimpleInstallFunction(isolate_, prototype, "setUTCHours",
2296                           Builtins::kDatePrototypeSetUTCHours, 4, false);
2297     SimpleInstallFunction(isolate_, prototype, "getUTCMilliseconds",
2298                           Builtins::kDatePrototypeGetUTCMilliseconds, 0, true);
2299     SimpleInstallFunction(isolate_, prototype, "setUTCMilliseconds",
2300                           Builtins::kDatePrototypeSetUTCMilliseconds, 1, false);
2301     SimpleInstallFunction(isolate_, prototype, "getUTCMinutes",
2302                           Builtins::kDatePrototypeGetUTCMinutes, 0, true);
2303     SimpleInstallFunction(isolate_, prototype, "setUTCMinutes",
2304                           Builtins::kDatePrototypeSetUTCMinutes, 3, false);
2305     SimpleInstallFunction(isolate_, prototype, "getUTCMonth",
2306                           Builtins::kDatePrototypeGetUTCMonth, 0, true);
2307     SimpleInstallFunction(isolate_, prototype, "setUTCMonth",
2308                           Builtins::kDatePrototypeSetUTCMonth, 2, false);
2309     SimpleInstallFunction(isolate_, prototype, "getUTCSeconds",
2310                           Builtins::kDatePrototypeGetUTCSeconds, 0, true);
2311     SimpleInstallFunction(isolate_, prototype, "setUTCSeconds",
2312                           Builtins::kDatePrototypeSetUTCSeconds, 2, false);
2313     SimpleInstallFunction(isolate_, prototype, "valueOf",
2314                           Builtins::kDatePrototypeValueOf, 0, true);
2315     SimpleInstallFunction(isolate_, prototype, "getYear",
2316                           Builtins::kDatePrototypeGetYear, 0, true);
2317     SimpleInstallFunction(isolate_, prototype, "setYear",
2318                           Builtins::kDatePrototypeSetYear, 1, false);
2319     SimpleInstallFunction(isolate_, prototype, "toJSON",
2320                           Builtins::kDatePrototypeToJson, 1, false);
2321 
2322     // Install Intl fallback functions.
2323     SimpleInstallFunction(isolate_, prototype, "toLocaleString",
2324                           Builtins::kDatePrototypeToString, 0, false);
2325     SimpleInstallFunction(isolate_, prototype, "toLocaleDateString",
2326                           Builtins::kDatePrototypeToDateString, 0, false);
2327     SimpleInstallFunction(isolate_, prototype, "toLocaleTimeString",
2328                           Builtins::kDatePrototypeToTimeString, 0, false);
2329 
2330     // Install the @@toPrimitive function.
2331     Handle<JSFunction> to_primitive = InstallFunction(
2332         isolate_, prototype, factory->to_primitive_symbol(), JS_OBJECT_TYPE,
2333         JSObject::kHeaderSize, 0, MaybeHandle<JSObject>(),
2334         Builtins::kDatePrototypeToPrimitive,
2335         static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
2336 
2337     // Set the expected parameters for @@toPrimitive to 1; required by builtin.
2338     to_primitive->shared()->set_internal_formal_parameter_count(1);
2339 
2340     // Set the length for the function to satisfy ECMA-262.
2341     to_primitive->shared()->set_length(1);
2342   }
2343 
2344   {
2345     Handle<SharedFunctionInfo> info = SimpleCreateBuiltinSharedFunctionInfo(
2346         isolate_, Builtins::kPromiseGetCapabilitiesExecutor,
2347         factory->empty_string(), 2);
2348     native_context()->set_promise_get_capabilities_executor_shared_fun(*info);
2349   }
2350 
2351   {  // -- P r o m i s e
2352     Handle<JSFunction> promise_fun = InstallFunction(
2353         isolate_, global, "Promise", JS_PROMISE_TYPE,
2354         JSPromise::kSizeWithEmbedderFields, 0, factory->the_hole_value(),
2355         Builtins::kPromiseConstructor);
2356     InstallWithIntrinsicDefaultProto(isolate_, promise_fun,
2357                                      Context::PROMISE_FUNCTION_INDEX);
2358 
2359     Handle<SharedFunctionInfo> shared(promise_fun->shared(), isolate_);
2360     shared->set_internal_formal_parameter_count(1);
2361     shared->set_length(1);
2362 
2363     InstallSpeciesGetter(isolate_, promise_fun);
2364 
2365     SimpleInstallFunction(isolate_, promise_fun, "all", Builtins::kPromiseAll,
2366                           1, true);
2367 
2368     SimpleInstallFunction(isolate_, promise_fun, "race", Builtins::kPromiseRace,
2369                           1, true);
2370 
2371     SimpleInstallFunction(isolate_, promise_fun, "resolve",
2372                           Builtins::kPromiseResolveTrampoline, 1, true);
2373 
2374     SimpleInstallFunction(isolate_, promise_fun, "reject",
2375                           Builtins::kPromiseReject, 1, true);
2376 
2377     // Setup %PromisePrototype%.
2378     Handle<JSObject> prototype(
2379         JSObject::cast(promise_fun->instance_prototype()), isolate());
2380     native_context()->set_promise_prototype(*prototype);
2381 
2382     // Install the @@toStringTag property on the {prototype}.
2383     JSObject::AddProperty(
2384         isolate_, prototype, factory->to_string_tag_symbol(),
2385         factory->Promise_string(),
2386         static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
2387 
2388     Handle<JSFunction> promise_then = SimpleInstallFunction(
2389         isolate_, prototype, isolate_->factory()->then_string(),
2390         Builtins::kPromisePrototypeThen, 2, true);
2391     native_context()->set_promise_then(*promise_then);
2392 
2393     Handle<JSFunction> promise_catch =
2394         SimpleInstallFunction(isolate_, prototype, "catch",
2395                               Builtins::kPromisePrototypeCatch, 1, true);
2396     native_context()->set_promise_catch(*promise_catch);
2397 
2398     SimpleInstallFunction(isolate_, prototype, "finally",
2399                           Builtins::kPromisePrototypeFinally, 1, true,
2400                           DONT_ENUM);
2401 
2402     {
2403       Handle<SharedFunctionInfo> info = SimpleCreateSharedFunctionInfo(
2404           isolate(), Builtins::kPromiseThenFinally,
2405           isolate_->factory()->empty_string(), 1);
2406       info->set_native(true);
2407       native_context()->set_promise_then_finally_shared_fun(*info);
2408     }
2409 
2410     {
2411       Handle<SharedFunctionInfo> info = SimpleCreateSharedFunctionInfo(
2412           isolate(), Builtins::kPromiseCatchFinally,
2413           isolate_->factory()->empty_string(), 1);
2414       info->set_native(true);
2415       native_context()->set_promise_catch_finally_shared_fun(*info);
2416     }
2417 
2418     {
2419       Handle<SharedFunctionInfo> info = SimpleCreateSharedFunctionInfo(
2420           isolate(), Builtins::kPromiseValueThunkFinally,
2421           isolate_->factory()->empty_string(), 0);
2422       native_context()->set_promise_value_thunk_finally_shared_fun(*info);
2423     }
2424 
2425     {
2426       Handle<SharedFunctionInfo> info = SimpleCreateSharedFunctionInfo(
2427           isolate(), Builtins::kPromiseThrowerFinally,
2428           isolate_->factory()->empty_string(), 0);
2429       native_context()->set_promise_thrower_finally_shared_fun(*info);
2430     }
2431 
2432     // Force the Promise constructor to fast properties, so that we can use the
2433     // fast paths for various things like
2434     //
2435     //   x instanceof Promise
2436     //
2437     // etc. We should probably come up with a more principled approach once
2438     // the JavaScript builtins are gone.
2439     JSObject::MigrateSlowToFast(Handle<JSObject>::cast(promise_fun), 0,
2440                                 "Bootstrapping");
2441 
2442     Handle<Map> prototype_map(prototype->map(), isolate());
2443     Map::SetShouldBeFastPrototypeMap(prototype_map, true, isolate_);
2444 
2445     {  // Internal: IsPromise
2446       Handle<JSFunction> function = SimpleCreateFunction(
2447           isolate_, factory->empty_string(), Builtins::kIsPromise, 1, false);
2448       native_context()->set_is_promise(*function);
2449     }
2450 
2451     {
2452       Handle<SharedFunctionInfo> info = SimpleCreateSharedFunctionInfo(
2453           isolate_, Builtins::kPromiseCapabilityDefaultResolve,
2454           factory->empty_string(), 1, FunctionKind::kConciseMethod);
2455       info->set_native(true);
2456       info->set_function_map_index(
2457           Context::STRICT_FUNCTION_WITHOUT_PROTOTYPE_MAP_INDEX);
2458       native_context()->set_promise_capability_default_resolve_shared_fun(
2459           *info);
2460 
2461       info = SimpleCreateSharedFunctionInfo(
2462           isolate_, Builtins::kPromiseCapabilityDefaultReject,
2463           factory->empty_string(), 1, FunctionKind::kConciseMethod);
2464       info->set_native(true);
2465       info->set_function_map_index(
2466           Context::STRICT_FUNCTION_WITHOUT_PROTOTYPE_MAP_INDEX);
2467       native_context()->set_promise_capability_default_reject_shared_fun(*info);
2468     }
2469 
2470     {
2471       Handle<SharedFunctionInfo> info = SimpleCreateSharedFunctionInfo(
2472           isolate_, Builtins::kPromiseAllResolveElementClosure,
2473           factory->empty_string(), 1);
2474       native_context()->set_promise_all_resolve_element_shared_fun(*info);
2475     }
2476 
2477     // Force the Promise constructor to fast properties, so that we can use the
2478     // fast paths for various things like
2479     //
2480     //   x instanceof Promise
2481     //
2482     // etc. We should probably come up with a more principled approach once
2483     // the JavaScript builtins are gone.
2484     JSObject::MigrateSlowToFast(promise_fun, 0, "Bootstrapping");
2485   }
2486 
2487   {  // -- R e g E x p
2488     // Builtin functions for RegExp.prototype.
2489     Handle<JSFunction> regexp_fun = InstallFunction(
2490         isolate_, global, "RegExp", JS_REGEXP_TYPE,
2491         JSRegExp::kSize + JSRegExp::kInObjectFieldCount * kPointerSize,
2492         JSRegExp::kInObjectFieldCount, factory->the_hole_value(),
2493         Builtins::kRegExpConstructor);
2494     InstallWithIntrinsicDefaultProto(isolate_, regexp_fun,
2495                                      Context::REGEXP_FUNCTION_INDEX);
2496 
2497     Handle<SharedFunctionInfo> shared(regexp_fun->shared(), isolate_);
2498     shared->set_internal_formal_parameter_count(2);
2499     shared->set_length(2);
2500 
2501     {
2502       // Setup %RegExpPrototype%.
2503       Handle<JSObject> prototype(
2504           JSObject::cast(regexp_fun->instance_prototype()), isolate());
2505 
2506       {
2507         Handle<JSFunction> fun = SimpleInstallFunction(
2508             isolate_, prototype, factory->exec_string(),
2509             Builtins::kRegExpPrototypeExec, 1, true, DONT_ENUM);
2510         native_context()->set_regexp_exec_function(*fun);
2511       }
2512 
2513       SimpleInstallGetter(isolate_, prototype, factory->dotAll_string(),
2514                           Builtins::kRegExpPrototypeDotAllGetter, true);
2515       SimpleInstallGetter(isolate_, prototype, factory->flags_string(),
2516                           Builtins::kRegExpPrototypeFlagsGetter, true);
2517       SimpleInstallGetter(isolate_, prototype, factory->global_string(),
2518                           Builtins::kRegExpPrototypeGlobalGetter, true);
2519       SimpleInstallGetter(isolate_, prototype, factory->ignoreCase_string(),
2520                           Builtins::kRegExpPrototypeIgnoreCaseGetter, true);
2521       SimpleInstallGetter(isolate_, prototype, factory->multiline_string(),
2522                           Builtins::kRegExpPrototypeMultilineGetter, true);
2523       SimpleInstallGetter(isolate_, prototype, factory->source_string(),
2524                           Builtins::kRegExpPrototypeSourceGetter, true);
2525       SimpleInstallGetter(isolate_, prototype, factory->sticky_string(),
2526                           Builtins::kRegExpPrototypeStickyGetter, true);
2527       SimpleInstallGetter(isolate_, prototype, factory->unicode_string(),
2528                           Builtins::kRegExpPrototypeUnicodeGetter, true);
2529 
2530       SimpleInstallFunction(isolate_, prototype, "compile",
2531                             Builtins::kRegExpPrototypeCompile, 2, true,
2532                             DONT_ENUM);
2533       SimpleInstallFunction(isolate_, prototype, factory->toString_string(),
2534                             Builtins::kRegExpPrototypeToString, 0, false,
2535                             DONT_ENUM);
2536       SimpleInstallFunction(isolate_, prototype, "test",
2537                             Builtins::kRegExpPrototypeTest, 1, true, DONT_ENUM);
2538 
2539       SimpleInstallFunction(isolate_, prototype, factory->match_symbol(),
2540                             "[Symbol.match]", Builtins::kRegExpPrototypeMatch,
2541                             1, true);
2542 
2543       SimpleInstallFunction(isolate_, prototype, factory->replace_symbol(),
2544                             "[Symbol.replace]",
2545                             Builtins::kRegExpPrototypeReplace, 2, false);
2546 
2547       SimpleInstallFunction(isolate_, prototype, factory->search_symbol(),
2548                             "[Symbol.search]", Builtins::kRegExpPrototypeSearch,
2549                             1, true);
2550 
2551       SimpleInstallFunction(isolate_, prototype, factory->split_symbol(),
2552                             "[Symbol.split]", Builtins::kRegExpPrototypeSplit,
2553                             2, false);
2554 
2555       Handle<Map> prototype_map(prototype->map(), isolate());
2556       Map::SetShouldBeFastPrototypeMap(prototype_map, true, isolate_);
2557 
2558       // Store the initial RegExp.prototype map. This is used in fast-path
2559       // checks. Do not alter the prototype after this point.
2560       native_context()->set_regexp_prototype_map(*prototype_map);
2561     }
2562 
2563     {
2564       // RegExp getters and setters.
2565 
2566       InstallSpeciesGetter(isolate_, regexp_fun);
2567 
2568       // Static properties set by a successful match.
2569 
2570       const PropertyAttributes no_enum = DONT_ENUM;
2571       SimpleInstallGetterSetter(isolate_, regexp_fun, factory->input_string(),
2572                                 Builtins::kRegExpInputGetter,
2573                                 Builtins::kRegExpInputSetter, no_enum);
2574       SimpleInstallGetterSetter(
2575           isolate_, regexp_fun, factory->InternalizeUtf8String("$_"),
2576           Builtins::kRegExpInputGetter, Builtins::kRegExpInputSetter, no_enum);
2577 
2578       SimpleInstallGetterSetter(
2579           isolate_, regexp_fun, factory->InternalizeUtf8String("lastMatch"),
2580           Builtins::kRegExpLastMatchGetter, Builtins::kEmptyFunction, no_enum);
2581       SimpleInstallGetterSetter(
2582           isolate_, regexp_fun, factory->InternalizeUtf8String("$&"),
2583           Builtins::kRegExpLastMatchGetter, Builtins::kEmptyFunction, no_enum);
2584 
2585       SimpleInstallGetterSetter(
2586           isolate_, regexp_fun, factory->InternalizeUtf8String("lastParen"),
2587           Builtins::kRegExpLastParenGetter, Builtins::kEmptyFunction, no_enum);
2588       SimpleInstallGetterSetter(
2589           isolate_, regexp_fun, factory->InternalizeUtf8String("$+"),
2590           Builtins::kRegExpLastParenGetter, Builtins::kEmptyFunction, no_enum);
2591 
2592       SimpleInstallGetterSetter(isolate_, regexp_fun,
2593                                 factory->InternalizeUtf8String("leftContext"),
2594                                 Builtins::kRegExpLeftContextGetter,
2595                                 Builtins::kEmptyFunction, no_enum);
2596       SimpleInstallGetterSetter(isolate_, regexp_fun,
2597                                 factory->InternalizeUtf8String("$`"),
2598                                 Builtins::kRegExpLeftContextGetter,
2599                                 Builtins::kEmptyFunction, no_enum);
2600 
2601       SimpleInstallGetterSetter(isolate_, regexp_fun,
2602                                 factory->InternalizeUtf8String("rightContext"),
2603                                 Builtins::kRegExpRightContextGetter,
2604                                 Builtins::kEmptyFunction, no_enum);
2605       SimpleInstallGetterSetter(isolate_, regexp_fun,
2606                                 factory->InternalizeUtf8String("$'"),
2607                                 Builtins::kRegExpRightContextGetter,
2608                                 Builtins::kEmptyFunction, no_enum);
2609 
2610 #define INSTALL_CAPTURE_GETTER(i)                                   \
2611   SimpleInstallGetterSetter(                                        \
2612       isolate_, regexp_fun, factory->InternalizeUtf8String("$" #i), \
2613       Builtins::kRegExpCapture##i##Getter, Builtins::kEmptyFunction, no_enum)
2614       INSTALL_CAPTURE_GETTER(1);
2615       INSTALL_CAPTURE_GETTER(2);
2616       INSTALL_CAPTURE_GETTER(3);
2617       INSTALL_CAPTURE_GETTER(4);
2618       INSTALL_CAPTURE_GETTER(5);
2619       INSTALL_CAPTURE_GETTER(6);
2620       INSTALL_CAPTURE_GETTER(7);
2621       INSTALL_CAPTURE_GETTER(8);
2622       INSTALL_CAPTURE_GETTER(9);
2623 #undef INSTALL_CAPTURE_GETTER
2624     }
2625 
2626     DCHECK(regexp_fun->has_initial_map());
2627     Handle<Map> initial_map(regexp_fun->initial_map(), isolate());
2628 
2629     DCHECK_EQ(1, initial_map->GetInObjectProperties());
2630 
2631     Map::EnsureDescriptorSlack(isolate_, initial_map, 1);
2632 
2633     // ECMA-262, section 15.10.7.5.
2634     PropertyAttributes writable =
2635         static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE);
2636     Descriptor d = Descriptor::DataField(isolate(), factory->lastIndex_string(),
2637                                          JSRegExp::kLastIndexFieldIndex,
2638                                          writable, Representation::Tagged());
2639     initial_map->AppendDescriptor(&d);
2640 
2641     {  // Internal: RegExpInternalMatch
2642       Handle<JSFunction> function =
2643           SimpleCreateFunction(isolate_, isolate_->factory()->empty_string(),
2644                                Builtins::kRegExpInternalMatch, 2, true);
2645       native_context()->set(Context::REGEXP_INTERNAL_MATCH, *function);
2646     }
2647 
2648     // Create the last match info. One for external use, and one for internal
2649     // use when we don't want to modify the externally visible match info.
2650     Handle<RegExpMatchInfo> last_match_info = factory->NewRegExpMatchInfo();
2651     native_context()->set_regexp_last_match_info(*last_match_info);
2652     Handle<RegExpMatchInfo> internal_match_info = factory->NewRegExpMatchInfo();
2653     native_context()->set_regexp_internal_match_info(*internal_match_info);
2654 
2655     // Force the RegExp constructor to fast properties, so that we can use the
2656     // fast paths for various things like
2657     //
2658     //   x instanceof RegExp
2659     //
2660     // etc. We should probably come up with a more principled approach once
2661     // the JavaScript builtins are gone.
2662     JSObject::MigrateSlowToFast(regexp_fun, 0, "Bootstrapping");
2663   }
2664 
2665   {  // -- E r r o r
2666     InstallError(isolate_, global, factory->Error_string(),
2667                  Context::ERROR_FUNCTION_INDEX);
2668     InstallMakeError(isolate_, Builtins::kMakeError, Context::MAKE_ERROR_INDEX);
2669   }
2670 
2671   {  // -- E v a l E r r o r
2672     InstallError(isolate_, global, factory->EvalError_string(),
2673                  Context::EVAL_ERROR_FUNCTION_INDEX);
2674   }
2675 
2676   {  // -- R a n g e E r r o r
2677     InstallError(isolate_, global, factory->RangeError_string(),
2678                  Context::RANGE_ERROR_FUNCTION_INDEX);
2679     InstallMakeError(isolate_, Builtins::kMakeRangeError,
2680                      Context::MAKE_RANGE_ERROR_INDEX);
2681   }
2682 
2683   {  // -- R e f e r e n c e E r r o r
2684     InstallError(isolate_, global, factory->ReferenceError_string(),
2685                  Context::REFERENCE_ERROR_FUNCTION_INDEX);
2686   }
2687 
2688   {  // -- S y n t a x E r r o r
2689     InstallError(isolate_, global, factory->SyntaxError_string(),
2690                  Context::SYNTAX_ERROR_FUNCTION_INDEX);
2691     InstallMakeError(isolate_, Builtins::kMakeSyntaxError,
2692                      Context::MAKE_SYNTAX_ERROR_INDEX);
2693   }
2694 
2695   {  // -- T y p e E r r o r
2696     InstallError(isolate_, global, factory->TypeError_string(),
2697                  Context::TYPE_ERROR_FUNCTION_INDEX);
2698     InstallMakeError(isolate_, Builtins::kMakeTypeError,
2699                      Context::MAKE_TYPE_ERROR_INDEX);
2700   }
2701 
2702   {  // -- U R I E r r o r
2703     InstallError(isolate_, global, factory->URIError_string(),
2704                  Context::URI_ERROR_FUNCTION_INDEX);
2705     InstallMakeError(isolate_, Builtins::kMakeURIError,
2706                      Context::MAKE_URI_ERROR_INDEX);
2707   }
2708 
2709   {  // -- C o m p i l e E r r o r
2710     Handle<JSObject> dummy = factory->NewJSObject(isolate_->object_function());
2711     InstallError(isolate_, dummy, factory->CompileError_string(),
2712                  Context::WASM_COMPILE_ERROR_FUNCTION_INDEX);
2713 
2714     // -- L i n k E r r o r
2715     InstallError(isolate_, dummy, factory->LinkError_string(),
2716                  Context::WASM_LINK_ERROR_FUNCTION_INDEX);
2717 
2718     // -- R u n t i m e E r r o r
2719     InstallError(isolate_, dummy, factory->RuntimeError_string(),
2720                  Context::WASM_RUNTIME_ERROR_FUNCTION_INDEX);
2721   }
2722 
2723   // Initialize the embedder data slot.
2724   native_context()->set_embedder_data(*factory->empty_fixed_array());
2725 
2726   {  // -- J S O N
2727     Handle<String> name = factory->InternalizeUtf8String("JSON");
2728     Handle<JSObject> json_object =
2729         factory->NewJSObject(isolate_->object_function(), TENURED);
2730     JSObject::AddProperty(isolate_, global, name, json_object, DONT_ENUM);
2731     SimpleInstallFunction(isolate_, json_object, "parse", Builtins::kJsonParse,
2732                           2, false);
2733     SimpleInstallFunction(isolate_, json_object, "stringify",
2734                           Builtins::kJsonStringify, 3, true);
2735     JSObject::AddProperty(
2736         isolate_, json_object, factory->to_string_tag_symbol(),
2737         factory->NewStringFromAsciiChecked("JSON"),
2738         static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
2739   }
2740 
2741   {  // -- M a t h
2742     Handle<String> name = factory->InternalizeUtf8String("Math");
2743     Handle<JSObject> math =
2744         factory->NewJSObject(isolate_->object_function(), TENURED);
2745     JSObject::AddProperty(isolate_, global, name, math, DONT_ENUM);
2746     SimpleInstallFunction(isolate_, math, "abs", Builtins::kMathAbs, 1, true);
2747     SimpleInstallFunction(isolate_, math, "acos", Builtins::kMathAcos, 1, true);
2748     SimpleInstallFunction(isolate_, math, "acosh", Builtins::kMathAcosh, 1,
2749                           true);
2750     SimpleInstallFunction(isolate_, math, "asin", Builtins::kMathAsin, 1, true);
2751     SimpleInstallFunction(isolate_, math, "asinh", Builtins::kMathAsinh, 1,
2752                           true);
2753     SimpleInstallFunction(isolate_, math, "atan", Builtins::kMathAtan, 1, true);
2754     SimpleInstallFunction(isolate_, math, "atanh", Builtins::kMathAtanh, 1,
2755                           true);
2756     SimpleInstallFunction(isolate_, math, "atan2", Builtins::kMathAtan2, 2,
2757                           true);
2758     SimpleInstallFunction(isolate_, math, "ceil", Builtins::kMathCeil, 1, true);
2759     SimpleInstallFunction(isolate_, math, "cbrt", Builtins::kMathCbrt, 1, true);
2760     SimpleInstallFunction(isolate_, math, "expm1", Builtins::kMathExpm1, 1,
2761                           true);
2762     SimpleInstallFunction(isolate_, math, "clz32", Builtins::kMathClz32, 1,
2763                           true);
2764     SimpleInstallFunction(isolate_, math, "cos", Builtins::kMathCos, 1, true);
2765     SimpleInstallFunction(isolate_, math, "cosh", Builtins::kMathCosh, 1, true);
2766     SimpleInstallFunction(isolate_, math, "exp", Builtins::kMathExp, 1, true);
2767     Handle<JSFunction> math_floor = SimpleInstallFunction(
2768         isolate_, math, "floor", Builtins::kMathFloor, 1, true);
2769     native_context()->set_math_floor(*math_floor);
2770     SimpleInstallFunction(isolate_, math, "fround", Builtins::kMathFround, 1,
2771                           true);
2772     SimpleInstallFunction(isolate_, math, "hypot", Builtins::kMathHypot, 2,
2773                           false);
2774     SimpleInstallFunction(isolate_, math, "imul", Builtins::kMathImul, 2, true);
2775     SimpleInstallFunction(isolate_, math, "log", Builtins::kMathLog, 1, true);
2776     SimpleInstallFunction(isolate_, math, "log1p", Builtins::kMathLog1p, 1,
2777                           true);
2778     SimpleInstallFunction(isolate_, math, "log2", Builtins::kMathLog2, 1, true);
2779     SimpleInstallFunction(isolate_, math, "log10", Builtins::kMathLog10, 1,
2780                           true);
2781     SimpleInstallFunction(isolate_, math, "max", Builtins::kMathMax, 2, false);
2782     SimpleInstallFunction(isolate_, math, "min", Builtins::kMathMin, 2, false);
2783     Handle<JSFunction> math_pow = SimpleInstallFunction(
2784         isolate_, math, "pow", Builtins::kMathPow, 2, true);
2785     native_context()->set_math_pow(*math_pow);
2786     SimpleInstallFunction(isolate_, math, "random", Builtins::kMathRandom, 0,
2787                           true);
2788     SimpleInstallFunction(isolate_, math, "round", Builtins::kMathRound, 1,
2789                           true);
2790     SimpleInstallFunction(isolate_, math, "sign", Builtins::kMathSign, 1, true);
2791     SimpleInstallFunction(isolate_, math, "sin", Builtins::kMathSin, 1, true);
2792     SimpleInstallFunction(isolate_, math, "sinh", Builtins::kMathSinh, 1, true);
2793     SimpleInstallFunction(isolate_, math, "sqrt", Builtins::kMathSqrt, 1, true);
2794     SimpleInstallFunction(isolate_, math, "tan", Builtins::kMathTan, 1, true);
2795     SimpleInstallFunction(isolate_, math, "tanh", Builtins::kMathTanh, 1, true);
2796     SimpleInstallFunction(isolate_, math, "trunc", Builtins::kMathTrunc, 1,
2797                           true);
2798 
2799     // Install math constants.
2800     double const kE = base::ieee754::exp(1.0);
2801     double const kPI = 3.1415926535897932;
2802     InstallConstant(isolate_, math, "E", factory->NewNumber(kE));
2803     InstallConstant(isolate_, math, "LN10",
2804                     factory->NewNumber(base::ieee754::log(10.0)));
2805     InstallConstant(isolate_, math, "LN2",
2806                     factory->NewNumber(base::ieee754::log(2.0)));
2807     InstallConstant(isolate_, math, "LOG10E",
2808                     factory->NewNumber(base::ieee754::log10(kE)));
2809     InstallConstant(isolate_, math, "LOG2E",
2810                     factory->NewNumber(base::ieee754::log2(kE)));
2811     InstallConstant(isolate_, math, "PI", factory->NewNumber(kPI));
2812     InstallConstant(isolate_, math, "SQRT1_2",
2813                     factory->NewNumber(std::sqrt(0.5)));
2814     InstallConstant(isolate_, math, "SQRT2",
2815                     factory->NewNumber(std::sqrt(2.0)));
2816     JSObject::AddProperty(
2817         isolate_, math, factory->to_string_tag_symbol(),
2818         factory->NewStringFromAsciiChecked("Math"),
2819         static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
2820   }
2821 
2822   {  // -- C o n s o l e
2823     Handle<String> name = factory->InternalizeUtf8String("console");
2824     NewFunctionArgs args = NewFunctionArgs::ForFunctionWithoutCode(
2825         name, isolate_->strict_function_map(), LanguageMode::kStrict);
2826     Handle<JSFunction> cons = factory->NewFunction(args);
2827 
2828     Handle<JSObject> empty = factory->NewJSObject(isolate_->object_function());
2829     JSFunction::SetPrototype(cons, empty);
2830 
2831     Handle<JSObject> console = factory->NewJSObject(cons, TENURED);
2832     DCHECK(console->IsJSObject());
2833     JSObject::AddProperty(isolate_, global, name, console, DONT_ENUM);
2834     SimpleInstallFunction(isolate_, console, "debug", Builtins::kConsoleDebug,
2835                           1, false, NONE);
2836     SimpleInstallFunction(isolate_, console, "error", Builtins::kConsoleError,
2837                           1, false, NONE);
2838     SimpleInstallFunction(isolate_, console, "info", Builtins::kConsoleInfo, 1,
2839                           false, NONE);
2840     SimpleInstallFunction(isolate_, console, "log", Builtins::kConsoleLog, 1,
2841                           false, NONE);
2842     SimpleInstallFunction(isolate_, console, "warn", Builtins::kConsoleWarn, 1,
2843                           false, NONE);
2844     SimpleInstallFunction(isolate_, console, "dir", Builtins::kConsoleDir, 1,
2845                           false, NONE);
2846     SimpleInstallFunction(isolate_, console, "dirxml", Builtins::kConsoleDirXml,
2847                           1, false, NONE);
2848     SimpleInstallFunction(isolate_, console, "table", Builtins::kConsoleTable,
2849                           1, false, NONE);
2850     SimpleInstallFunction(isolate_, console, "trace", Builtins::kConsoleTrace,
2851                           1, false, NONE);
2852     SimpleInstallFunction(isolate_, console, "group", Builtins::kConsoleGroup,
2853                           1, false, NONE);
2854     SimpleInstallFunction(isolate_, console, "groupCollapsed",
2855                           Builtins::kConsoleGroupCollapsed, 1, false, NONE);
2856     SimpleInstallFunction(isolate_, console, "groupEnd",
2857                           Builtins::kConsoleGroupEnd, 1, false, NONE);
2858     SimpleInstallFunction(isolate_, console, "clear", Builtins::kConsoleClear,
2859                           1, false, NONE);
2860     SimpleInstallFunction(isolate_, console, "count", Builtins::kConsoleCount,
2861                           1, false, NONE);
2862     SimpleInstallFunction(isolate_, console, "countReset",
2863                           Builtins::kConsoleCountReset, 1, false, NONE);
2864     SimpleInstallFunction(isolate_, console, "assert",
2865                           Builtins::kFastConsoleAssert, 1, false, NONE);
2866     SimpleInstallFunction(isolate_, console, "profile",
2867                           Builtins::kConsoleProfile, 1, false, NONE);
2868     SimpleInstallFunction(isolate_, console, "profileEnd",
2869                           Builtins::kConsoleProfileEnd, 1, false, NONE);
2870     SimpleInstallFunction(isolate_, console, "time", Builtins::kConsoleTime, 1,
2871                           false, NONE);
2872     SimpleInstallFunction(isolate_, console, "timeEnd",
2873                           Builtins::kConsoleTimeEnd, 1, false, NONE);
2874     SimpleInstallFunction(isolate_, console, "timeStamp",
2875                           Builtins::kConsoleTimeStamp, 1, false, NONE);
2876     SimpleInstallFunction(isolate_, console, "context",
2877                           Builtins::kConsoleContext, 1, true, NONE);
2878     JSObject::AddProperty(
2879         isolate_, console, factory->to_string_tag_symbol(),
2880         factory->NewStringFromAsciiChecked("Object"),
2881         static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
2882   }
2883 
2884 #ifdef V8_INTL_SUPPORT
2885   {  // -- I n t l
2886     Handle<String> name = factory->InternalizeUtf8String("Intl");
2887     Handle<JSObject> intl =
2888         factory->NewJSObject(isolate_->object_function(), TENURED);
2889     JSObject::AddProperty(isolate_, global, name, intl, DONT_ENUM);
2890 
2891     {
2892       Handle<JSFunction> date_time_format_constructor = InstallFunction(
2893           isolate_, intl, "DateTimeFormat", JS_OBJECT_TYPE, DateFormat::kSize,
2894           0, factory->the_hole_value(), Builtins::kIllegal);
2895       native_context()->set_intl_date_time_format_function(
2896           *date_time_format_constructor);
2897 
2898       Handle<JSObject> prototype(
2899           JSObject::cast(date_time_format_constructor->prototype()), isolate_);
2900 
2901       // Install the @@toStringTag property on the {prototype}.
2902       JSObject::AddProperty(
2903           isolate_, prototype, factory->to_string_tag_symbol(),
2904           factory->Object_string(),
2905           static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
2906 
2907       SimpleInstallFunction(isolate_, prototype, "formatToParts",
2908                             Builtins::kDateTimeFormatPrototypeFormatToParts, 1,
2909                             false);
2910 
2911       SimpleInstallGetter(isolate_, prototype,
2912                           factory->InternalizeUtf8String("format"),
2913                           Builtins::kDateTimeFormatPrototypeFormat, false);
2914 
2915       {
2916         Handle<SharedFunctionInfo> info = SimpleCreateBuiltinSharedFunctionInfo(
2917             isolate_, Builtins::kDateTimeFormatInternalFormat,
2918             factory->empty_string(), 1);
2919         native_context()->set_date_format_internal_format_shared_fun(*info);
2920       }
2921     }
2922 
2923     {
2924       Handle<JSFunction> number_format_constructor = InstallFunction(
2925           isolate_, intl, "NumberFormat", JS_OBJECT_TYPE, NumberFormat::kSize,
2926           0, factory->the_hole_value(), Builtins::kIllegal);
2927       native_context()->set_intl_number_format_function(
2928           *number_format_constructor);
2929 
2930       Handle<JSObject> prototype(
2931           JSObject::cast(number_format_constructor->prototype()), isolate_);
2932 
2933       // Install the @@toStringTag property on the {prototype}.
2934       JSObject::AddProperty(
2935           isolate_, prototype, factory->to_string_tag_symbol(),
2936           factory->Object_string(),
2937           static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
2938 
2939       SimpleInstallFunction(isolate_, prototype, "formatToParts",
2940                             Builtins::kNumberFormatPrototypeFormatToParts, 1,
2941                             false);
2942       SimpleInstallGetter(isolate_, prototype,
2943                           factory->InternalizeUtf8String("format"),
2944                           Builtins::kNumberFormatPrototypeFormatNumber, false);
2945 
2946       {
2947         Handle<SharedFunctionInfo> info = SimpleCreateBuiltinSharedFunctionInfo(
2948             isolate_, Builtins::kNumberFormatInternalFormatNumber,
2949             factory->empty_string(), 1);
2950         native_context()->set_number_format_internal_format_number_shared_fun(
2951             *info);
2952       }
2953     }
2954 
2955     {
2956       Handle<JSFunction> collator_constructor = InstallFunction(
2957           isolate_, intl, "Collator", JS_INTL_COLLATOR_TYPE, JSCollator::kSize,
2958           0, factory->the_hole_value(), Builtins::kCollatorConstructor);
2959       collator_constructor->shared()->DontAdaptArguments();
2960       InstallWithIntrinsicDefaultProto(isolate_, collator_constructor,
2961                                        Context::INTL_COLLATOR_FUNCTION_INDEX);
2962 
2963       Handle<JSObject> prototype(
2964           JSObject::cast(collator_constructor->prototype()), isolate_);
2965 
2966       // Install the @@toStringTag property on the {prototype}.
2967       JSObject::AddProperty(
2968           isolate_, prototype, factory->to_string_tag_symbol(),
2969           factory->Object_string(),
2970           static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
2971 
2972       SimpleInstallGetter(isolate_, prototype,
2973                           factory->InternalizeUtf8String("compare"),
2974                           Builtins::kCollatorPrototypeCompare, false);
2975 
2976       {
2977         Handle<SharedFunctionInfo> info = SimpleCreateBuiltinSharedFunctionInfo(
2978             isolate_, Builtins::kCollatorInternalCompare,
2979             factory->empty_string(), 2);
2980         native_context()->set_collator_internal_compare_shared_fun(*info);
2981       }
2982     }
2983 
2984     {
2985       Handle<JSFunction> v8_break_iterator_constructor =
2986           InstallFunction(isolate_, intl, "v8BreakIterator", JS_OBJECT_TYPE,
2987                           V8BreakIterator::kSize, 0, factory->the_hole_value(),
2988                           Builtins::kIllegal);
2989       native_context()->set_intl_v8_break_iterator_function(
2990           *v8_break_iterator_constructor);
2991 
2992       Handle<JSObject> prototype(
2993           JSObject::cast(v8_break_iterator_constructor->prototype()), isolate_);
2994 
2995       // Install the @@toStringTag property on the {prototype}.
2996       JSObject::AddProperty(
2997           isolate_, prototype, factory->to_string_tag_symbol(),
2998           factory->Object_string(),
2999           static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
3000 
3001       SimpleInstallGetter(isolate_, prototype,
3002                           factory->InternalizeUtf8String("adoptText"),
3003                           Builtins::kBreakIteratorPrototypeAdoptText, false);
3004 
3005       {
3006         Handle<SharedFunctionInfo> info = SimpleCreateBuiltinSharedFunctionInfo(
3007             isolate_, Builtins::kBreakIteratorInternalAdoptText,
3008             factory->empty_string(), 1);
3009         native_context()->set_break_iterator_internal_adopt_text_shared_fun(
3010             *info);
3011       }
3012     }
3013 
3014     {
3015       Handle<JSFunction> plural_rules_constructor = InstallFunction(
3016           isolate_, intl, "PluralRules", JS_INTL_PLURAL_RULES_TYPE,
3017           JSPluralRules::kSize, 0, factory->the_hole_value(),
3018           Builtins::kPluralRulesConstructor);
3019       plural_rules_constructor->shared()->DontAdaptArguments();
3020       InstallWithIntrinsicDefaultProto(
3021           isolate_, plural_rules_constructor,
3022           Context::INTL_PLURAL_RULES_FUNCTION_INDEX);
3023 
3024       Handle<JSObject> prototype(
3025           JSObject::cast(plural_rules_constructor->prototype()), isolate_);
3026 
3027       // Install the @@toStringTag property on the {prototype}.
3028       JSObject::AddProperty(
3029           isolate_, prototype, factory->to_string_tag_symbol(),
3030           factory->Object_string(),
3031           static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
3032     }
3033   }
3034 #endif  // V8_INTL_SUPPORT
3035 
3036   {  // -- A r r a y B u f f e r
3037     Handle<String> name = factory->ArrayBuffer_string();
3038     Handle<JSFunction> array_buffer_fun = CreateArrayBuffer(name, ARRAY_BUFFER);
3039     JSObject::AddProperty(isolate_, global, name, array_buffer_fun, DONT_ENUM);
3040     InstallWithIntrinsicDefaultProto(isolate_, array_buffer_fun,
3041                                      Context::ARRAY_BUFFER_FUN_INDEX);
3042     InstallSpeciesGetter(isolate_, array_buffer_fun);
3043 
3044     Handle<JSFunction> array_buffer_noinit_fun = SimpleCreateFunction(
3045         isolate_,
3046         factory->NewStringFromAsciiChecked(
3047             "arrayBufferConstructor_DoNotInitialize"),
3048         Builtins::kArrayBufferConstructor_DoNotInitialize, 1, false);
3049     native_context()->set_array_buffer_noinit_fun(*array_buffer_noinit_fun);
3050   }
3051 
3052   {  // -- S h a r e d A r r a y B u f f e r
3053     Handle<String> name = factory->SharedArrayBuffer_string();
3054     Handle<JSFunction> shared_array_buffer_fun =
3055         CreateArrayBuffer(name, SHARED_ARRAY_BUFFER);
3056     InstallWithIntrinsicDefaultProto(isolate_, shared_array_buffer_fun,
3057                                      Context::SHARED_ARRAY_BUFFER_FUN_INDEX);
3058     InstallSpeciesGetter(isolate_, shared_array_buffer_fun);
3059   }
3060 
3061   {  // -- A t o m i c s
3062     Handle<JSObject> atomics_object =
3063         factory->NewJSObject(isolate_->object_function(), TENURED);
3064     native_context()->set_atomics_object(*atomics_object);
3065 
3066     SimpleInstallFunction(isolate_, atomics_object, "load",
3067                           Builtins::kAtomicsLoad, 2, true);
3068     SimpleInstallFunction(isolate_, atomics_object, "store",
3069                           Builtins::kAtomicsStore, 3, true);
3070     SimpleInstallFunction(isolate_, atomics_object, "add",
3071                           Builtins::kAtomicsAdd, 3, true);
3072     SimpleInstallFunction(isolate_, atomics_object, "sub",
3073                           Builtins::kAtomicsSub, 3, true);
3074     SimpleInstallFunction(isolate_, atomics_object, "and",
3075                           Builtins::kAtomicsAnd, 3, true);
3076     SimpleInstallFunction(isolate_, atomics_object, "or", Builtins::kAtomicsOr,
3077                           3, true);
3078     SimpleInstallFunction(isolate_, atomics_object, "xor",
3079                           Builtins::kAtomicsXor, 3, true);
3080     SimpleInstallFunction(isolate_, atomics_object, "exchange",
3081                           Builtins::kAtomicsExchange, 3, true);
3082     SimpleInstallFunction(isolate_, atomics_object, "compareExchange",
3083                           Builtins::kAtomicsCompareExchange, 4, true);
3084     SimpleInstallFunction(isolate_, atomics_object, "isLockFree",
3085                           Builtins::kAtomicsIsLockFree, 1, true);
3086     SimpleInstallFunction(isolate_, atomics_object, "wait",
3087                           Builtins::kAtomicsWait, 4, true);
3088     SimpleInstallFunction(isolate_, atomics_object, "wake",
3089                           Builtins::kAtomicsWake, 3, true);
3090     SimpleInstallFunction(isolate_, atomics_object, "notify",
3091                           Builtins::kAtomicsWake, 3, true);
3092   }
3093 
3094   {  // -- T y p e d A r r a y
3095     Handle<JSFunction> typed_array_fun = CreateFunction(
3096         isolate_, factory->InternalizeUtf8String("TypedArray"),
3097         JS_TYPED_ARRAY_TYPE, JSTypedArray::kSize, 0, factory->the_hole_value(),
3098         Builtins::kTypedArrayBaseConstructor);
3099     typed_array_fun->shared()->set_native(false);
3100     typed_array_fun->shared()->set_length(0);
3101     InstallSpeciesGetter(isolate_, typed_array_fun);
3102     native_context()->set_typed_array_function(*typed_array_fun);
3103 
3104     SimpleInstallFunction(isolate_, typed_array_fun, "of",
3105                           Builtins::kTypedArrayOf, 0, false);
3106     SimpleInstallFunction(isolate_, typed_array_fun, "from",
3107                           Builtins::kTypedArrayFrom, 1, false);
3108 
3109     // Setup %TypedArrayPrototype%.
3110     Handle<JSObject> prototype(
3111         JSObject::cast(typed_array_fun->instance_prototype()), isolate());
3112     native_context()->set_typed_array_prototype(*prototype);
3113 
3114     // Install the "buffer", "byteOffset", "byteLength", "length"
3115     // and @@toStringTag getters on the {prototype}.
3116     SimpleInstallGetter(isolate_, prototype, factory->buffer_string(),
3117                         Builtins::kTypedArrayPrototypeBuffer, false);
3118     SimpleInstallGetter(isolate_, prototype, factory->byte_length_string(),
3119                         Builtins::kTypedArrayPrototypeByteLength, true,
3120                         BuiltinFunctionId::kTypedArrayByteLength);
3121     SimpleInstallGetter(isolate_, prototype, factory->byte_offset_string(),
3122                         Builtins::kTypedArrayPrototypeByteOffset, true,
3123                         BuiltinFunctionId::kTypedArrayByteOffset);
3124     SimpleInstallGetter(isolate_, prototype, factory->length_string(),
3125                         Builtins::kTypedArrayPrototypeLength, true,
3126                         BuiltinFunctionId::kTypedArrayLength);
3127     SimpleInstallGetter(isolate_, prototype, factory->to_string_tag_symbol(),
3128                         Builtins::kTypedArrayPrototypeToStringTag, true,
3129                         BuiltinFunctionId::kTypedArrayToStringTag);
3130 
3131     // Install "keys", "values" and "entries" methods on the {prototype}.
3132     SimpleInstallFunction(isolate_, prototype, "entries",
3133                           Builtins::kTypedArrayPrototypeEntries, 0, true,
3134                           BuiltinFunctionId::kTypedArrayEntries);
3135 
3136     SimpleInstallFunction(isolate_, prototype, "keys",
3137                           Builtins::kTypedArrayPrototypeKeys, 0, true,
3138                           BuiltinFunctionId::kTypedArrayKeys);
3139 
3140     Handle<JSFunction> values = SimpleInstallFunction(
3141         isolate_, prototype, "values", Builtins::kTypedArrayPrototypeValues, 0,
3142         true, BuiltinFunctionId::kTypedArrayValues);
3143     JSObject::AddProperty(isolate_, prototype, factory->iterator_symbol(),
3144                           values, DONT_ENUM);
3145 
3146     // TODO(caitp): alphasort accessors/methods
3147     SimpleInstallFunction(isolate_, prototype, "copyWithin",
3148                           Builtins::kTypedArrayPrototypeCopyWithin, 2, false);
3149     SimpleInstallFunction(isolate_, prototype, "every",
3150                           Builtins::kTypedArrayPrototypeEvery, 1, false);
3151     SimpleInstallFunction(isolate_, prototype, "fill",
3152                           Builtins::kTypedArrayPrototypeFill, 1, false);
3153     SimpleInstallFunction(isolate_, prototype, "filter",
3154                           Builtins::kTypedArrayPrototypeFilter, 1, false);
3155     SimpleInstallFunction(isolate_, prototype, "find",
3156                           Builtins::kTypedArrayPrototypeFind, 1, false);
3157     SimpleInstallFunction(isolate_, prototype, "findIndex",
3158                           Builtins::kTypedArrayPrototypeFindIndex, 1, false);
3159     SimpleInstallFunction(isolate_, prototype, "forEach",
3160                           Builtins::kTypedArrayPrototypeForEach, 1, false);
3161     SimpleInstallFunction(isolate_, prototype, "includes",
3162                           Builtins::kTypedArrayPrototypeIncludes, 1, false);
3163     SimpleInstallFunction(isolate_, prototype, "indexOf",
3164                           Builtins::kTypedArrayPrototypeIndexOf, 1, false);
3165     SimpleInstallFunction(isolate_, prototype, "lastIndexOf",
3166                           Builtins::kTypedArrayPrototypeLastIndexOf, 1, false);
3167     SimpleInstallFunction(isolate_, prototype, "map",
3168                           Builtins::kTypedArrayPrototypeMap, 1, false);
3169     SimpleInstallFunction(isolate_, prototype, "reverse",
3170                           Builtins::kTypedArrayPrototypeReverse, 0, false);
3171     SimpleInstallFunction(isolate_, prototype, "reduce",
3172                           Builtins::kTypedArrayPrototypeReduce, 1, false);
3173     SimpleInstallFunction(isolate_, prototype, "reduceRight",
3174                           Builtins::kTypedArrayPrototypeReduceRight, 1, false);
3175     SimpleInstallFunction(isolate_, prototype, "set",
3176                           Builtins::kTypedArrayPrototypeSet, 1, false);
3177     SimpleInstallFunction(isolate_, prototype, "slice",
3178                           Builtins::kTypedArrayPrototypeSlice, 2, false);
3179     SimpleInstallFunction(isolate_, prototype, "some",
3180                           Builtins::kTypedArrayPrototypeSome, 1, false);
3181     SimpleInstallFunction(isolate_, prototype, "sort",
3182                           Builtins::kTypedArrayPrototypeSort, 1, false);
3183     SimpleInstallFunction(isolate_, prototype, "subarray",
3184                           Builtins::kTypedArrayPrototypeSubArray, 2, false);
3185   }
3186 
3187   {  // -- T y p e d A r r a y s
3188 #define INSTALL_TYPED_ARRAY(Type, type, TYPE, ctype)                   \
3189   {                                                                    \
3190     Handle<JSFunction> fun =                                           \
3191         InstallTypedArray(#Type "Array", TYPE##_ELEMENTS);             \
3192     InstallWithIntrinsicDefaultProto(isolate_, fun,                    \
3193                                      Context::TYPE##_ARRAY_FUN_INDEX); \
3194   }
3195     TYPED_ARRAYS(INSTALL_TYPED_ARRAY)
3196 #undef INSTALL_TYPED_ARRAY
3197   }
3198 
3199   {  // -- D a t a V i e w
3200     Handle<JSFunction> data_view_fun = InstallFunction(
3201         isolate_, global, "DataView", JS_DATA_VIEW_TYPE,
3202         JSDataView::kSizeWithEmbedderFields, 0, factory->the_hole_value(),
3203         Builtins::kDataViewConstructor);
3204     InstallWithIntrinsicDefaultProto(isolate_, data_view_fun,
3205                                      Context::DATA_VIEW_FUN_INDEX);
3206     data_view_fun->shared()->set_length(1);
3207     data_view_fun->shared()->DontAdaptArguments();
3208 
3209     // Setup %DataViewPrototype%.
3210     Handle<JSObject> prototype(
3211         JSObject::cast(data_view_fun->instance_prototype()), isolate());
3212 
3213     // Install the @@toStringTag property on the {prototype}.
3214     JSObject::AddProperty(
3215         isolate_, prototype, factory->to_string_tag_symbol(),
3216         factory->NewStringFromAsciiChecked("DataView"),
3217         static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
3218 
3219     // Install the "buffer", "byteOffset" and "byteLength" getters
3220     // on the {prototype}.
3221     SimpleInstallGetter(isolate_, prototype, factory->buffer_string(),
3222                         Builtins::kDataViewPrototypeGetBuffer, false,
3223                         BuiltinFunctionId::kDataViewBuffer);
3224     SimpleInstallGetter(isolate_, prototype, factory->byte_length_string(),
3225                         Builtins::kDataViewPrototypeGetByteLength, false,
3226                         BuiltinFunctionId::kDataViewByteLength);
3227     SimpleInstallGetter(isolate_, prototype, factory->byte_offset_string(),
3228                         Builtins::kDataViewPrototypeGetByteOffset, false,
3229                         BuiltinFunctionId::kDataViewByteOffset);
3230 
3231     SimpleInstallFunction(isolate_, prototype, "getInt8",
3232                           Builtins::kDataViewPrototypeGetInt8, 1, false);
3233     SimpleInstallFunction(isolate_, prototype, "setInt8",
3234                           Builtins::kDataViewPrototypeSetInt8, 2, false);
3235     SimpleInstallFunction(isolate_, prototype, "getUint8",
3236                           Builtins::kDataViewPrototypeGetUint8, 1, false);
3237     SimpleInstallFunction(isolate_, prototype, "setUint8",
3238                           Builtins::kDataViewPrototypeSetUint8, 2, false);
3239     SimpleInstallFunction(isolate_, prototype, "getInt16",
3240                           Builtins::kDataViewPrototypeGetInt16, 1, false);
3241     SimpleInstallFunction(isolate_, prototype, "setInt16",
3242                           Builtins::kDataViewPrototypeSetInt16, 2, false);
3243     SimpleInstallFunction(isolate_, prototype, "getUint16",
3244                           Builtins::kDataViewPrototypeGetUint16, 1, false);
3245     SimpleInstallFunction(isolate_, prototype, "setUint16",
3246                           Builtins::kDataViewPrototypeSetUint16, 2, false);
3247     SimpleInstallFunction(isolate_, prototype, "getInt32",
3248                           Builtins::kDataViewPrototypeGetInt32, 1, false);
3249     SimpleInstallFunction(isolate_, prototype, "setInt32",
3250                           Builtins::kDataViewPrototypeSetInt32, 2, false);
3251     SimpleInstallFunction(isolate_, prototype, "getUint32",
3252                           Builtins::kDataViewPrototypeGetUint32, 1, false);
3253     SimpleInstallFunction(isolate_, prototype, "setUint32",
3254                           Builtins::kDataViewPrototypeSetUint32, 2, false);
3255     SimpleInstallFunction(isolate_, prototype, "getFloat32",
3256                           Builtins::kDataViewPrototypeGetFloat32, 1, false);
3257     SimpleInstallFunction(isolate_, prototype, "setFloat32",
3258                           Builtins::kDataViewPrototypeSetFloat32, 2, false);
3259     SimpleInstallFunction(isolate_, prototype, "getFloat64",
3260                           Builtins::kDataViewPrototypeGetFloat64, 1, false);
3261     SimpleInstallFunction(isolate_, prototype, "setFloat64",
3262                           Builtins::kDataViewPrototypeSetFloat64, 2, false);
3263   }
3264 
3265   {  // -- M a p
3266     Handle<JSFunction> js_map_fun =
3267         InstallFunction(isolate_, global, "Map", JS_MAP_TYPE, JSMap::kSize, 0,
3268                         factory->the_hole_value(), Builtins::kMapConstructor);
3269     InstallWithIntrinsicDefaultProto(isolate_, js_map_fun,
3270                                      Context::JS_MAP_FUN_INDEX);
3271 
3272     Handle<SharedFunctionInfo> shared(js_map_fun->shared(), isolate_);
3273     shared->DontAdaptArguments();
3274     shared->set_length(0);
3275 
3276     // Setup %MapPrototype%.
3277     Handle<JSObject> prototype(JSObject::cast(js_map_fun->instance_prototype()),
3278                                isolate());
3279 
3280     // Install the @@toStringTag property on the {prototype}.
3281     JSObject::AddProperty(
3282         isolate_, prototype, factory->to_string_tag_symbol(),
3283         factory->Map_string(),
3284         static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
3285 
3286     Handle<JSFunction> map_get = SimpleInstallFunction(
3287         isolate_, prototype, "get", Builtins::kMapPrototypeGet, 1, true);
3288     native_context()->set_map_get(*map_get);
3289 
3290     Handle<JSFunction> map_set = SimpleInstallFunction(
3291         isolate_, prototype, "set", Builtins::kMapPrototypeSet, 2, true);
3292     native_context()->set_map_set(*map_set);
3293 
3294     Handle<JSFunction> map_has = SimpleInstallFunction(
3295         isolate_, prototype, "has", Builtins::kMapPrototypeHas, 1, true);
3296     native_context()->set_map_has(*map_has);
3297 
3298     Handle<JSFunction> map_delete = SimpleInstallFunction(
3299         isolate_, prototype, "delete", Builtins::kMapPrototypeDelete, 1, true);
3300     native_context()->set_map_delete(*map_delete);
3301 
3302     SimpleInstallFunction(isolate_, prototype, "clear",
3303                           Builtins::kMapPrototypeClear, 0, true);
3304     Handle<JSFunction> entries =
3305         SimpleInstallFunction(isolate_, prototype, "entries",
3306                               Builtins::kMapPrototypeEntries, 0, true);
3307     JSObject::AddProperty(isolate_, prototype, factory->iterator_symbol(),
3308                           entries, DONT_ENUM);
3309     SimpleInstallFunction(isolate_, prototype, "forEach",
3310                           Builtins::kMapPrototypeForEach, 1, false);
3311     SimpleInstallFunction(isolate_, prototype, "keys",
3312                           Builtins::kMapPrototypeKeys, 0, true);
3313     SimpleInstallGetter(
3314         isolate_, prototype, factory->InternalizeUtf8String("size"),
3315         Builtins::kMapPrototypeGetSize, true, BuiltinFunctionId::kMapSize);
3316     SimpleInstallFunction(isolate_, prototype, "values",
3317                           Builtins::kMapPrototypeValues, 0, true);
3318 
3319     native_context()->set_initial_map_prototype_map(prototype->map());
3320 
3321     InstallSpeciesGetter(isolate_, js_map_fun);
3322   }
3323 
3324   {  // -- S e t
3325     Handle<JSFunction> js_set_fun =
3326         InstallFunction(isolate_, global, "Set", JS_SET_TYPE, JSSet::kSize, 0,
3327                         factory->the_hole_value(), Builtins::kSetConstructor);
3328     InstallWithIntrinsicDefaultProto(isolate_, js_set_fun,
3329                                      Context::JS_SET_FUN_INDEX);
3330 
3331     Handle<SharedFunctionInfo> shared(js_set_fun->shared(), isolate_);
3332     shared->DontAdaptArguments();
3333     shared->set_length(0);
3334 
3335     // Setup %SetPrototype%.
3336     Handle<JSObject> prototype(JSObject::cast(js_set_fun->instance_prototype()),
3337                                isolate());
3338 
3339     // Install the @@toStringTag property on the {prototype}.
3340     JSObject::AddProperty(
3341         isolate_, prototype, factory->to_string_tag_symbol(),
3342         factory->Set_string(),
3343         static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
3344 
3345     Handle<JSFunction> set_has = SimpleInstallFunction(
3346         isolate_, prototype, "has", Builtins::kSetPrototypeHas, 1, true);
3347     native_context()->set_set_has(*set_has);
3348 
3349     Handle<JSFunction> set_add = SimpleInstallFunction(
3350         isolate_, prototype, "add", Builtins::kSetPrototypeAdd, 1, true);
3351     native_context()->set_set_add(*set_add);
3352 
3353     Handle<JSFunction> set_delete = SimpleInstallFunction(
3354         isolate_, prototype, "delete", Builtins::kSetPrototypeDelete, 1, true);
3355     native_context()->set_set_delete(*set_delete);
3356 
3357     SimpleInstallFunction(isolate_, prototype, "clear",
3358                           Builtins::kSetPrototypeClear, 0, true);
3359     SimpleInstallFunction(isolate_, prototype, "entries",
3360                           Builtins::kSetPrototypeEntries, 0, true);
3361     SimpleInstallFunction(isolate_, prototype, "forEach",
3362                           Builtins::kSetPrototypeForEach, 1, false);
3363     SimpleInstallGetter(
3364         isolate_, prototype, factory->InternalizeUtf8String("size"),
3365         Builtins::kSetPrototypeGetSize, true, BuiltinFunctionId::kSetSize);
3366     Handle<JSFunction> values = SimpleInstallFunction(
3367         isolate_, prototype, "values", Builtins::kSetPrototypeValues, 0, true);
3368     JSObject::AddProperty(isolate_, prototype, factory->keys_string(), values,
3369                           DONT_ENUM);
3370     JSObject::AddProperty(isolate_, prototype, factory->iterator_symbol(),
3371                           values, DONT_ENUM);
3372 
3373     native_context()->set_initial_set_prototype_map(prototype->map());
3374 
3375     InstallSpeciesGetter(isolate_, js_set_fun);
3376   }
3377 
3378   {  // -- J S M o d u l e N a m e s p a c e
3379     Handle<Map> map = factory->NewMap(
3380         JS_MODULE_NAMESPACE_TYPE, JSModuleNamespace::kSize,
3381         TERMINAL_FAST_ELEMENTS_KIND, JSModuleNamespace::kInObjectFieldCount);
3382     Map::SetPrototype(isolate(), map, isolate_->factory()->null_value());
3383     Map::EnsureDescriptorSlack(isolate_, map, 1);
3384     native_context()->set_js_module_namespace_map(*map);
3385 
3386     {  // Install @@toStringTag.
3387       PropertyAttributes attribs =
3388           static_cast<PropertyAttributes>(DONT_DELETE | DONT_ENUM | READ_ONLY);
3389       Descriptor d =
3390           Descriptor::DataField(isolate(), factory->to_string_tag_symbol(),
3391                                 JSModuleNamespace::kToStringTagFieldIndex,
3392                                 attribs, Representation::Tagged());
3393       map->AppendDescriptor(&d);
3394     }
3395   }
3396 
3397   {  // -- I t e r a t o r R e s u l t
3398     Handle<Map> map = factory->NewMap(JS_OBJECT_TYPE, JSIteratorResult::kSize,
3399                                       TERMINAL_FAST_ELEMENTS_KIND, 2);
3400     Map::SetPrototype(isolate(), map, isolate_->initial_object_prototype());
3401     Map::EnsureDescriptorSlack(isolate_, map, 2);
3402 
3403     {  // value
3404       Descriptor d = Descriptor::DataField(isolate(), factory->value_string(),
3405                                            JSIteratorResult::kValueIndex, NONE,
3406                                            Representation::Tagged());
3407       map->AppendDescriptor(&d);
3408     }
3409 
3410     {  // done
3411       Descriptor d = Descriptor::DataField(isolate(), factory->done_string(),
3412                                            JSIteratorResult::kDoneIndex, NONE,
3413                                            Representation::Tagged());
3414       map->AppendDescriptor(&d);
3415     }
3416 
3417     map->SetConstructor(native_context()->object_function());
3418     native_context()->set_iterator_result_map(*map);
3419   }
3420 
3421   {  // -- W e a k M a p
3422     Handle<JSFunction> cons = InstallFunction(
3423         isolate_, global, "WeakMap", JS_WEAK_MAP_TYPE, JSWeakMap::kSize, 0,
3424         factory->the_hole_value(), Builtins::kWeakMapConstructor);
3425     InstallWithIntrinsicDefaultProto(isolate_, cons,
3426                                      Context::JS_WEAK_MAP_FUN_INDEX);
3427 
3428     Handle<SharedFunctionInfo> shared(cons->shared(), isolate_);
3429     shared->DontAdaptArguments();
3430     shared->set_length(0);
3431 
3432     // Setup %WeakMapPrototype%.
3433     Handle<JSObject> prototype(JSObject::cast(cons->instance_prototype()),
3434                                isolate());
3435 
3436     SimpleInstallFunction(isolate_, prototype, "delete",
3437                           Builtins::kWeakMapPrototypeDelete, 1, true);
3438     SimpleInstallFunction(isolate_, prototype, "get", Builtins::kWeakMapGet, 1,
3439                           true);
3440     SimpleInstallFunction(isolate_, prototype, "has", Builtins::kWeakMapHas, 1,
3441                           true);
3442     Handle<JSFunction> weakmap_set = SimpleInstallFunction(
3443         isolate_, prototype, "set", Builtins::kWeakMapPrototypeSet, 2, true);
3444     native_context()->set_weakmap_set(*weakmap_set);
3445 
3446     JSObject::AddProperty(
3447         isolate_, prototype, factory->to_string_tag_symbol(),
3448         factory->NewStringFromAsciiChecked("WeakMap"),
3449         static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
3450 
3451     native_context()->set_initial_weakmap_prototype_map(prototype->map());
3452   }
3453 
3454   {  // -- W e a k S e t
3455     Handle<JSFunction> cons = InstallFunction(
3456         isolate_, global, "WeakSet", JS_WEAK_SET_TYPE, JSWeakSet::kSize, 0,
3457         factory->the_hole_value(), Builtins::kWeakSetConstructor);
3458     InstallWithIntrinsicDefaultProto(isolate_, cons,
3459                                      Context::JS_WEAK_SET_FUN_INDEX);
3460 
3461     Handle<SharedFunctionInfo> shared(cons->shared(), isolate_);
3462     shared->DontAdaptArguments();
3463     shared->set_length(0);
3464 
3465     // Setup %WeakSetPrototype%.
3466     Handle<JSObject> prototype(JSObject::cast(cons->instance_prototype()),
3467                                isolate());
3468 
3469     SimpleInstallFunction(isolate_, prototype, "delete",
3470                           Builtins::kWeakSetPrototypeDelete, 1, true);
3471     SimpleInstallFunction(isolate_, prototype, "has", Builtins::kWeakSetHas, 1,
3472                           true);
3473     Handle<JSFunction> weakset_add = SimpleInstallFunction(
3474         isolate_, prototype, "add", Builtins::kWeakSetPrototypeAdd, 1, true);
3475     native_context()->set_weakset_add(*weakset_add);
3476 
3477     JSObject::AddProperty(
3478         isolate_, prototype, factory->to_string_tag_symbol(),
3479         factory->NewStringFromAsciiChecked("WeakSet"),
3480         static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
3481 
3482     native_context()->set_initial_weakset_prototype_map(prototype->map());
3483   }
3484 
3485   {  // -- P r o x y
3486     CreateJSProxyMaps();
3487     // Proxy function map has prototype slot for storing initial map but does
3488     // not have a prototype property.
3489     Handle<Map> proxy_function_map = Map::Copy(
3490         isolate_, isolate_->strict_function_without_prototype_map(), "Proxy");
3491     proxy_function_map->set_is_constructor(true);
3492 
3493     Handle<String> name = factory->Proxy_string();
3494 
3495     NewFunctionArgs args = NewFunctionArgs::ForBuiltin(
3496         name, proxy_function_map, Builtins::kProxyConstructor);
3497     Handle<JSFunction> proxy_function = factory->NewFunction(args);
3498 
3499     isolate_->proxy_map()->SetConstructor(*proxy_function);
3500 
3501     proxy_function->shared()->set_internal_formal_parameter_count(2);
3502     proxy_function->shared()->set_length(2);
3503 
3504     native_context()->set_proxy_function(*proxy_function);
3505     InstallFunction(isolate_, global, name, proxy_function,
3506                     factory->Object_string());
3507 
3508     DCHECK(!proxy_function->has_prototype_property());
3509 
3510     SimpleInstallFunction(isolate_, proxy_function, "revocable",
3511                           Builtins::kProxyRevocable, 2, true);
3512 
3513     {  // Internal: ProxyRevoke
3514       Handle<SharedFunctionInfo> info = SimpleCreateSharedFunctionInfo(
3515           isolate_, Builtins::kProxyRevoke, factory->empty_string(), 0);
3516       native_context()->set_proxy_revoke_shared_fun(*info);
3517     }
3518   }
3519 
3520   {  // -- R e f l e c t
3521     Handle<String> reflect_string = factory->InternalizeUtf8String("Reflect");
3522     Handle<JSObject> reflect =
3523         factory->NewJSObject(isolate_->object_function(), TENURED);
3524     JSObject::AddProperty(isolate_, global, reflect_string, reflect, DONT_ENUM);
3525 
3526     Handle<JSFunction> define_property = SimpleInstallFunction(
3527         isolate_, reflect, factory->defineProperty_string(),
3528         Builtins::kReflectDefineProperty, 3, true);
3529     native_context()->set_reflect_define_property(*define_property);
3530 
3531     Handle<JSFunction> delete_property = SimpleInstallFunction(
3532         isolate_, reflect, factory->deleteProperty_string(),
3533         Builtins::kReflectDeleteProperty, 2, true);
3534     native_context()->set_reflect_delete_property(*delete_property);
3535 
3536     Handle<JSFunction> apply =
3537         SimpleInstallFunction(isolate_, reflect, factory->apply_string(),
3538                               Builtins::kReflectApply, 3, false);
3539     native_context()->set_reflect_apply(*apply);
3540 
3541     Handle<JSFunction> construct =
3542         SimpleInstallFunction(isolate_, reflect, factory->construct_string(),
3543                               Builtins::kReflectConstruct, 2, false);
3544     native_context()->set_reflect_construct(*construct);
3545 
3546     SimpleInstallFunction(isolate_, reflect, factory->get_string(),
3547                           Builtins::kReflectGet, 2, false);
3548     SimpleInstallFunction(isolate_, reflect,
3549                           factory->getOwnPropertyDescriptor_string(),
3550                           Builtins::kReflectGetOwnPropertyDescriptor, 2, true);
3551     SimpleInstallFunction(isolate_, reflect, factory->getPrototypeOf_string(),
3552                           Builtins::kReflectGetPrototypeOf, 1, true);
3553     SimpleInstallFunction(isolate_, reflect, factory->has_string(),
3554                           Builtins::kReflectHas, 2, true);
3555     SimpleInstallFunction(isolate_, reflect, factory->isExtensible_string(),
3556                           Builtins::kReflectIsExtensible, 1, true);
3557     SimpleInstallFunction(isolate_, reflect, factory->ownKeys_string(),
3558                           Builtins::kReflectOwnKeys, 1, true);
3559     SimpleInstallFunction(isolate_, reflect,
3560                           factory->preventExtensions_string(),
3561                           Builtins::kReflectPreventExtensions, 1, true);
3562     SimpleInstallFunction(isolate_, reflect, factory->set_string(),
3563                           Builtins::kReflectSet, 3, false);
3564     SimpleInstallFunction(isolate_, reflect, factory->setPrototypeOf_string(),
3565                           Builtins::kReflectSetPrototypeOf, 2, true);
3566   }
3567 
3568   {  // --- B o u n d F u n c t i o n
3569     Handle<Map> map =
3570         factory->NewMap(JS_BOUND_FUNCTION_TYPE, JSBoundFunction::kSize,
3571                         TERMINAL_FAST_ELEMENTS_KIND, 0);
3572     map->SetConstructor(native_context()->object_function());
3573     map->set_is_callable(true);
3574     Map::SetPrototype(isolate(), map, empty_function);
3575 
3576     PropertyAttributes roc_attribs =
3577         static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY);
3578     Map::EnsureDescriptorSlack(isolate_, map, 2);
3579 
3580     {  // length
3581       Descriptor d = Descriptor::AccessorConstant(
3582           factory->length_string(), factory->bound_function_length_accessor(),
3583           roc_attribs);
3584       map->AppendDescriptor(&d);
3585     }
3586 
3587     {  // name
3588       Descriptor d = Descriptor::AccessorConstant(
3589           factory->name_string(), factory->bound_function_name_accessor(),
3590           roc_attribs);
3591       map->AppendDescriptor(&d);
3592     }
3593     native_context()->set_bound_function_without_constructor_map(*map);
3594 
3595     map = Map::Copy(isolate_, map, "IsConstructor");
3596     map->set_is_constructor(true);
3597     native_context()->set_bound_function_with_constructor_map(*map);
3598   }
3599 
3600   {  // --- sloppy arguments map
3601     Handle<String> arguments_string = factory->Arguments_string();
3602     NewFunctionArgs args = NewFunctionArgs::ForBuiltinWithPrototype(
3603         arguments_string, isolate_->initial_object_prototype(),
3604         JS_ARGUMENTS_TYPE, JSSloppyArgumentsObject::kSize, 2,
3605         Builtins::kIllegal, MUTABLE);
3606     Handle<JSFunction> function = factory->NewFunction(args);
3607     Handle<Map> map(function->initial_map(), isolate());
3608 
3609     // Create the descriptor array for the arguments object.
3610     Map::EnsureDescriptorSlack(isolate_, map, 2);
3611 
3612     {  // length
3613       Descriptor d =
3614           Descriptor::DataField(isolate(), factory->length_string(),
3615                                 JSSloppyArgumentsObject::kLengthIndex,
3616                                 DONT_ENUM, Representation::Tagged());
3617       map->AppendDescriptor(&d);
3618     }
3619     {  // callee
3620       Descriptor d =
3621           Descriptor::DataField(isolate(), factory->callee_string(),
3622                                 JSSloppyArgumentsObject::kCalleeIndex,
3623                                 DONT_ENUM, Representation::Tagged());
3624       map->AppendDescriptor(&d);
3625     }
3626     // @@iterator method is added later.
3627 
3628     native_context()->set_sloppy_arguments_map(*map);
3629 
3630     DCHECK(!map->is_dictionary_map());
3631     DCHECK(IsObjectElementsKind(map->elements_kind()));
3632   }
3633 
3634   {  // --- fast and slow aliased arguments map
3635     Handle<Map> map = isolate_->sloppy_arguments_map();
3636     map = Map::Copy(isolate_, map, "FastAliasedArguments");
3637     map->set_elements_kind(FAST_SLOPPY_ARGUMENTS_ELEMENTS);
3638     DCHECK_EQ(2, map->GetInObjectProperties());
3639     native_context()->set_fast_aliased_arguments_map(*map);
3640 
3641     map = Map::Copy(isolate_, map, "SlowAliasedArguments");
3642     map->set_elements_kind(SLOW_SLOPPY_ARGUMENTS_ELEMENTS);
3643     DCHECK_EQ(2, map->GetInObjectProperties());
3644     native_context()->set_slow_aliased_arguments_map(*map);
3645   }
3646 
3647   {  // --- strict mode arguments map
3648     const PropertyAttributes attributes =
3649       static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY);
3650 
3651     // Create the ThrowTypeError function.
3652     Handle<AccessorPair> callee = factory->NewAccessorPair();
3653 
3654     Handle<JSFunction> poison = GetThrowTypeErrorIntrinsic();
3655 
3656     // Install the ThrowTypeError function.
3657     callee->set_getter(*poison);
3658     callee->set_setter(*poison);
3659 
3660     // Create the map. Allocate one in-object field for length.
3661     Handle<Map> map = factory->NewMap(
3662         JS_ARGUMENTS_TYPE, JSStrictArgumentsObject::kSize, PACKED_ELEMENTS, 1);
3663     // Create the descriptor array for the arguments object.
3664     Map::EnsureDescriptorSlack(isolate_, map, 2);
3665 
3666     {  // length
3667       Descriptor d =
3668           Descriptor::DataField(isolate(), factory->length_string(),
3669                                 JSStrictArgumentsObject::kLengthIndex,
3670                                 DONT_ENUM, Representation::Tagged());
3671       map->AppendDescriptor(&d);
3672     }
3673     {  // callee
3674       Descriptor d = Descriptor::AccessorConstant(factory->callee_string(),
3675                                                   callee, attributes);
3676       map->AppendDescriptor(&d);
3677     }
3678     // @@iterator method is added later.
3679 
3680     DCHECK_EQ(native_context()->object_function()->prototype(),
3681               *isolate_->initial_object_prototype());
3682     Map::SetPrototype(isolate(), map, isolate_->initial_object_prototype());
3683 
3684     // Copy constructor from the sloppy arguments boilerplate.
3685     map->SetConstructor(
3686         native_context()->sloppy_arguments_map()->GetConstructor());
3687 
3688     native_context()->set_strict_arguments_map(*map);
3689 
3690     DCHECK(!map->is_dictionary_map());
3691     DCHECK(IsObjectElementsKind(map->elements_kind()));
3692   }
3693 
3694   {  // --- context extension
3695     // Create a function for the context extension objects.
3696     Handle<JSFunction> context_extension_fun =
3697         CreateFunction(isolate_, factory->empty_string(),
3698                        JS_CONTEXT_EXTENSION_OBJECT_TYPE, JSObject::kHeaderSize,
3699                        0, factory->the_hole_value(), Builtins::kIllegal);
3700     native_context()->set_context_extension_function(*context_extension_fun);
3701   }
3702 
3703   {
3704     // Set up the call-as-function delegate.
3705     Handle<JSFunction> delegate =
3706         SimpleCreateFunction(isolate_, factory->empty_string(),
3707                              Builtins::kHandleApiCallAsFunction, 0, false);
3708     native_context()->set_call_as_function_delegate(*delegate);
3709   }
3710 
3711   {
3712     // Set up the call-as-constructor delegate.
3713     Handle<JSFunction> delegate =
3714         SimpleCreateFunction(isolate_, factory->empty_string(),
3715                              Builtins::kHandleApiCallAsConstructor, 0, false);
3716     native_context()->set_call_as_constructor_delegate(*delegate);
3717   }
3718 }  // NOLINT(readability/fn_size)
3719 
InstallTypedArray(const char * name,ElementsKind elements_kind)3720 Handle<JSFunction> Genesis::InstallTypedArray(const char* name,
3721                                               ElementsKind elements_kind) {
3722   Handle<JSObject> global =
3723       Handle<JSObject>(native_context()->global_object(), isolate());
3724 
3725   Handle<JSObject> typed_array_prototype = isolate()->typed_array_prototype();
3726   Handle<JSFunction> typed_array_function = isolate()->typed_array_function();
3727 
3728   Handle<JSFunction> result = InstallFunction(
3729       isolate(), global, name, JS_TYPED_ARRAY_TYPE,
3730       JSTypedArray::kSizeWithEmbedderFields, 0, factory()->the_hole_value(),
3731       Builtins::kTypedArrayConstructor);
3732   result->initial_map()->set_elements_kind(elements_kind);
3733 
3734   result->shared()->DontAdaptArguments();
3735   result->shared()->set_length(3);
3736 
3737   CHECK(JSObject::SetPrototype(result, typed_array_function, false, kDontThrow)
3738             .FromJust());
3739 
3740   Handle<Smi> bytes_per_element(
3741       Smi::FromInt(1 << ElementsKindToShiftSize(elements_kind)), isolate());
3742 
3743   InstallConstant(isolate(), result, "BYTES_PER_ELEMENT", bytes_per_element);
3744 
3745   // Setup prototype object.
3746   DCHECK(result->prototype()->IsJSObject());
3747   Handle<JSObject> prototype(JSObject::cast(result->prototype()), isolate());
3748 
3749   CHECK(JSObject::SetPrototype(prototype, typed_array_prototype, false,
3750                                kDontThrow)
3751             .FromJust());
3752 
3753   InstallConstant(isolate(), prototype, "BYTES_PER_ELEMENT", bytes_per_element);
3754   return result;
3755 }
3756 
3757 
InitializeExperimentalGlobal()3758 void Genesis::InitializeExperimentalGlobal() {
3759 #define FEATURE_INITIALIZE_GLOBAL(id, descr) InitializeGlobal_##id();
3760 
3761   HARMONY_INPROGRESS(FEATURE_INITIALIZE_GLOBAL)
3762   HARMONY_STAGED(FEATURE_INITIALIZE_GLOBAL)
3763   HARMONY_SHIPPING(FEATURE_INITIALIZE_GLOBAL)
3764 #undef FEATURE_INITIALIZE_GLOBAL
3765 }
3766 
CompileBuiltin(Isolate * isolate,int index)3767 bool Bootstrapper::CompileBuiltin(Isolate* isolate, int index) {
3768   Vector<const char> name = Natives::GetScriptName(index);
3769   Handle<String> source_code =
3770       isolate->bootstrapper()->GetNativeSource(CORE, index);
3771 
3772   // We pass in extras_utils so that builtin code can set it up for later use
3773   // by actual extras code, compiled with CompileExtraBuiltin.
3774   Handle<Object> global = isolate->global_object();
3775   Handle<Object> utils = isolate->natives_utils_object();
3776   Handle<Object> extras_utils = isolate->extras_utils_object();
3777   Handle<Object> args[] = {global, utils, extras_utils};
3778 
3779   return Bootstrapper::CompileNative(isolate, name, source_code,
3780                                      arraysize(args), args, NATIVES_CODE);
3781 }
3782 
3783 
CompileExtraBuiltin(Isolate * isolate,int index)3784 bool Bootstrapper::CompileExtraBuiltin(Isolate* isolate, int index) {
3785   HandleScope scope(isolate);
3786   Vector<const char> name = ExtraNatives::GetScriptName(index);
3787   Handle<String> source_code =
3788       isolate->bootstrapper()->GetNativeSource(EXTRAS, index);
3789   Handle<Object> global = isolate->global_object();
3790   Handle<Object> binding = isolate->extras_binding_object();
3791   Handle<Object> extras_utils = isolate->extras_utils_object();
3792   Handle<Object> args[] = {global, binding, extras_utils};
3793   return Bootstrapper::CompileNative(isolate, name, source_code,
3794                                      arraysize(args), args, EXTENSION_CODE);
3795 }
3796 
3797 
CompileExperimentalExtraBuiltin(Isolate * isolate,int index)3798 bool Bootstrapper::CompileExperimentalExtraBuiltin(Isolate* isolate,
3799                                                    int index) {
3800   HandleScope scope(isolate);
3801   Vector<const char> name = ExperimentalExtraNatives::GetScriptName(index);
3802   Handle<String> source_code =
3803       isolate->bootstrapper()->GetNativeSource(EXPERIMENTAL_EXTRAS, index);
3804   Handle<Object> global = isolate->global_object();
3805   Handle<Object> binding = isolate->extras_binding_object();
3806   Handle<Object> extras_utils = isolate->extras_utils_object();
3807   Handle<Object> args[] = {global, binding, extras_utils};
3808   return Bootstrapper::CompileNative(isolate, name, source_code,
3809                                      arraysize(args), args, EXTENSION_CODE);
3810 }
3811 
CompileNative(Isolate * isolate,Vector<const char> name,Handle<String> source,int argc,Handle<Object> argv[],NativesFlag natives_flag)3812 bool Bootstrapper::CompileNative(Isolate* isolate, Vector<const char> name,
3813                                  Handle<String> source, int argc,
3814                                  Handle<Object> argv[],
3815                                  NativesFlag natives_flag) {
3816   SuppressDebug compiling_natives(isolate->debug());
3817 
3818   Handle<Context> context(isolate->context(), isolate);
3819   Handle<String> script_name =
3820       isolate->factory()->NewStringFromUtf8(name).ToHandleChecked();
3821   MaybeHandle<SharedFunctionInfo> maybe_function_info =
3822       Compiler::GetSharedFunctionInfoForScript(
3823           isolate, source, Compiler::ScriptDetails(script_name),
3824           ScriptOriginOptions(), nullptr, nullptr,
3825           ScriptCompiler::kNoCompileOptions, ScriptCompiler::kNoCacheNoReason,
3826           natives_flag);
3827   Handle<SharedFunctionInfo> function_info;
3828   if (!maybe_function_info.ToHandle(&function_info)) return false;
3829 
3830   DCHECK(context->IsNativeContext());
3831 
3832   Handle<JSFunction> fun =
3833       isolate->factory()->NewFunctionFromSharedFunctionInfo(function_info,
3834                                                             context);
3835   Handle<Object> receiver = isolate->factory()->undefined_value();
3836 
3837   // For non-extension scripts, run script to get the function wrapper.
3838   Handle<Object> wrapper;
3839   if (!Execution::TryCall(isolate, fun, receiver, 0, nullptr,
3840                           Execution::MessageHandling::kKeepPending, nullptr)
3841            .ToHandle(&wrapper)) {
3842     return false;
3843   }
3844   // Then run the function wrapper.
3845   return !Execution::TryCall(isolate, Handle<JSFunction>::cast(wrapper),
3846                              receiver, argc, argv,
3847                              Execution::MessageHandling::kKeepPending, nullptr)
3848               .is_null();
3849 }
3850 
3851 
CallUtilsFunction(Isolate * isolate,const char * name)3852 bool Genesis::CallUtilsFunction(Isolate* isolate, const char* name) {
3853   Handle<JSObject> utils =
3854       Handle<JSObject>::cast(isolate->natives_utils_object());
3855   Handle<String> name_string =
3856       isolate->factory()->NewStringFromAsciiChecked(name);
3857   Handle<Object> fun = JSObject::GetDataProperty(utils, name_string);
3858   Handle<Object> receiver = isolate->factory()->undefined_value();
3859   Handle<Object> args[] = {utils};
3860   return !Execution::TryCall(isolate, fun, receiver, 1, args,
3861                              Execution::MessageHandling::kKeepPending, nullptr)
3862               .is_null();
3863 }
3864 
3865 
CompileExtension(Isolate * isolate,v8::Extension * extension)3866 bool Genesis::CompileExtension(Isolate* isolate, v8::Extension* extension) {
3867   Factory* factory = isolate->factory();
3868   HandleScope scope(isolate);
3869   Handle<SharedFunctionInfo> function_info;
3870 
3871   Handle<String> source =
3872       isolate->factory()
3873           ->NewExternalStringFromOneByte(extension->source())
3874           .ToHandleChecked();
3875   DCHECK(source->IsOneByteRepresentation());
3876 
3877   // If we can't find the function in the cache, we compile a new
3878   // function and insert it into the cache.
3879   Vector<const char> name = CStrVector(extension->name());
3880   SourceCodeCache* cache = isolate->bootstrapper()->extensions_cache();
3881   Handle<Context> context(isolate->context(), isolate);
3882   DCHECK(context->IsNativeContext());
3883 
3884   if (!cache->Lookup(isolate, name, &function_info)) {
3885     Handle<String> script_name =
3886         factory->NewStringFromUtf8(name).ToHandleChecked();
3887     MaybeHandle<SharedFunctionInfo> maybe_function_info =
3888         Compiler::GetSharedFunctionInfoForScript(
3889             isolate, source, Compiler::ScriptDetails(script_name),
3890             ScriptOriginOptions(), extension, nullptr,
3891             ScriptCompiler::kNoCompileOptions,
3892             ScriptCompiler::kNoCacheBecauseV8Extension, EXTENSION_CODE);
3893     if (!maybe_function_info.ToHandle(&function_info)) return false;
3894     cache->Add(isolate, name, function_info);
3895   }
3896 
3897   // Set up the function context. Conceptually, we should clone the
3898   // function before overwriting the context but since we're in a
3899   // single-threaded environment it is not strictly necessary.
3900   Handle<JSFunction> fun =
3901       factory->NewFunctionFromSharedFunctionInfo(function_info, context);
3902 
3903   // Call function using either the runtime object or the global
3904   // object as the receiver. Provide no parameters.
3905   Handle<Object> receiver = isolate->global_object();
3906   return !Execution::TryCall(isolate, fun, receiver, 0, nullptr,
3907                              Execution::MessageHandling::kKeepPending, nullptr)
3908               .is_null();
3909 }
3910 
ResolveBuiltinIdHolder(Isolate * isolate,Handle<Context> native_context,const char * holder_expr)3911 static Handle<JSObject> ResolveBuiltinIdHolder(Isolate* isolate,
3912                                                Handle<Context> native_context,
3913                                                const char* holder_expr) {
3914   Factory* factory = isolate->factory();
3915   Handle<JSGlobalObject> global(native_context->global_object(), isolate);
3916   const char* period_pos = strchr(holder_expr, '.');
3917   if (period_pos == nullptr) {
3918     return Handle<JSObject>::cast(
3919         Object::GetPropertyOrElement(
3920             isolate, global, factory->InternalizeUtf8String(holder_expr))
3921             .ToHandleChecked());
3922   }
3923   const char* inner = period_pos + 1;
3924   DCHECK(!strchr(inner, '.'));
3925   Vector<const char> property(holder_expr,
3926                               static_cast<int>(period_pos - holder_expr));
3927   Handle<String> property_string = factory->InternalizeUtf8String(property);
3928   DCHECK(!property_string.is_null());
3929   Handle<JSObject> object = Handle<JSObject>::cast(
3930       JSReceiver::GetProperty(isolate, global, property_string)
3931           .ToHandleChecked());
3932   if (strcmp("prototype", inner) == 0) {
3933     Handle<JSFunction> function = Handle<JSFunction>::cast(object);
3934     return Handle<JSObject>(JSObject::cast(function->prototype()), isolate);
3935   }
3936   Handle<String> inner_string = factory->InternalizeUtf8String(inner);
3937   DCHECK(!inner_string.is_null());
3938   Handle<Object> value =
3939       JSReceiver::GetProperty(isolate, object, inner_string).ToHandleChecked();
3940   return Handle<JSObject>::cast(value);
3941 }
3942 
ConfigureUtilsObject(GlobalContextType context_type)3943 void Genesis::ConfigureUtilsObject(GlobalContextType context_type) {
3944   switch (context_type) {
3945     // We still need the utils object to find debug functions.
3946     case DEBUG_CONTEXT:
3947       return;
3948     // Expose the natives in global if a valid name for it is specified.
3949     case FULL_CONTEXT: {
3950       // We still need the utils object after deserialization.
3951       if (isolate()->serializer_enabled()) return;
3952       if (FLAG_expose_natives_as == nullptr) break;
3953       if (strlen(FLAG_expose_natives_as) == 0) break;
3954       HandleScope scope(isolate());
3955       Handle<String> natives_key =
3956           factory()->InternalizeUtf8String(FLAG_expose_natives_as);
3957       uint32_t dummy_index;
3958       if (natives_key->AsArrayIndex(&dummy_index)) break;
3959       Handle<Object> utils = isolate()->natives_utils_object();
3960       Handle<JSObject> global = isolate()->global_object();
3961       JSObject::AddProperty(isolate(), global, natives_key, utils, DONT_ENUM);
3962       break;
3963     }
3964   }
3965 
3966   // The utils object can be removed for cases that reach this point.
3967   HeapObject* undefined = ReadOnlyRoots(heap()).undefined_value();
3968   native_context()->set_natives_utils_object(undefined);
3969   native_context()->set_extras_utils_object(undefined);
3970 }
3971 
3972 
ExportFromRuntime(Isolate * isolate,Handle<JSObject> container)3973 void Bootstrapper::ExportFromRuntime(Isolate* isolate,
3974                                      Handle<JSObject> container) {
3975   Factory* factory = isolate->factory();
3976   HandleScope scope(isolate);
3977   Handle<NativeContext> native_context = isolate->native_context();
3978 #define EXPORT_PRIVATE_SYMBOL(NAME)                                       \
3979   Handle<String> NAME##_name = factory->NewStringFromAsciiChecked(#NAME); \
3980   JSObject::AddProperty(isolate, container, NAME##_name, factory->NAME(), NONE);
3981   PRIVATE_SYMBOL_LIST(EXPORT_PRIVATE_SYMBOL)
3982 #undef EXPORT_PRIVATE_SYMBOL
3983 
3984 #define EXPORT_PUBLIC_SYMBOL(NAME, DESCRIPTION)                           \
3985   Handle<String> NAME##_name = factory->NewStringFromAsciiChecked(#NAME); \
3986   JSObject::AddProperty(isolate, container, NAME##_name, factory->NAME(), NONE);
3987   PUBLIC_SYMBOL_LIST(EXPORT_PUBLIC_SYMBOL)
3988   WELL_KNOWN_SYMBOL_LIST(EXPORT_PUBLIC_SYMBOL)
3989 #undef EXPORT_PUBLIC_SYMBOL
3990 
3991   Handle<JSObject> iterator_prototype(
3992       native_context->initial_iterator_prototype(), isolate);
3993 
3994   JSObject::AddProperty(isolate, container,
3995                         factory->InternalizeUtf8String("IteratorPrototype"),
3996                         iterator_prototype, NONE);
3997 
3998   {
3999     PrototypeIterator iter(isolate, native_context->generator_function_map());
4000     Handle<JSObject> generator_function_prototype(iter.GetCurrent<JSObject>(),
4001                                                   isolate);
4002 
4003     JSObject::AddProperty(
4004         isolate, container,
4005         factory->InternalizeUtf8String("GeneratorFunctionPrototype"),
4006         generator_function_prototype, NONE);
4007 
4008     Handle<JSFunction> generator_function_function = InstallFunction(
4009         isolate, container, "GeneratorFunction", JS_FUNCTION_TYPE,
4010         JSFunction::kSizeWithPrototype, 0, generator_function_prototype,
4011         Builtins::kGeneratorFunctionConstructor);
4012     generator_function_function->set_prototype_or_initial_map(
4013         native_context->generator_function_map());
4014     generator_function_function->shared()->DontAdaptArguments();
4015     generator_function_function->shared()->set_length(1);
4016     InstallWithIntrinsicDefaultProto(
4017         isolate, generator_function_function,
4018         Context::GENERATOR_FUNCTION_FUNCTION_INDEX);
4019 
4020     JSObject::ForceSetPrototype(generator_function_function,
4021                                 isolate->function_function());
4022     JSObject::AddProperty(
4023         isolate, generator_function_prototype, factory->constructor_string(),
4024         generator_function_function,
4025         static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
4026 
4027     native_context->generator_function_map()->SetConstructor(
4028         *generator_function_function);
4029   }
4030 
4031   {
4032     PrototypeIterator iter(isolate,
4033                            native_context->async_generator_function_map());
4034     Handle<JSObject> async_generator_function_prototype(
4035         iter.GetCurrent<JSObject>(), isolate);
4036 
4037     Handle<JSFunction> async_generator_function_function = InstallFunction(
4038         isolate, container, "AsyncGeneratorFunction", JS_FUNCTION_TYPE,
4039         JSFunction::kSizeWithPrototype, 0, async_generator_function_prototype,
4040         Builtins::kAsyncGeneratorFunctionConstructor);
4041     async_generator_function_function->set_prototype_or_initial_map(
4042         native_context->async_generator_function_map());
4043     async_generator_function_function->shared()->DontAdaptArguments();
4044     async_generator_function_function->shared()->set_length(1);
4045     InstallWithIntrinsicDefaultProto(
4046         isolate, async_generator_function_function,
4047         Context::ASYNC_GENERATOR_FUNCTION_FUNCTION_INDEX);
4048 
4049     JSObject::ForceSetPrototype(async_generator_function_function,
4050                                 isolate->function_function());
4051 
4052     JSObject::AddProperty(
4053         isolate, async_generator_function_prototype,
4054         factory->constructor_string(), async_generator_function_function,
4055         static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
4056 
4057     native_context->async_generator_function_map()->SetConstructor(
4058         *async_generator_function_function);
4059   }
4060 
4061   {  // -- S e t I t e r a t o r
4062     Handle<String> name = factory->SetIterator_string();
4063 
4064     // Setup %SetIteratorPrototype%.
4065     Handle<JSObject> prototype =
4066         factory->NewJSObject(isolate->object_function(), TENURED);
4067     JSObject::ForceSetPrototype(prototype, iterator_prototype);
4068 
4069     // Install the @@toStringTag property on the {prototype}.
4070     JSObject::AddProperty(
4071         isolate, prototype, factory->to_string_tag_symbol(), name,
4072         static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
4073 
4074     // Install the next function on the {prototype}.
4075     SimpleInstallFunction(isolate, prototype, "next",
4076                           Builtins::kSetIteratorPrototypeNext, 0, true,
4077                           BuiltinFunctionId::kSetIteratorNext);
4078 
4079     // Setup SetIterator constructor.
4080     Handle<JSFunction> set_iterator_function = InstallFunction(
4081         isolate, container, "SetIterator", JS_SET_VALUE_ITERATOR_TYPE,
4082         JSSetIterator::kSize, 0, prototype, Builtins::kIllegal);
4083     set_iterator_function->shared()->set_native(false);
4084 
4085     Handle<Map> set_value_iterator_map(set_iterator_function->initial_map(),
4086                                        isolate);
4087     native_context->set_set_value_iterator_map(*set_value_iterator_map);
4088 
4089     Handle<Map> set_key_value_iterator_map = Map::Copy(
4090         isolate, set_value_iterator_map, "JS_SET_KEY_VALUE_ITERATOR_TYPE");
4091     set_key_value_iterator_map->set_instance_type(
4092         JS_SET_KEY_VALUE_ITERATOR_TYPE);
4093     native_context->set_set_key_value_iterator_map(*set_key_value_iterator_map);
4094   }
4095 
4096   {  // -- M a p I t e r a t o r
4097     Handle<String> name = factory->MapIterator_string();
4098 
4099     // Setup %MapIteratorPrototype%.
4100     Handle<JSObject> prototype =
4101         factory->NewJSObject(isolate->object_function(), TENURED);
4102     JSObject::ForceSetPrototype(prototype, iterator_prototype);
4103 
4104     // Install the @@toStringTag property on the {prototype}.
4105     JSObject::AddProperty(
4106         isolate, prototype, factory->to_string_tag_symbol(), name,
4107         static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
4108 
4109     // Install the next function on the {prototype}.
4110     SimpleInstallFunction(isolate, prototype, "next",
4111                           Builtins::kMapIteratorPrototypeNext, 0, true,
4112                           BuiltinFunctionId::kMapIteratorNext);
4113 
4114     // Setup MapIterator constructor.
4115     Handle<JSFunction> map_iterator_function = InstallFunction(
4116         isolate, container, "MapIterator", JS_MAP_KEY_ITERATOR_TYPE,
4117         JSMapIterator::kSize, 0, prototype, Builtins::kIllegal);
4118     map_iterator_function->shared()->set_native(false);
4119 
4120     Handle<Map> map_key_iterator_map(map_iterator_function->initial_map(),
4121                                      isolate);
4122     native_context->set_map_key_iterator_map(*map_key_iterator_map);
4123 
4124     Handle<Map> map_key_value_iterator_map = Map::Copy(
4125         isolate, map_key_iterator_map, "JS_MAP_KEY_VALUE_ITERATOR_TYPE");
4126     map_key_value_iterator_map->set_instance_type(
4127         JS_MAP_KEY_VALUE_ITERATOR_TYPE);
4128     native_context->set_map_key_value_iterator_map(*map_key_value_iterator_map);
4129 
4130     Handle<Map> map_value_iterator_map =
4131         Map::Copy(isolate, map_key_iterator_map, "JS_MAP_VALUE_ITERATOR_TYPE");
4132     map_value_iterator_map->set_instance_type(JS_MAP_VALUE_ITERATOR_TYPE);
4133     native_context->set_map_value_iterator_map(*map_value_iterator_map);
4134   }
4135 
4136   {  // -- A s y n c F u n c t i o n
4137     // Builtin functions for AsyncFunction.
4138     PrototypeIterator iter(isolate, native_context->async_function_map());
4139     Handle<JSObject> async_function_prototype(iter.GetCurrent<JSObject>(),
4140                                               isolate);
4141 
4142     Handle<JSFunction> async_function_constructor = InstallFunction(
4143         isolate, container, "AsyncFunction", JS_FUNCTION_TYPE,
4144         JSFunction::kSizeWithPrototype, 0, async_function_prototype,
4145         Builtins::kAsyncFunctionConstructor);
4146     async_function_constructor->set_prototype_or_initial_map(
4147         native_context->async_function_map());
4148     async_function_constructor->shared()->DontAdaptArguments();
4149     async_function_constructor->shared()->set_length(1);
4150     native_context->set_async_function_constructor(*async_function_constructor);
4151     JSObject::ForceSetPrototype(async_function_constructor,
4152                                 isolate->function_function());
4153 
4154     JSObject::AddProperty(
4155         isolate, async_function_prototype, factory->constructor_string(),
4156         async_function_constructor,
4157         static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
4158 
4159     JSFunction::SetPrototype(async_function_constructor,
4160                              async_function_prototype);
4161 
4162     {
4163       Handle<JSFunction> function =
4164           SimpleCreateFunction(isolate, factory->empty_string(),
4165                                Builtins::kAsyncFunctionAwaitCaught, 2, false);
4166       native_context->set_async_function_await_caught(*function);
4167     }
4168 
4169     {
4170       Handle<JSFunction> function =
4171           SimpleCreateFunction(isolate, factory->empty_string(),
4172                                Builtins::kAsyncFunctionAwaitUncaught, 2, false);
4173       native_context->set_async_function_await_uncaught(*function);
4174     }
4175 
4176     {
4177       Handle<SharedFunctionInfo> info = SimpleCreateSharedFunctionInfo(
4178           isolate, Builtins::kAsyncFunctionAwaitRejectClosure,
4179           factory->empty_string(), 1);
4180       native_context->set_async_function_await_reject_shared_fun(*info);
4181     }
4182 
4183     {
4184       Handle<SharedFunctionInfo> info = SimpleCreateSharedFunctionInfo(
4185           isolate, Builtins::kAsyncFunctionAwaitResolveClosure,
4186           factory->empty_string(), 1);
4187       native_context->set_async_function_await_resolve_shared_fun(*info);
4188     }
4189 
4190     {
4191       Handle<JSFunction> function =
4192           SimpleCreateFunction(isolate, factory->empty_string(),
4193                                Builtins::kAsyncFunctionPromiseCreate, 0, false);
4194       native_context->set_async_function_promise_create(*function);
4195     }
4196 
4197     {
4198       Handle<JSFunction> function = SimpleCreateFunction(
4199           isolate, factory->empty_string(),
4200           Builtins::kAsyncFunctionPromiseRelease, 2, false);
4201       native_context->set_async_function_promise_release(*function);
4202     }
4203   }
4204 
4205   {  // -- C a l l S i t e
4206     // Builtin functions for CallSite.
4207 
4208     // CallSites are a special case; the constructor is for our private use
4209     // only, therefore we set it up as a builtin that throws. Internally, we use
4210     // CallSiteUtils::Construct to create CallSite objects.
4211 
4212     Handle<JSFunction> callsite_fun = InstallFunction(
4213         isolate, container, "CallSite", JS_OBJECT_TYPE, JSObject::kHeaderSize,
4214         0, factory->the_hole_value(), Builtins::kUnsupportedThrower);
4215     callsite_fun->shared()->DontAdaptArguments();
4216     isolate->native_context()->set_callsite_function(*callsite_fun);
4217 
4218     {
4219       // Setup CallSite.prototype.
4220       Handle<JSObject> prototype(
4221           JSObject::cast(callsite_fun->instance_prototype()), isolate);
4222 
4223       struct FunctionInfo {
4224         const char* name;
4225         Builtins::Name id;
4226       };
4227 
4228       FunctionInfo infos[] = {
4229           {"getColumnNumber", Builtins::kCallSitePrototypeGetColumnNumber},
4230           {"getEvalOrigin", Builtins::kCallSitePrototypeGetEvalOrigin},
4231           {"getFileName", Builtins::kCallSitePrototypeGetFileName},
4232           {"getFunction", Builtins::kCallSitePrototypeGetFunction},
4233           {"getFunctionName", Builtins::kCallSitePrototypeGetFunctionName},
4234           {"getLineNumber", Builtins::kCallSitePrototypeGetLineNumber},
4235           {"getMethodName", Builtins::kCallSitePrototypeGetMethodName},
4236           {"getPosition", Builtins::kCallSitePrototypeGetPosition},
4237           {"getScriptNameOrSourceURL",
4238            Builtins::kCallSitePrototypeGetScriptNameOrSourceURL},
4239           {"getThis", Builtins::kCallSitePrototypeGetThis},
4240           {"getTypeName", Builtins::kCallSitePrototypeGetTypeName},
4241           {"isConstructor", Builtins::kCallSitePrototypeIsConstructor},
4242           {"isEval", Builtins::kCallSitePrototypeIsEval},
4243           {"isNative", Builtins::kCallSitePrototypeIsNative},
4244           {"isToplevel", Builtins::kCallSitePrototypeIsToplevel},
4245           {"toString", Builtins::kCallSitePrototypeToString}};
4246 
4247       PropertyAttributes attrs =
4248           static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY);
4249 
4250       Handle<JSFunction> fun;
4251       for (const FunctionInfo& info : infos) {
4252         SimpleInstallFunction(isolate, prototype, info.name, info.id, 0, true,
4253                               attrs);
4254       }
4255     }
4256   }
4257 }
4258 
4259 
4260 #define EMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(id) \
4261   void Genesis::InitializeGlobal_##id() {}
4262 
4263 EMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_do_expressions)
EMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_function_tostring)4264 EMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_function_tostring)
4265 EMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_public_fields)
4266 EMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_private_fields)
4267 EMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_static_fields)
4268 EMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_class_fields)
4269 EMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_dynamic_import)
4270 EMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_import_meta)
4271 EMPTY_INITIALIZE_GLOBAL_FOR_FEATURE(harmony_numeric_separator)
4272 
4273 #undef EMPTY_INITIALIZE_GLOBAL_FOR_FEATURE
4274 
4275 void Genesis::InitializeGlobal_harmony_global() {
4276   if (!FLAG_harmony_global) return;
4277 
4278   Factory* factory = isolate()->factory();
4279   Handle<JSGlobalObject> global(native_context()->global_object(), isolate());
4280   Handle<JSGlobalProxy> global_proxy(native_context()->global_proxy(),
4281                                      isolate());
4282   JSObject::AddProperty(isolate_, global, factory->globalThis_string(),
4283                         global_proxy, DONT_ENUM);
4284 }
4285 
InitializeGlobal_harmony_sharedarraybuffer()4286 void Genesis::InitializeGlobal_harmony_sharedarraybuffer() {
4287   if (!FLAG_harmony_sharedarraybuffer) return;
4288 
4289   Handle<JSGlobalObject> global(native_context()->global_object(), isolate());
4290   Factory* factory = isolate()->factory();
4291 
4292   {
4293     Handle<String> name = factory->InternalizeUtf8String("SharedArrayBuffer");
4294     JSObject::AddProperty(isolate_, global, name,
4295                           isolate()->shared_array_buffer_fun(), DONT_ENUM);
4296   }
4297 
4298   {
4299     Handle<String> name = factory->InternalizeUtf8String("Atomics");
4300     JSObject::AddProperty(isolate_, global, name, isolate()->atomics_object(),
4301                           DONT_ENUM);
4302     JSObject::AddProperty(
4303         isolate_, isolate()->atomics_object(), factory->to_string_tag_symbol(),
4304         name, static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
4305   }
4306 }
4307 
InitializeGlobal_harmony_string_trimming()4308 void Genesis::InitializeGlobal_harmony_string_trimming() {
4309   if (!FLAG_harmony_string_trimming) return;
4310 
4311   Handle<JSGlobalObject> global(native_context()->global_object(), isolate());
4312   Factory* factory = isolate()->factory();
4313 
4314   Handle<JSObject> string_prototype(
4315       native_context()->initial_string_prototype(), isolate());
4316 
4317   {
4318     Handle<String> trim_left_name = factory->InternalizeUtf8String("trimLeft");
4319     Handle<String> trim_start_name =
4320         factory->InternalizeUtf8String("trimStart");
4321     Handle<JSFunction> trim_left_fun = Handle<JSFunction>::cast(
4322         JSObject::GetProperty(isolate_, string_prototype, trim_left_name)
4323             .ToHandleChecked());
4324     JSObject::AddProperty(isolate_, string_prototype, trim_start_name,
4325                           trim_left_fun, DONT_ENUM);
4326     trim_left_fun->shared()->SetName(*trim_start_name);
4327   }
4328 
4329   {
4330     Handle<String> trim_right_name =
4331         factory->InternalizeUtf8String("trimRight");
4332     Handle<String> trim_end_name = factory->InternalizeUtf8String("trimEnd");
4333     Handle<JSFunction> trim_right_fun = Handle<JSFunction>::cast(
4334         JSObject::GetProperty(isolate_, string_prototype, trim_right_name)
4335             .ToHandleChecked());
4336     JSObject::AddProperty(isolate_, string_prototype, trim_end_name,
4337                           trim_right_fun, DONT_ENUM);
4338     trim_right_fun->shared()->SetName(*trim_end_name);
4339   }
4340 }
4341 
InitializeGlobal_harmony_array_prototype_values()4342 void Genesis::InitializeGlobal_harmony_array_prototype_values() {
4343   if (!FLAG_harmony_array_prototype_values) return;
4344   Handle<JSFunction> array_constructor(native_context()->array_function(),
4345                                        isolate());
4346   Handle<JSObject> array_prototype(
4347       JSObject::cast(array_constructor->instance_prototype()), isolate());
4348   Handle<Object> values_iterator =
4349       JSObject::GetProperty(isolate(), array_prototype,
4350                             factory()->iterator_symbol())
4351           .ToHandleChecked();
4352   DCHECK(values_iterator->IsJSFunction());
4353   JSObject::AddProperty(isolate(), array_prototype, factory()->values_string(),
4354                         values_iterator, DONT_ENUM);
4355 
4356   Handle<Object> unscopables =
4357       JSObject::GetProperty(isolate(), array_prototype,
4358                             factory()->unscopables_symbol())
4359           .ToHandleChecked();
4360   DCHECK(unscopables->IsJSObject());
4361   JSObject::AddProperty(isolate(), Handle<JSObject>::cast(unscopables),
4362                         factory()->values_string(), factory()->true_value(),
4363                         NONE);
4364 }
4365 
InitializeGlobal_harmony_array_flat()4366 void Genesis::InitializeGlobal_harmony_array_flat() {
4367   if (!FLAG_harmony_array_flat) return;
4368   Handle<JSFunction> array_constructor(native_context()->array_function(),
4369                                        isolate());
4370   Handle<JSObject> array_prototype(
4371       JSObject::cast(array_constructor->instance_prototype()), isolate());
4372   SimpleInstallFunction(isolate(), array_prototype, "flat",
4373                         Builtins::kArrayPrototypeFlat, 0, false, DONT_ENUM);
4374   SimpleInstallFunction(isolate(), array_prototype, "flatMap",
4375                         Builtins::kArrayPrototypeFlatMap, 1, false, DONT_ENUM);
4376 }
4377 
InitializeGlobal_harmony_symbol_description()4378 void Genesis::InitializeGlobal_harmony_symbol_description() {
4379   if (!FLAG_harmony_symbol_description) return;
4380 
4381   // Symbol.prototype.description
4382   Handle<JSFunction> symbol_fun(native_context()->symbol_function(), isolate());
4383   Handle<JSObject> symbol_prototype(
4384       JSObject::cast(symbol_fun->instance_prototype()), isolate());
4385   SimpleInstallGetter(isolate(), symbol_prototype,
4386                       factory()->InternalizeUtf8String("description"),
4387                       Builtins::kSymbolPrototypeDescriptionGetter, true);
4388 }
4389 
InitializeGlobal_harmony_string_matchall()4390 void Genesis::InitializeGlobal_harmony_string_matchall() {
4391   if (!FLAG_harmony_string_matchall) return;
4392 
4393   {  // String.prototype.matchAll
4394     Handle<JSFunction> string_fun(native_context()->string_function(),
4395                                   isolate());
4396     Handle<JSObject> string_prototype(
4397         JSObject::cast(string_fun->instance_prototype()), isolate());
4398 
4399     SimpleInstallFunction(isolate(), string_prototype, "matchAll",
4400                           Builtins::kStringPrototypeMatchAll, 1, true);
4401   }
4402 
4403   {  // RegExp.prototype[@@matchAll]
4404     Handle<JSFunction> regexp_fun(native_context()->regexp_function(),
4405                                   isolate());
4406     Handle<JSObject> regexp_prototype(
4407         JSObject::cast(regexp_fun->instance_prototype()), isolate());
4408     SimpleInstallFunction(isolate(), regexp_prototype,
4409                           factory()->match_all_symbol(), "[Symbol.matchAll]",
4410                           Builtins::kRegExpPrototypeMatchAll, 1, true);
4411     Handle<Map> regexp_prototype_map(regexp_prototype->map(), isolate());
4412     Map::SetShouldBeFastPrototypeMap(regexp_prototype_map, true, isolate());
4413     native_context()->set_regexp_prototype_map(*regexp_prototype_map);
4414   }
4415 
4416   {  // --- R e g E x p S t r i n g  I t e r a t o r ---
4417     Handle<JSObject> iterator_prototype(
4418         native_context()->initial_iterator_prototype(), isolate());
4419 
4420     Handle<JSObject> regexp_string_iterator_prototype =
4421         factory()->NewJSObject(isolate()->object_function(), TENURED);
4422     JSObject::ForceSetPrototype(regexp_string_iterator_prototype,
4423                                 iterator_prototype);
4424 
4425     JSObject::AddProperty(
4426         isolate(), regexp_string_iterator_prototype,
4427         factory()->to_string_tag_symbol(),
4428         factory()->NewStringFromAsciiChecked("RegExp String Iterator"),
4429         static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
4430 
4431     SimpleInstallFunction(isolate(), regexp_string_iterator_prototype, "next",
4432                           Builtins::kRegExpStringIteratorPrototypeNext, 0,
4433                           true);
4434 
4435     Handle<JSFunction> regexp_string_iterator_function = CreateFunction(
4436         isolate(), factory()->NewStringFromAsciiChecked("RegExpStringIterator"),
4437         JS_REGEXP_STRING_ITERATOR_TYPE, JSRegExpStringIterator::kSize, 0,
4438         regexp_string_iterator_prototype, Builtins::kIllegal);
4439     regexp_string_iterator_function->shared()->set_native(false);
4440     native_context()->set_initial_regexp_string_iterator_prototype_map(
4441         regexp_string_iterator_function->initial_map());
4442   }
4443 
4444   {  // @@matchAll Symbol
4445     Handle<JSFunction> symbol_fun(native_context()->symbol_function(),
4446                                   isolate());
4447     InstallConstant(isolate(), symbol_fun, "matchAll",
4448                     factory()->match_all_symbol());
4449   }
4450 }
4451 
InitializeGlobal_harmony_bigint()4452 void Genesis::InitializeGlobal_harmony_bigint() {
4453   Factory* factory = isolate()->factory();
4454   Handle<JSGlobalObject> global(native_context()->global_object(), isolate());
4455   if (!FLAG_harmony_bigint) {
4456     // Typed arrays are installed by default; remove them if the flag is off.
4457     CHECK(JSObject::DeleteProperty(
4458               global, factory->InternalizeUtf8String("BigInt64Array"))
4459               .ToChecked());
4460     CHECK(JSObject::DeleteProperty(
4461               global, factory->InternalizeUtf8String("BigUint64Array"))
4462               .ToChecked());
4463     return;
4464   }
4465 
4466   Handle<JSFunction> bigint_fun = InstallFunction(
4467       isolate(), global, "BigInt", JS_VALUE_TYPE, JSValue::kSize, 0,
4468       factory->the_hole_value(), Builtins::kBigIntConstructor);
4469   bigint_fun->shared()->set_builtin_function_id(
4470       BuiltinFunctionId::kBigIntConstructor);
4471   bigint_fun->shared()->DontAdaptArguments();
4472   bigint_fun->shared()->set_length(1);
4473   InstallWithIntrinsicDefaultProto(isolate(), bigint_fun,
4474                                    Context::BIGINT_FUNCTION_INDEX);
4475 
4476   // Install the properties of the BigInt constructor.
4477   // asUintN(bits, bigint)
4478   SimpleInstallFunction(isolate(), bigint_fun, "asUintN",
4479                         Builtins::kBigIntAsUintN, 2, false);
4480   // asIntN(bits, bigint)
4481   SimpleInstallFunction(isolate(), bigint_fun, "asIntN",
4482                         Builtins::kBigIntAsIntN, 2, false);
4483 
4484   // Set up the %BigIntPrototype%.
4485   Handle<JSObject> prototype(JSObject::cast(bigint_fun->instance_prototype()),
4486                              isolate());
4487   JSFunction::SetPrototype(bigint_fun, prototype);
4488 
4489   // Install the properties of the BigInt.prototype.
4490   // "constructor" is created implicitly by InstallFunction() above.
4491   // toLocaleString([reserved1 [, reserved2]])
4492   SimpleInstallFunction(isolate(), prototype, "toLocaleString",
4493                         Builtins::kBigIntPrototypeToLocaleString, 0, false);
4494   // toString([radix])
4495   SimpleInstallFunction(isolate(), prototype, "toString",
4496                         Builtins::kBigIntPrototypeToString, 0, false);
4497   // valueOf()
4498   SimpleInstallFunction(isolate(), prototype, "valueOf",
4499                         Builtins::kBigIntPrototypeValueOf, 0, false);
4500   // @@toStringTag
4501   JSObject::AddProperty(isolate(), prototype, factory->to_string_tag_symbol(),
4502                         factory->BigInt_string(),
4503                         static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
4504 
4505   // Install 64-bit DataView accessors.
4506   // TODO(jkummerow): Move these to the "DataView" section when dropping the
4507   // FLAG_harmony_bigint.
4508   Handle<JSObject> dataview_prototype(
4509       JSObject::cast(native_context()->data_view_fun()->instance_prototype()),
4510       isolate());
4511   SimpleInstallFunction(isolate(), dataview_prototype, "getBigInt64",
4512                         Builtins::kDataViewPrototypeGetBigInt64, 1, false);
4513   SimpleInstallFunction(isolate(), dataview_prototype, "setBigInt64",
4514                         Builtins::kDataViewPrototypeSetBigInt64, 2, false);
4515   SimpleInstallFunction(isolate(), dataview_prototype, "getBigUint64",
4516                         Builtins::kDataViewPrototypeGetBigUint64, 1, false);
4517   SimpleInstallFunction(isolate(), dataview_prototype, "setBigUint64",
4518                         Builtins::kDataViewPrototypeSetBigUint64, 2, false);
4519 }
4520 
InitializeGlobal_harmony_await_optimization()4521 void Genesis::InitializeGlobal_harmony_await_optimization() {
4522   if (!FLAG_harmony_await_optimization) return;
4523 
4524   // async/await
4525   Handle<JSFunction> await_caught_function = SimpleCreateFunction(
4526       isolate(), factory()->empty_string(),
4527       Builtins::kAsyncFunctionAwaitCaughtOptimized, 2, false);
4528   native_context()->set_async_function_await_caught(*await_caught_function);
4529 
4530   Handle<JSFunction> await_uncaught_function = SimpleCreateFunction(
4531       isolate(), factory()->empty_string(),
4532       Builtins::kAsyncFunctionAwaitUncaughtOptimized, 2, false);
4533   native_context()->set_async_function_await_uncaught(*await_uncaught_function);
4534 
4535   // async generators
4536   Handle<JSObject> async_iterator_prototype =
4537       factory()->NewJSObject(isolate()->object_function(), TENURED);
4538 
4539   SimpleInstallFunction(
4540       isolate(), async_iterator_prototype, factory()->async_iterator_symbol(),
4541       "[Symbol.asyncIterator]", Builtins::kReturnReceiver, 0, true);
4542 
4543   Handle<JSObject> async_from_sync_iterator_prototype =
4544       factory()->NewJSObject(isolate()->object_function(), TENURED);
4545   SimpleInstallFunction(
4546       isolate(), async_from_sync_iterator_prototype, factory()->next_string(),
4547       Builtins::kAsyncFromSyncIteratorPrototypeNextOptimized, 1, true);
4548   SimpleInstallFunction(
4549       isolate(), async_from_sync_iterator_prototype, factory()->return_string(),
4550       Builtins::kAsyncFromSyncIteratorPrototypeReturnOptimized, 1, true);
4551   SimpleInstallFunction(
4552       isolate(), async_from_sync_iterator_prototype, factory()->throw_string(),
4553       Builtins::kAsyncFromSyncIteratorPrototypeThrowOptimized, 1, true);
4554 
4555   JSObject::AddProperty(
4556       isolate(), async_from_sync_iterator_prototype,
4557       factory()->to_string_tag_symbol(),
4558       factory()->NewStringFromAsciiChecked("Async-from-Sync Iterator"),
4559       static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
4560 
4561   JSObject::ForceSetPrototype(async_from_sync_iterator_prototype,
4562                               async_iterator_prototype);
4563 
4564   Handle<Map> async_from_sync_iterator_map = factory()->NewMap(
4565       JS_ASYNC_FROM_SYNC_ITERATOR_TYPE, JSAsyncFromSyncIterator::kSize);
4566   Map::SetPrototype(isolate(), async_from_sync_iterator_map,
4567                     async_from_sync_iterator_prototype);
4568   native_context()->set_async_from_sync_iterator_map(
4569       *async_from_sync_iterator_map);
4570 }
4571 
4572 #ifdef V8_INTL_SUPPORT
InitializeGlobal_harmony_intl_list_format()4573 void Genesis::InitializeGlobal_harmony_intl_list_format() {
4574   if (!FLAG_harmony_intl_list_format) return;
4575   Handle<JSObject> intl = Handle<JSObject>::cast(
4576       JSReceiver::GetProperty(
4577           isolate(),
4578           Handle<JSReceiver>(native_context()->global_object(), isolate()),
4579           factory()->InternalizeUtf8String("Intl"))
4580           .ToHandleChecked());
4581 
4582   Handle<JSFunction> list_format_fun =
4583       InstallFunction(isolate(), intl, "ListFormat", JS_INTL_LIST_FORMAT_TYPE,
4584                       JSListFormat::kSize, 0, factory()->the_hole_value(),
4585                       Builtins::kListFormatConstructor);
4586   list_format_fun->shared()->set_length(0);
4587   list_format_fun->shared()->DontAdaptArguments();
4588 
4589   // Setup %ListFormatPrototype%.
4590   Handle<JSObject> prototype(
4591       JSObject::cast(list_format_fun->instance_prototype()), isolate());
4592 
4593   // Install the @@toStringTag property on the {prototype}.
4594   JSObject::AddProperty(isolate(), prototype, factory()->to_string_tag_symbol(),
4595                         factory()->NewStringFromStaticChars("Intl.ListFormat"),
4596                         static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
4597 
4598   SimpleInstallFunction(isolate(), prototype, "resolvedOptions",
4599                         Builtins::kListFormatPrototypeResolvedOptions, 0,
4600                         false);
4601   SimpleInstallFunction(isolate(), prototype, "format",
4602                         Builtins::kListFormatPrototypeFormat, 1, false);
4603   SimpleInstallFunction(isolate(), prototype, "formatToParts",
4604                         Builtins::kListFormatPrototypeFormatToParts, 1, false);
4605 }
4606 
InitializeGlobal_harmony_locale()4607 void Genesis::InitializeGlobal_harmony_locale() {
4608   if (!FLAG_harmony_locale) return;
4609 
4610   Handle<JSObject> intl = Handle<JSObject>::cast(
4611       JSReceiver::GetProperty(
4612           isolate(),
4613           Handle<JSReceiver>(native_context()->global_object(), isolate()),
4614           factory()->InternalizeUtf8String("Intl"))
4615           .ToHandleChecked());
4616 
4617   Handle<JSFunction> locale_fun = InstallFunction(
4618       isolate(), intl, "Locale", JS_INTL_LOCALE_TYPE, JSLocale::kSize, 0,
4619       factory()->the_hole_value(), Builtins::kLocaleConstructor);
4620   InstallWithIntrinsicDefaultProto(isolate(), locale_fun,
4621                                    Context::INTL_LOCALE_FUNCTION_INDEX);
4622   locale_fun->shared()->set_length(1);
4623   locale_fun->shared()->DontAdaptArguments();
4624 
4625   // Setup %LocalePrototype%.
4626   Handle<JSObject> prototype(JSObject::cast(locale_fun->instance_prototype()),
4627                              isolate());
4628 
4629   // Install the @@toStringTag property on the {prototype}.
4630   JSObject::AddProperty(isolate(), prototype, factory()->to_string_tag_symbol(),
4631                         factory()->NewStringFromAsciiChecked("Locale"),
4632                         static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
4633 
4634   SimpleInstallFunction(isolate(), prototype, "toString",
4635                         Builtins::kLocalePrototypeToString, 0, false);
4636   SimpleInstallFunction(isolate(), prototype, "maximize",
4637                         Builtins::kLocalePrototypeMaximize, 0, false);
4638   SimpleInstallFunction(isolate(), prototype, "minimize",
4639                         Builtins::kLocalePrototypeMinimize, 0, false);
4640   // Base locale getters.
4641   SimpleInstallGetter(isolate(), prototype,
4642                       factory()->InternalizeUtf8String("language"),
4643                       Builtins::kLocalePrototypeLanguage, true);
4644   SimpleInstallGetter(isolate(), prototype,
4645                       factory()->InternalizeUtf8String("script"),
4646                       Builtins::kLocalePrototypeScript, true);
4647   SimpleInstallGetter(isolate(), prototype,
4648                       factory()->InternalizeUtf8String("region"),
4649                       Builtins::kLocalePrototypeRegion, true);
4650   SimpleInstallGetter(isolate(), prototype,
4651                       factory()->InternalizeUtf8String("baseName"),
4652                       Builtins::kLocalePrototypeBaseName, true);
4653   // Unicode extension getters.
4654   SimpleInstallGetter(isolate(), prototype,
4655                       factory()->InternalizeUtf8String("calendar"),
4656                       Builtins::kLocalePrototypeCalendar, true);
4657   SimpleInstallGetter(isolate(), prototype,
4658                       factory()->InternalizeUtf8String("caseFirst"),
4659                       Builtins::kLocalePrototypeCaseFirst, true);
4660   SimpleInstallGetter(isolate(), prototype,
4661                       factory()->InternalizeUtf8String("collation"),
4662                       Builtins::kLocalePrototypeCollation, true);
4663   SimpleInstallGetter(isolate(), prototype,
4664                       factory()->InternalizeUtf8String("hourCycle"),
4665                       Builtins::kLocalePrototypeHourCycle, true);
4666   SimpleInstallGetter(isolate(), prototype,
4667                       factory()->InternalizeUtf8String("numeric"),
4668                       Builtins::kLocalePrototypeNumeric, true);
4669   SimpleInstallGetter(isolate(), prototype,
4670                       factory()->InternalizeUtf8String("numberingSystem"),
4671                       Builtins::kLocalePrototypeNumberingSystem, true);
4672 }
4673 
InitializeGlobal_harmony_intl_relative_time_format()4674 void Genesis::InitializeGlobal_harmony_intl_relative_time_format() {
4675   if (!FLAG_harmony_intl_relative_time_format) return;
4676   Handle<JSObject> intl = Handle<JSObject>::cast(
4677       JSReceiver::GetProperty(
4678           isolate(),
4679           Handle<JSReceiver>(native_context()->global_object(), isolate()),
4680           factory()->InternalizeUtf8String("Intl"))
4681           .ToHandleChecked());
4682 
4683   Handle<JSFunction> relative_time_format_fun = InstallFunction(
4684       isolate(), intl, "RelativeTimeFormat", JS_INTL_RELATIVE_TIME_FORMAT_TYPE,
4685       JSRelativeTimeFormat::kSize, 0, factory()->the_hole_value(),
4686       Builtins::kRelativeTimeFormatConstructor);
4687   relative_time_format_fun->shared()->set_length(0);
4688   relative_time_format_fun->shared()->DontAdaptArguments();
4689 
4690   // Setup %RelativeTimeFormatPrototype%.
4691   Handle<JSObject> prototype(
4692       JSObject::cast(relative_time_format_fun->instance_prototype()),
4693       isolate());
4694 
4695   // Install the @@toStringTag property on the {prototype}.
4696   JSObject::AddProperty(
4697       isolate(), prototype, factory()->to_string_tag_symbol(),
4698       factory()->NewStringFromStaticChars("Intl.RelativeTimeFormat"),
4699       static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
4700 
4701   SimpleInstallFunction(isolate(), prototype, "resolvedOptions",
4702                         Builtins::kRelativeTimeFormatPrototypeResolvedOptions,
4703                         0, false);
4704   SimpleInstallFunction(isolate(), prototype, "format",
4705                         Builtins::kRelativeTimeFormatPrototypeFormat, 2, false);
4706   SimpleInstallFunction(isolate(), prototype, "formatToParts",
4707                         Builtins::kRelativeTimeFormatPrototypeFormatToParts, 2,
4708                         false);
4709 }
4710 
4711 #endif  // V8_INTL_SUPPORT
4712 
CreateArrayBuffer(Handle<String> name,ArrayBufferKind array_buffer_kind)4713 Handle<JSFunction> Genesis::CreateArrayBuffer(
4714     Handle<String> name, ArrayBufferKind array_buffer_kind) {
4715   // Create the %ArrayBufferPrototype%
4716   // Setup the {prototype} with the given {name} for @@toStringTag.
4717   Handle<JSObject> prototype =
4718       factory()->NewJSObject(isolate()->object_function(), TENURED);
4719   JSObject::AddProperty(isolate(), prototype, factory()->to_string_tag_symbol(),
4720                         name,
4721                         static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY));
4722 
4723   // Allocate the constructor with the given {prototype}.
4724   Handle<JSFunction> array_buffer_fun =
4725       CreateFunction(isolate(), name, JS_ARRAY_BUFFER_TYPE,
4726                      JSArrayBuffer::kSizeWithEmbedderFields, 0, prototype,
4727                      Builtins::kArrayBufferConstructor);
4728   array_buffer_fun->shared()->DontAdaptArguments();
4729   array_buffer_fun->shared()->set_length(1);
4730 
4731   // Install the "constructor" property on the {prototype}.
4732   JSObject::AddProperty(isolate(), prototype, factory()->constructor_string(),
4733                         array_buffer_fun, DONT_ENUM);
4734 
4735   switch (array_buffer_kind) {
4736     case ARRAY_BUFFER:
4737       SimpleInstallFunction(isolate(), array_buffer_fun,
4738                             factory()->isView_string(),
4739                             Builtins::kArrayBufferIsView, 1, true, DONT_ENUM,
4740                             BuiltinFunctionId::kArrayBufferIsView);
4741 
4742       // Install the "byteLength" getter on the {prototype}.
4743       SimpleInstallGetter(isolate(), prototype, factory()->byte_length_string(),
4744                           Builtins::kArrayBufferPrototypeGetByteLength, false,
4745                           BuiltinFunctionId::kArrayBufferByteLength);
4746 
4747       SimpleInstallFunction(isolate(), prototype, "slice",
4748                             Builtins::kArrayBufferPrototypeSlice, 2, true);
4749       break;
4750 
4751     case SHARED_ARRAY_BUFFER:
4752       // Install the "byteLength" getter on the {prototype}.
4753       SimpleInstallGetter(isolate(), prototype, factory()->byte_length_string(),
4754                           Builtins::kSharedArrayBufferPrototypeGetByteLength,
4755                           false,
4756                           BuiltinFunctionId::kSharedArrayBufferByteLength);
4757 
4758       SimpleInstallFunction(isolate(), prototype, "slice",
4759                             Builtins::kSharedArrayBufferPrototypeSlice, 2,
4760                             true);
4761       break;
4762   }
4763 
4764   return array_buffer_fun;
4765 }
4766 
4767 
InstallInternalArray(Handle<JSObject> target,const char * name,ElementsKind elements_kind)4768 Handle<JSFunction> Genesis::InstallInternalArray(Handle<JSObject> target,
4769                                                  const char* name,
4770                                                  ElementsKind elements_kind) {
4771   // --- I n t e r n a l   A r r a y ---
4772   // An array constructor on the builtins object that works like
4773   // the public Array constructor, except that its prototype
4774   // doesn't inherit from Object.prototype.
4775   // To be used only for internal work by builtins. Instances
4776   // must not be leaked to user code.
4777   Handle<JSObject> prototype =
4778       factory()->NewJSObject(isolate()->object_function(), TENURED);
4779   Handle<JSFunction> array_function =
4780       InstallFunction(isolate(), target, name, JS_ARRAY_TYPE, JSArray::kSize, 0,
4781                       prototype, Builtins::kInternalArrayConstructor);
4782 
4783   array_function->shared()->DontAdaptArguments();
4784 
4785   Handle<Map> original_map(array_function->initial_map(), isolate());
4786   Handle<Map> initial_map = Map::Copy(isolate(), original_map, "InternalArray");
4787   initial_map->set_elements_kind(elements_kind);
4788   JSFunction::SetInitialMap(array_function, initial_map, prototype);
4789 
4790   // Make "length" magic on instances.
4791   Map::EnsureDescriptorSlack(isolate(), initial_map, 1);
4792 
4793   PropertyAttributes attribs = static_cast<PropertyAttributes>(
4794       DONT_ENUM | DONT_DELETE);
4795 
4796   {  // Add length.
4797     Descriptor d = Descriptor::AccessorConstant(
4798         factory()->length_string(), factory()->array_length_accessor(),
4799         attribs);
4800     initial_map->AppendDescriptor(&d);
4801   }
4802 
4803   return array_function;
4804 }
4805 
InstallNatives(GlobalContextType context_type)4806 bool Genesis::InstallNatives(GlobalContextType context_type) {
4807   HandleScope scope(isolate());
4808 
4809   // Set up the utils object as shared container between native scripts.
4810   Handle<JSObject> utils = factory()->NewJSObject(isolate()->object_function());
4811   JSObject::NormalizeProperties(utils, CLEAR_INOBJECT_PROPERTIES, 16,
4812                                 "utils container for native scripts");
4813   native_context()->set_natives_utils_object(*utils);
4814 
4815   // Set up the extras utils object as a shared container between native
4816   // scripts and extras. (Extras consume things added there by native scripts.)
4817   Handle<JSObject> extras_utils =
4818       factory()->NewJSObject(isolate()->object_function());
4819   native_context()->set_extras_utils_object(*extras_utils);
4820 
4821   InstallInternalArray(extras_utils, "InternalPackedArray", PACKED_ELEMENTS);
4822 
4823   // v8.createPromise(parent)
4824   Handle<JSFunction> promise_internal_constructor =
4825       SimpleCreateFunction(isolate(), factory()->empty_string(),
4826                            Builtins::kPromiseInternalConstructor, 1, true);
4827   promise_internal_constructor->shared()->set_native(false);
4828   InstallFunction(isolate(), extras_utils, promise_internal_constructor,
4829                   factory()->NewStringFromAsciiChecked("createPromise"));
4830 
4831   // v8.rejectPromise(promise, reason)
4832   Handle<JSFunction> promise_internal_reject =
4833       SimpleCreateFunction(isolate(), factory()->empty_string(),
4834                            Builtins::kPromiseInternalReject, 2, true);
4835   promise_internal_reject->shared()->set_native(false);
4836   InstallFunction(isolate(), extras_utils, promise_internal_reject,
4837                   factory()->NewStringFromAsciiChecked("rejectPromise"));
4838 
4839   // v8.resolvePromise(promise, resolution)
4840   Handle<JSFunction> promise_internal_resolve =
4841       SimpleCreateFunction(isolate(), factory()->empty_string(),
4842                            Builtins::kPromiseInternalResolve, 2, true);
4843   promise_internal_resolve->shared()->set_native(false);
4844   InstallFunction(isolate(), extras_utils, promise_internal_resolve,
4845                   factory()->NewStringFromAsciiChecked("resolvePromise"));
4846 
4847   InstallFunction(isolate(), extras_utils, isolate()->is_promise(),
4848                   factory()->NewStringFromAsciiChecked("isPromise"));
4849 
4850   int builtin_index = Natives::GetDebuggerCount();
4851   // Only run prologue.js at this point.
4852   DCHECK_EQ(builtin_index, Natives::GetIndex("prologue"));
4853   if (!Bootstrapper::CompileBuiltin(isolate(), builtin_index++)) return false;
4854 
4855   {
4856     // Builtin function for OpaqueReference -- a JSValue-based object,
4857     // that keeps its field isolated from JavaScript code. It may store
4858     // objects, that JavaScript code may not access.
4859     Handle<JSObject> prototype =
4860         factory()->NewJSObject(isolate()->object_function(), TENURED);
4861     Handle<JSFunction> opaque_reference_fun =
4862         CreateFunction(isolate(), factory()->empty_string(), JS_VALUE_TYPE,
4863                        JSValue::kSize, 0, prototype, Builtins::kIllegal);
4864     native_context()->set_opaque_reference_function(*opaque_reference_fun);
4865   }
4866 
4867   // InternalArrays should not use Smi-Only array optimizations. There are too
4868   // many places in the C++ runtime code (e.g. RegEx) that assume that
4869   // elements in InternalArrays can be set to non-Smi values without going
4870   // through a common bottleneck that would make the SMI_ONLY -> FAST_ELEMENT
4871   // transition easy to trap. Moreover, they rarely are smi-only.
4872   {
4873     HandleScope scope(isolate());
4874     Handle<JSObject> utils =
4875         Handle<JSObject>::cast(isolate()->natives_utils_object());
4876     Handle<JSFunction> array_function =
4877         InstallInternalArray(utils, "InternalArray", HOLEY_ELEMENTS);
4878     native_context()->set_internal_array_function(*array_function);
4879   }
4880 
4881   // Run the rest of the native scripts.
4882   while (builtin_index < Natives::GetBuiltinsCount()) {
4883     if (!Bootstrapper::CompileBuiltin(isolate(), builtin_index++)) return false;
4884   }
4885 
4886   if (!CallUtilsFunction(isolate(), "PostNatives")) return false;
4887   auto fast_template_instantiations_cache = isolate()->factory()->NewFixedArray(
4888       TemplateInfo::kFastTemplateInstantiationsCacheSize);
4889   native_context()->set_fast_template_instantiations_cache(
4890       *fast_template_instantiations_cache);
4891 
4892   auto slow_template_instantiations_cache = SimpleNumberDictionary::New(
4893       isolate(), ApiNatives::kInitialFunctionCacheSize);
4894   native_context()->set_slow_template_instantiations_cache(
4895       *slow_template_instantiations_cache);
4896 
4897   // Store the map for the %ObjectPrototype% after the natives has been compiled
4898   // and the Object function has been set up.
4899   {
4900     Handle<JSFunction> object_function(native_context()->object_function(),
4901                                        isolate());
4902     DCHECK(JSObject::cast(object_function->initial_map()->prototype())
4903                ->HasFastProperties());
4904     native_context()->set_object_function_prototype_map(
4905         HeapObject::cast(object_function->initial_map()->prototype())->map());
4906   }
4907 
4908   // Store the map for the %StringPrototype% after the natives has been compiled
4909   // and the String function has been set up.
4910   Handle<JSFunction> string_function(native_context()->string_function(),
4911                                      isolate());
4912   JSObject* string_function_prototype =
4913       JSObject::cast(string_function->initial_map()->prototype());
4914   DCHECK(string_function_prototype->HasFastProperties());
4915   native_context()->set_string_function_prototype_map(
4916       string_function_prototype->map());
4917 
4918   Handle<JSGlobalObject> global_object =
4919       handle(native_context()->global_object(), isolate());
4920 
4921   // Install Global.decodeURI.
4922   SimpleInstallFunction(isolate(), global_object, "decodeURI",
4923                         Builtins::kGlobalDecodeURI, 1, false,
4924                         BuiltinFunctionId::kGlobalDecodeURI);
4925 
4926   // Install Global.decodeURIComponent.
4927   SimpleInstallFunction(isolate(), global_object, "decodeURIComponent",
4928                         Builtins::kGlobalDecodeURIComponent, 1, false,
4929                         BuiltinFunctionId::kGlobalDecodeURIComponent);
4930 
4931   // Install Global.encodeURI.
4932   SimpleInstallFunction(isolate(), global_object, "encodeURI",
4933                         Builtins::kGlobalEncodeURI, 1, false,
4934                         BuiltinFunctionId::kGlobalEncodeURI);
4935 
4936   // Install Global.encodeURIComponent.
4937   SimpleInstallFunction(isolate(), global_object, "encodeURIComponent",
4938                         Builtins::kGlobalEncodeURIComponent, 1, false,
4939                         BuiltinFunctionId::kGlobalEncodeURIComponent);
4940 
4941   // Install Global.escape.
4942   SimpleInstallFunction(isolate(), global_object, "escape",
4943                         Builtins::kGlobalEscape, 1, false,
4944                         BuiltinFunctionId::kGlobalEscape);
4945 
4946   // Install Global.unescape.
4947   SimpleInstallFunction(isolate(), global_object, "unescape",
4948                         Builtins::kGlobalUnescape, 1, false,
4949                         BuiltinFunctionId::kGlobalUnescape);
4950 
4951   // Install Global.eval.
4952   {
4953     Handle<JSFunction> eval = SimpleInstallFunction(
4954         isolate(), global_object, factory()->eval_string(),
4955         Builtins::kGlobalEval, 1, false);
4956     native_context()->set_global_eval_fun(*eval);
4957   }
4958 
4959   // Install Global.isFinite
4960   SimpleInstallFunction(isolate(), global_object, "isFinite",
4961                         Builtins::kGlobalIsFinite, 1, true,
4962                         BuiltinFunctionId::kGlobalIsFinite);
4963 
4964   // Install Global.isNaN
4965   SimpleInstallFunction(isolate(), global_object, "isNaN",
4966                         Builtins::kGlobalIsNaN, 1, true,
4967                         BuiltinFunctionId::kGlobalIsNaN);
4968 
4969   // Install Array builtin functions.
4970   {
4971     Handle<JSFunction> array_constructor(native_context()->array_function(),
4972                                          isolate());
4973     Handle<JSArray> proto(JSArray::cast(array_constructor->prototype()),
4974                           isolate());
4975 
4976     // Verification of important array prototype properties.
4977     Object* length = proto->length();
4978     CHECK(length->IsSmi());
4979     CHECK_EQ(Smi::ToInt(length), 0);
4980     CHECK(proto->HasSmiOrObjectElements());
4981     // This is necessary to enable fast checks for absence of elements
4982     // on Array.prototype and below.
4983     proto->set_elements(ReadOnlyRoots(heap()).empty_fixed_array());
4984   }
4985 
4986   // Install InternalArray.prototype.concat
4987   {
4988     Handle<JSFunction> array_constructor(
4989         native_context()->internal_array_function(), isolate());
4990     Handle<JSObject> proto(JSObject::cast(array_constructor->prototype()),
4991                            isolate());
4992     SimpleInstallFunction(isolate(), proto, "concat", Builtins::kArrayConcat, 1,
4993                           false);
4994   }
4995 
4996   InstallBuiltinFunctionIds();
4997 
4998   // Create a map for accessor property descriptors (a variant of JSObject
4999   // that predefines four properties get, set, configurable and enumerable).
5000   {
5001     // AccessorPropertyDescriptor initial map.
5002     Handle<Map> map =
5003         factory()->NewMap(JS_OBJECT_TYPE, JSAccessorPropertyDescriptor::kSize,
5004                           TERMINAL_FAST_ELEMENTS_KIND, 4);
5005     // Create the descriptor array for the property descriptor object.
5006     Map::EnsureDescriptorSlack(isolate(), map, 4);
5007 
5008     {  // get
5009       Descriptor d =
5010           Descriptor::DataField(isolate(), factory()->get_string(),
5011                                 JSAccessorPropertyDescriptor::kGetIndex, NONE,
5012                                 Representation::Tagged());
5013       map->AppendDescriptor(&d);
5014     }
5015     {  // set
5016       Descriptor d =
5017           Descriptor::DataField(isolate(), factory()->set_string(),
5018                                 JSAccessorPropertyDescriptor::kSetIndex, NONE,
5019                                 Representation::Tagged());
5020       map->AppendDescriptor(&d);
5021     }
5022     {  // enumerable
5023       Descriptor d =
5024           Descriptor::DataField(isolate(), factory()->enumerable_string(),
5025                                 JSAccessorPropertyDescriptor::kEnumerableIndex,
5026                                 NONE, Representation::Tagged());
5027       map->AppendDescriptor(&d);
5028     }
5029     {  // configurable
5030       Descriptor d = Descriptor::DataField(
5031           isolate(), factory()->configurable_string(),
5032           JSAccessorPropertyDescriptor::kConfigurableIndex, NONE,
5033           Representation::Tagged());
5034       map->AppendDescriptor(&d);
5035     }
5036 
5037     Map::SetPrototype(isolate(), map, isolate()->initial_object_prototype());
5038     map->SetConstructor(native_context()->object_function());
5039 
5040     native_context()->set_accessor_property_descriptor_map(*map);
5041   }
5042 
5043   // Create a map for data property descriptors (a variant of JSObject
5044   // that predefines four properties value, writable, configurable and
5045   // enumerable).
5046   {
5047     // DataPropertyDescriptor initial map.
5048     Handle<Map> map =
5049         factory()->NewMap(JS_OBJECT_TYPE, JSDataPropertyDescriptor::kSize,
5050                           TERMINAL_FAST_ELEMENTS_KIND, 4);
5051     // Create the descriptor array for the property descriptor object.
5052     Map::EnsureDescriptorSlack(isolate(), map, 4);
5053 
5054     {  // value
5055       Descriptor d =
5056           Descriptor::DataField(isolate(), factory()->value_string(),
5057                                 JSDataPropertyDescriptor::kValueIndex, NONE,
5058                                 Representation::Tagged());
5059       map->AppendDescriptor(&d);
5060     }
5061     {  // writable
5062       Descriptor d =
5063           Descriptor::DataField(isolate(), factory()->writable_string(),
5064                                 JSDataPropertyDescriptor::kWritableIndex, NONE,
5065                                 Representation::Tagged());
5066       map->AppendDescriptor(&d);
5067     }
5068     {  // enumerable
5069       Descriptor d =
5070           Descriptor::DataField(isolate(), factory()->enumerable_string(),
5071                                 JSDataPropertyDescriptor::kEnumerableIndex,
5072                                 NONE, Representation::Tagged());
5073       map->AppendDescriptor(&d);
5074     }
5075     {  // configurable
5076       Descriptor d =
5077           Descriptor::DataField(isolate(), factory()->configurable_string(),
5078                                 JSDataPropertyDescriptor::kConfigurableIndex,
5079                                 NONE, Representation::Tagged());
5080       map->AppendDescriptor(&d);
5081     }
5082 
5083     Map::SetPrototype(isolate(), map, isolate()->initial_object_prototype());
5084     map->SetConstructor(native_context()->object_function());
5085 
5086     native_context()->set_data_property_descriptor_map(*map);
5087   }
5088 
5089   // Create a constructor for RegExp results (a variant of Array that
5090   // predefines the properties index, input, and groups).
5091   {
5092     // JSRegExpResult initial map.
5093 
5094     // Find global.Array.prototype to inherit from.
5095     Handle<JSFunction> array_constructor(native_context()->array_function(),
5096                                          isolate());
5097     Handle<JSObject> array_prototype(
5098         JSObject::cast(array_constructor->instance_prototype()), isolate());
5099 
5100     // Add initial map.
5101     Handle<Map> initial_map = factory()->NewMap(
5102         JS_ARRAY_TYPE, JSRegExpResult::kSize, TERMINAL_FAST_ELEMENTS_KIND,
5103         JSRegExpResult::kInObjectPropertyCount);
5104     initial_map->SetConstructor(*array_constructor);
5105 
5106     // Set prototype on map.
5107     initial_map->set_has_non_instance_prototype(false);
5108     Map::SetPrototype(isolate(), initial_map, array_prototype);
5109 
5110     // Update map with length accessor from Array and add "index", "input" and
5111     // "groups".
5112     Map::EnsureDescriptorSlack(isolate(), initial_map,
5113                                JSRegExpResult::kInObjectPropertyCount + 1);
5114 
5115     // length descriptor.
5116     {
5117       JSFunction* array_function = native_context()->array_function();
5118       Handle<DescriptorArray> array_descriptors(
5119           array_function->initial_map()->instance_descriptors(), isolate());
5120       Handle<String> length = factory()->length_string();
5121       int old = array_descriptors->SearchWithCache(
5122           isolate(), *length, array_function->initial_map());
5123       DCHECK_NE(old, DescriptorArray::kNotFound);
5124       Descriptor d = Descriptor::AccessorConstant(
5125           length, handle(array_descriptors->GetStrongValue(old), isolate()),
5126           array_descriptors->GetDetails(old).attributes());
5127       initial_map->AppendDescriptor(&d);
5128     }
5129 
5130     // index descriptor.
5131     {
5132       Descriptor d = Descriptor::DataField(isolate(), factory()->index_string(),
5133                                            JSRegExpResult::kIndexIndex, NONE,
5134                                            Representation::Tagged());
5135       initial_map->AppendDescriptor(&d);
5136     }
5137 
5138     // input descriptor.
5139     {
5140       Descriptor d = Descriptor::DataField(isolate(), factory()->input_string(),
5141                                            JSRegExpResult::kInputIndex, NONE,
5142                                            Representation::Tagged());
5143       initial_map->AppendDescriptor(&d);
5144     }
5145 
5146     // groups descriptor.
5147     {
5148       Descriptor d = Descriptor::DataField(
5149           isolate(), factory()->groups_string(), JSRegExpResult::kGroupsIndex,
5150           NONE, Representation::Tagged());
5151       initial_map->AppendDescriptor(&d);
5152     }
5153 
5154     native_context()->set_regexp_result_map(*initial_map);
5155   }
5156 
5157   // Add @@iterator method to the arguments object maps.
5158   {
5159     PropertyAttributes attribs = DONT_ENUM;
5160     Handle<AccessorInfo> arguments_iterator =
5161         factory()->arguments_iterator_accessor();
5162     {
5163       Descriptor d = Descriptor::AccessorConstant(factory()->iterator_symbol(),
5164                                                   arguments_iterator, attribs);
5165       Handle<Map> map(native_context()->sloppy_arguments_map(), isolate());
5166       Map::EnsureDescriptorSlack(isolate(), map, 1);
5167       map->AppendDescriptor(&d);
5168     }
5169     {
5170       Descriptor d = Descriptor::AccessorConstant(factory()->iterator_symbol(),
5171                                                   arguments_iterator, attribs);
5172       Handle<Map> map(native_context()->fast_aliased_arguments_map(),
5173                       isolate());
5174       Map::EnsureDescriptorSlack(isolate(), map, 1);
5175       map->AppendDescriptor(&d);
5176     }
5177     {
5178       Descriptor d = Descriptor::AccessorConstant(factory()->iterator_symbol(),
5179                                                   arguments_iterator, attribs);
5180       Handle<Map> map(native_context()->slow_aliased_arguments_map(),
5181                       isolate());
5182       Map::EnsureDescriptorSlack(isolate(), map, 1);
5183       map->AppendDescriptor(&d);
5184     }
5185     {
5186       Descriptor d = Descriptor::AccessorConstant(factory()->iterator_symbol(),
5187                                                   arguments_iterator, attribs);
5188       Handle<Map> map(native_context()->strict_arguments_map(), isolate());
5189       Map::EnsureDescriptorSlack(isolate(), map, 1);
5190       map->AppendDescriptor(&d);
5191     }
5192   }
5193 
5194   return true;
5195 }
5196 
InstallExtraNatives()5197 bool Genesis::InstallExtraNatives() {
5198   HandleScope scope(isolate());
5199 
5200   Handle<JSObject> extras_binding =
5201       factory()->NewJSObject(isolate()->object_function());
5202 
5203   // binding.isTraceCategoryEnabled(category)
5204   SimpleInstallFunction(isolate(), extras_binding, "isTraceCategoryEnabled",
5205                         Builtins::kIsTraceCategoryEnabled, 1, true);
5206 
5207   // binding.trace(phase, category, name, id, data)
5208   SimpleInstallFunction(isolate(), extras_binding, "trace", Builtins::kTrace, 5,
5209                         true);
5210 
5211   native_context()->set_extras_binding_object(*extras_binding);
5212 
5213   for (int i = ExtraNatives::GetDebuggerCount();
5214        i < ExtraNatives::GetBuiltinsCount(); i++) {
5215     if (!Bootstrapper::CompileExtraBuiltin(isolate(), i)) return false;
5216   }
5217 
5218   return true;
5219 }
5220 
5221 
InstallExperimentalExtraNatives()5222 bool Genesis::InstallExperimentalExtraNatives() {
5223   for (int i = ExperimentalExtraNatives::GetDebuggerCount();
5224        i < ExperimentalExtraNatives::GetBuiltinsCount(); i++) {
5225     if (!Bootstrapper::CompileExperimentalExtraBuiltin(isolate(), i))
5226       return false;
5227   }
5228 
5229   return true;
5230 }
5231 
5232 
InstallDebuggerNatives()5233 bool Genesis::InstallDebuggerNatives() {
5234   for (int i = 0; i < Natives::GetDebuggerCount(); ++i) {
5235     if (!Bootstrapper::CompileBuiltin(isolate(), i)) return false;
5236   }
5237   return true;
5238 }
5239 
InstallBuiltinFunctionId(Isolate * isolate,Handle<JSObject> holder,const char * function_name,BuiltinFunctionId id)5240 static void InstallBuiltinFunctionId(Isolate* isolate, Handle<JSObject> holder,
5241                                      const char* function_name,
5242                                      BuiltinFunctionId id) {
5243   Handle<Object> function_object =
5244       JSReceiver::GetProperty(isolate, holder, function_name).ToHandleChecked();
5245   Handle<JSFunction> function = Handle<JSFunction>::cast(function_object);
5246   function->shared()->set_builtin_function_id(id);
5247 }
5248 
5249 #define INSTALL_BUILTIN_ID(holder_expr, fun_name, name) \
5250   {#holder_expr, #fun_name, BuiltinFunctionId::k##name},
5251 
InstallBuiltinFunctionIds()5252 void Genesis::InstallBuiltinFunctionIds() {
5253   HandleScope scope(isolate());
5254   struct BuiltinFunctionIds {
5255     const char* holder_expr;
5256     const char* fun_name;
5257     BuiltinFunctionId id;
5258   };
5259 
5260   const BuiltinFunctionIds builtins[] = {
5261       FUNCTIONS_WITH_ID_LIST(INSTALL_BUILTIN_ID)};
5262 
5263   for (const BuiltinFunctionIds& builtin : builtins) {
5264     Handle<JSObject> holder = ResolveBuiltinIdHolder(
5265         isolate(), native_context(), builtin.holder_expr);
5266     InstallBuiltinFunctionId(isolate(), holder, builtin.fun_name, builtin.id);
5267   }
5268 }
5269 
5270 #undef INSTALL_BUILTIN_ID
5271 
5272 
InitializeNormalizedMapCaches()5273 void Genesis::InitializeNormalizedMapCaches() {
5274   Handle<NormalizedMapCache> cache = NormalizedMapCache::New(isolate());
5275   native_context()->set_normalized_map_cache(*cache);
5276 }
5277 
5278 
InstallExtensions(Handle<Context> native_context,v8::ExtensionConfiguration * extensions)5279 bool Bootstrapper::InstallExtensions(Handle<Context> native_context,
5280                                      v8::ExtensionConfiguration* extensions) {
5281   // Don't install extensions into the snapshot.
5282   if (isolate_->serializer_enabled()) return true;
5283   BootstrapperActive active(this);
5284   SaveContext saved_context(isolate_);
5285   isolate_->set_context(*native_context);
5286   return Genesis::InstallExtensions(isolate_, native_context, extensions) &&
5287          Genesis::InstallSpecialObjects(isolate_, native_context);
5288 }
5289 
InstallSpecialObjects(Isolate * isolate,Handle<Context> native_context)5290 bool Genesis::InstallSpecialObjects(Isolate* isolate,
5291                                     Handle<Context> native_context) {
5292   HandleScope scope(isolate);
5293 
5294   Handle<JSObject> Error = isolate->error_function();
5295   Handle<String> name = isolate->factory()->stackTraceLimit_string();
5296   Handle<Smi> stack_trace_limit(Smi::FromInt(FLAG_stack_trace_limit), isolate);
5297   JSObject::AddProperty(isolate, Error, name, stack_trace_limit, NONE);
5298 
5299   if (FLAG_expose_wasm) {
5300     // Install the internal data structures into the isolate and expose on
5301     // the global object.
5302     WasmJs::Install(isolate, true);
5303   } else if (FLAG_validate_asm) {
5304     // Install the internal data structures only; these are needed for asm.js
5305     // translated to WASM to work correctly.
5306     WasmJs::Install(isolate, false);
5307   }
5308 
5309   return true;
5310 }
5311 
5312 
Hash(RegisteredExtension * extension)5313 static uint32_t Hash(RegisteredExtension* extension) {
5314   return v8::internal::ComputePointerHash(extension);
5315 }
5316 
ExtensionStates()5317 Genesis::ExtensionStates::ExtensionStates() : map_(8) {}
5318 
get_state(RegisteredExtension * extension)5319 Genesis::ExtensionTraversalState Genesis::ExtensionStates::get_state(
5320     RegisteredExtension* extension) {
5321   base::HashMap::Entry* entry = map_.Lookup(extension, Hash(extension));
5322   if (entry == nullptr) {
5323     return UNVISITED;
5324   }
5325   return static_cast<ExtensionTraversalState>(
5326       reinterpret_cast<intptr_t>(entry->value));
5327 }
5328 
set_state(RegisteredExtension * extension,ExtensionTraversalState state)5329 void Genesis::ExtensionStates::set_state(RegisteredExtension* extension,
5330                                          ExtensionTraversalState state) {
5331   map_.LookupOrInsert(extension, Hash(extension))->value =
5332       reinterpret_cast<void*>(static_cast<intptr_t>(state));
5333 }
5334 
InstallExtensions(Isolate * isolate,Handle<Context> native_context,v8::ExtensionConfiguration * extensions)5335 bool Genesis::InstallExtensions(Isolate* isolate,
5336                                 Handle<Context> native_context,
5337                                 v8::ExtensionConfiguration* extensions) {
5338   ExtensionStates extension_states;  // All extensions have state UNVISITED.
5339   return InstallAutoExtensions(isolate, &extension_states) &&
5340          (!FLAG_expose_free_buffer ||
5341           InstallExtension(isolate, "v8/free-buffer", &extension_states)) &&
5342          (!FLAG_expose_gc ||
5343           InstallExtension(isolate, "v8/gc", &extension_states)) &&
5344          (!FLAG_expose_externalize_string ||
5345           InstallExtension(isolate, "v8/externalize", &extension_states)) &&
5346          (!FLAG_gc_stats ||
5347           InstallExtension(isolate, "v8/statistics", &extension_states)) &&
5348          (!FLAG_expose_trigger_failure ||
5349           InstallExtension(isolate, "v8/trigger-failure", &extension_states)) &&
5350          (!FLAG_trace_ignition_dispatches ||
5351           InstallExtension(isolate, "v8/ignition-statistics",
5352                            &extension_states)) &&
5353          InstallRequestedExtensions(isolate, extensions, &extension_states);
5354 }
5355 
5356 
InstallAutoExtensions(Isolate * isolate,ExtensionStates * extension_states)5357 bool Genesis::InstallAutoExtensions(Isolate* isolate,
5358                                     ExtensionStates* extension_states) {
5359   for (v8::RegisteredExtension* it = v8::RegisteredExtension::first_extension();
5360        it != nullptr; it = it->next()) {
5361     if (it->extension()->auto_enable() &&
5362         !InstallExtension(isolate, it, extension_states)) {
5363       return false;
5364     }
5365   }
5366   return true;
5367 }
5368 
5369 
InstallRequestedExtensions(Isolate * isolate,v8::ExtensionConfiguration * extensions,ExtensionStates * extension_states)5370 bool Genesis::InstallRequestedExtensions(Isolate* isolate,
5371                                          v8::ExtensionConfiguration* extensions,
5372                                          ExtensionStates* extension_states) {
5373   for (const char** it = extensions->begin(); it != extensions->end(); ++it) {
5374     if (!InstallExtension(isolate, *it, extension_states)) return false;
5375   }
5376   return true;
5377 }
5378 
5379 
5380 // Installs a named extension.  This methods is unoptimized and does
5381 // not scale well if we want to support a large number of extensions.
InstallExtension(Isolate * isolate,const char * name,ExtensionStates * extension_states)5382 bool Genesis::InstallExtension(Isolate* isolate,
5383                                const char* name,
5384                                ExtensionStates* extension_states) {
5385   for (v8::RegisteredExtension* it = v8::RegisteredExtension::first_extension();
5386        it != nullptr; it = it->next()) {
5387     if (strcmp(name, it->extension()->name()) == 0) {
5388       return InstallExtension(isolate, it, extension_states);
5389     }
5390   }
5391   return Utils::ApiCheck(false,
5392                          "v8::Context::New()",
5393                          "Cannot find required extension");
5394 }
5395 
5396 
InstallExtension(Isolate * isolate,v8::RegisteredExtension * current,ExtensionStates * extension_states)5397 bool Genesis::InstallExtension(Isolate* isolate,
5398                                v8::RegisteredExtension* current,
5399                                ExtensionStates* extension_states) {
5400   HandleScope scope(isolate);
5401 
5402   if (extension_states->get_state(current) == INSTALLED) return true;
5403   // The current node has already been visited so there must be a
5404   // cycle in the dependency graph; fail.
5405   if (!Utils::ApiCheck(extension_states->get_state(current) != VISITED,
5406                        "v8::Context::New()",
5407                        "Circular extension dependency")) {
5408     return false;
5409   }
5410   DCHECK(extension_states->get_state(current) == UNVISITED);
5411   extension_states->set_state(current, VISITED);
5412   v8::Extension* extension = current->extension();
5413   // Install the extension's dependencies
5414   for (int i = 0; i < extension->dependency_count(); i++) {
5415     if (!InstallExtension(isolate,
5416                           extension->dependencies()[i],
5417                           extension_states)) {
5418       return false;
5419     }
5420   }
5421   // We do not expect this to throw an exception. Change this if it does.
5422   bool result = CompileExtension(isolate, extension);
5423   DCHECK(isolate->has_pending_exception() != result);
5424   if (!result) {
5425     // We print out the name of the extension that fail to install.
5426     // When an error is thrown during bootstrapping we automatically print
5427     // the line number at which this happened to the console in the isolate
5428     // error throwing functionality.
5429     base::OS::PrintError("Error installing extension '%s'.\n",
5430                          current->extension()->name());
5431     isolate->clear_pending_exception();
5432   }
5433   extension_states->set_state(current, INSTALLED);
5434   return result;
5435 }
5436 
5437 
ConfigureGlobalObjects(v8::Local<v8::ObjectTemplate> global_proxy_template)5438 bool Genesis::ConfigureGlobalObjects(
5439     v8::Local<v8::ObjectTemplate> global_proxy_template) {
5440   Handle<JSObject> global_proxy(
5441       JSObject::cast(native_context()->global_proxy()), isolate());
5442   Handle<JSObject> global_object(
5443       JSObject::cast(native_context()->global_object()), isolate());
5444 
5445   if (!global_proxy_template.IsEmpty()) {
5446     // Configure the global proxy object.
5447     Handle<ObjectTemplateInfo> global_proxy_data =
5448         v8::Utils::OpenHandle(*global_proxy_template);
5449     if (!ConfigureApiObject(global_proxy, global_proxy_data)) return false;
5450 
5451     // Configure the global object.
5452     Handle<FunctionTemplateInfo> proxy_constructor(
5453         FunctionTemplateInfo::cast(global_proxy_data->constructor()),
5454         isolate());
5455     if (!proxy_constructor->prototype_template()->IsUndefined(isolate())) {
5456       Handle<ObjectTemplateInfo> global_object_data(
5457           ObjectTemplateInfo::cast(proxy_constructor->prototype_template()),
5458           isolate());
5459       if (!ConfigureApiObject(global_object, global_object_data)) return false;
5460     }
5461   }
5462 
5463   JSObject::ForceSetPrototype(global_proxy, global_object);
5464 
5465   native_context()->set_array_buffer_map(
5466       native_context()->array_buffer_fun()->initial_map());
5467 
5468   Handle<JSFunction> js_map_fun(native_context()->js_map_fun(), isolate());
5469   Handle<JSFunction> js_set_fun(native_context()->js_set_fun(), isolate());
5470   // Force the Map/Set constructor to fast properties, so that we can use the
5471   // fast paths for various things like
5472   //
5473   //   x instanceof Map
5474   //   x instanceof Set
5475   //
5476   // etc. We should probably come up with a more principled approach once
5477   // the JavaScript builtins are gone.
5478   JSObject::MigrateSlowToFast(js_map_fun, 0, "Bootstrapping");
5479   JSObject::MigrateSlowToFast(js_set_fun, 0, "Bootstrapping");
5480 
5481   native_context()->set_js_map_map(js_map_fun->initial_map());
5482   native_context()->set_js_set_map(js_set_fun->initial_map());
5483 
5484   return true;
5485 }
5486 
5487 
ConfigureApiObject(Handle<JSObject> object,Handle<ObjectTemplateInfo> object_template)5488 bool Genesis::ConfigureApiObject(Handle<JSObject> object,
5489                                  Handle<ObjectTemplateInfo> object_template) {
5490   DCHECK(!object_template.is_null());
5491   DCHECK(FunctionTemplateInfo::cast(object_template->constructor())
5492              ->IsTemplateFor(object->map()));;
5493 
5494   MaybeHandle<JSObject> maybe_obj =
5495       ApiNatives::InstantiateObject(object->GetIsolate(), object_template);
5496   Handle<JSObject> obj;
5497   if (!maybe_obj.ToHandle(&obj)) {
5498     DCHECK(isolate()->has_pending_exception());
5499     isolate()->clear_pending_exception();
5500     return false;
5501   }
5502   TransferObject(obj, object);
5503   return true;
5504 }
5505 
5506 
TransferNamedProperties(Handle<JSObject> from,Handle<JSObject> to)5507 void Genesis::TransferNamedProperties(Handle<JSObject> from,
5508                                       Handle<JSObject> to) {
5509   // If JSObject::AddProperty asserts due to already existing property,
5510   // it is likely due to both global objects sharing property name(s).
5511   // Merging those two global objects is impossible.
5512   // The global template must not create properties that already exist
5513   // in the snapshotted global object.
5514   if (from->HasFastProperties()) {
5515     Handle<DescriptorArray> descs =
5516         Handle<DescriptorArray>(from->map()->instance_descriptors(), isolate());
5517     for (int i = 0; i < from->map()->NumberOfOwnDescriptors(); i++) {
5518       PropertyDetails details = descs->GetDetails(i);
5519       if (details.location() == kField) {
5520         if (details.kind() == kData) {
5521           HandleScope inner(isolate());
5522           Handle<Name> key = Handle<Name>(descs->GetKey(i), isolate());
5523           FieldIndex index = FieldIndex::ForDescriptor(from->map(), i);
5524           Handle<Object> value =
5525               JSObject::FastPropertyAt(from, details.representation(), index);
5526           JSObject::AddProperty(isolate(), to, key, value,
5527                                 details.attributes());
5528         } else {
5529           DCHECK_EQ(kAccessor, details.kind());
5530           UNREACHABLE();
5531         }
5532 
5533       } else {
5534         DCHECK_EQ(kDescriptor, details.location());
5535         if (details.kind() == kData) {
5536           DCHECK(!FLAG_track_constant_fields);
5537           HandleScope inner(isolate());
5538           Handle<Name> key = Handle<Name>(descs->GetKey(i), isolate());
5539           Handle<Object> value(descs->GetStrongValue(i), isolate());
5540           JSObject::AddProperty(isolate(), to, key, value,
5541                                 details.attributes());
5542         } else {
5543           DCHECK_EQ(kAccessor, details.kind());
5544           Handle<Name> key(descs->GetKey(i), isolate());
5545           LookupIterator it(isolate(), to, key,
5546                             LookupIterator::OWN_SKIP_INTERCEPTOR);
5547           CHECK_NE(LookupIterator::ACCESS_CHECK, it.state());
5548           // If the property is already there we skip it
5549           if (it.IsFound()) continue;
5550           HandleScope inner(isolate());
5551           DCHECK(!to->HasFastProperties());
5552           // Add to dictionary.
5553           Handle<Object> value(descs->GetStrongValue(i), isolate());
5554           PropertyDetails d(kAccessor, details.attributes(),
5555                             PropertyCellType::kMutable);
5556           JSObject::SetNormalizedProperty(to, key, value, d);
5557         }
5558       }
5559     }
5560   } else if (from->IsJSGlobalObject()) {
5561     // Copy all keys and values in enumeration order.
5562     Handle<GlobalDictionary> properties(
5563         JSGlobalObject::cast(*from)->global_dictionary(), isolate());
5564     Handle<FixedArray> indices =
5565         GlobalDictionary::IterationIndices(isolate(), properties);
5566     for (int i = 0; i < indices->length(); i++) {
5567       int index = Smi::ToInt(indices->get(i));
5568       // If the property is already there we skip it.
5569       Handle<PropertyCell> cell(properties->CellAt(index), isolate());
5570       Handle<Name> key(cell->name(), isolate());
5571       LookupIterator it(isolate(), to, key,
5572                         LookupIterator::OWN_SKIP_INTERCEPTOR);
5573       CHECK_NE(LookupIterator::ACCESS_CHECK, it.state());
5574       if (it.IsFound()) continue;
5575       // Set the property.
5576       Handle<Object> value(cell->value(), isolate());
5577       if (value->IsTheHole(isolate())) continue;
5578       PropertyDetails details = cell->property_details();
5579       if (details.kind() != kData) continue;
5580       JSObject::AddProperty(isolate(), to, key, value, details.attributes());
5581     }
5582   } else {
5583     // Copy all keys and values in enumeration order.
5584     Handle<NameDictionary> properties =
5585         Handle<NameDictionary>(from->property_dictionary(), isolate());
5586     Handle<FixedArray> key_indices =
5587         NameDictionary::IterationIndices(isolate(), properties);
5588     ReadOnlyRoots roots(isolate());
5589     for (int i = 0; i < key_indices->length(); i++) {
5590       int key_index = Smi::ToInt(key_indices->get(i));
5591       Object* raw_key = properties->KeyAt(key_index);
5592       DCHECK(properties->IsKey(roots, raw_key));
5593       DCHECK(raw_key->IsName());
5594       // If the property is already there we skip it.
5595       Handle<Name> key(Name::cast(raw_key), isolate());
5596       LookupIterator it(isolate(), to, key,
5597                         LookupIterator::OWN_SKIP_INTERCEPTOR);
5598       CHECK_NE(LookupIterator::ACCESS_CHECK, it.state());
5599       if (it.IsFound()) continue;
5600       // Set the property.
5601       Handle<Object> value =
5602           Handle<Object>(properties->ValueAt(key_index), isolate());
5603       DCHECK(!value->IsCell());
5604       DCHECK(!value->IsTheHole(isolate()));
5605       PropertyDetails details = properties->DetailsAt(key_index);
5606       DCHECK_EQ(kData, details.kind());
5607       JSObject::AddProperty(isolate(), to, key, value, details.attributes());
5608     }
5609   }
5610 }
5611 
5612 
TransferIndexedProperties(Handle<JSObject> from,Handle<JSObject> to)5613 void Genesis::TransferIndexedProperties(Handle<JSObject> from,
5614                                         Handle<JSObject> to) {
5615   // Cloning the elements array is sufficient.
5616   Handle<FixedArray> from_elements =
5617       Handle<FixedArray>(FixedArray::cast(from->elements()), isolate());
5618   Handle<FixedArray> to_elements = factory()->CopyFixedArray(from_elements);
5619   to->set_elements(*to_elements);
5620 }
5621 
5622 
TransferObject(Handle<JSObject> from,Handle<JSObject> to)5623 void Genesis::TransferObject(Handle<JSObject> from, Handle<JSObject> to) {
5624   HandleScope outer(isolate());
5625 
5626   DCHECK(!from->IsJSArray());
5627   DCHECK(!to->IsJSArray());
5628 
5629   TransferNamedProperties(from, to);
5630   TransferIndexedProperties(from, to);
5631 
5632   // Transfer the prototype (new map is needed).
5633   Handle<Object> proto(from->map()->prototype(), isolate());
5634   JSObject::ForceSetPrototype(to, proto);
5635 }
5636 
5637 
Genesis(Isolate * isolate,MaybeHandle<JSGlobalProxy> maybe_global_proxy,v8::Local<v8::ObjectTemplate> global_proxy_template,size_t context_snapshot_index,v8::DeserializeEmbedderFieldsCallback embedder_fields_deserializer,GlobalContextType context_type)5638 Genesis::Genesis(
5639     Isolate* isolate, MaybeHandle<JSGlobalProxy> maybe_global_proxy,
5640     v8::Local<v8::ObjectTemplate> global_proxy_template,
5641     size_t context_snapshot_index,
5642     v8::DeserializeEmbedderFieldsCallback embedder_fields_deserializer,
5643     GlobalContextType context_type)
5644     : isolate_(isolate), active_(isolate->bootstrapper()) {
5645   result_ = Handle<Context>::null();
5646   global_proxy_ = Handle<JSGlobalProxy>::null();
5647 
5648   // Before creating the roots we must save the context and restore it
5649   // on all function exits.
5650   SaveContext saved_context(isolate);
5651 
5652   // The deserializer needs to hook up references to the global proxy.
5653   // Create an uninitialized global proxy now if we don't have one
5654   // and initialize it later in CreateNewGlobals.
5655   Handle<JSGlobalProxy> global_proxy;
5656   if (!maybe_global_proxy.ToHandle(&global_proxy)) {
5657     int instance_size = 0;
5658     if (context_snapshot_index > 0) {
5659       // The global proxy function to reinitialize this global proxy is in the
5660       // context that is yet to be deserialized. We need to prepare a global
5661       // proxy of the correct size.
5662       Object* size = isolate->heap()->serialized_global_proxy_sizes()->get(
5663           static_cast<int>(context_snapshot_index) - 1);
5664       instance_size = Smi::ToInt(size);
5665     } else {
5666       instance_size = JSGlobalProxy::SizeWithEmbedderFields(
5667           global_proxy_template.IsEmpty()
5668               ? 0
5669               : global_proxy_template->InternalFieldCount());
5670     }
5671     global_proxy =
5672         isolate->factory()->NewUninitializedJSGlobalProxy(instance_size);
5673   }
5674 
5675   // We can only de-serialize a context if the isolate was initialized from
5676   // a snapshot. Otherwise we have to build the context from scratch.
5677   // Also create a context from scratch to expose natives, if required by flag.
5678   DCHECK(native_context_.is_null());
5679   if (isolate->initialized_from_snapshot()) {
5680     Handle<Context> context;
5681     if (Snapshot::NewContextFromSnapshot(isolate, global_proxy,
5682                                          context_snapshot_index,
5683                                          embedder_fields_deserializer)
5684             .ToHandle(&context)) {
5685       native_context_ = Handle<NativeContext>::cast(context);
5686     }
5687   }
5688 
5689   if (!native_context().is_null()) {
5690     AddToWeakNativeContextList(isolate, *native_context());
5691     isolate->set_context(*native_context());
5692     isolate->counters()->contexts_created_by_snapshot()->Increment();
5693 
5694     if (context_snapshot_index == 0) {
5695       Handle<JSGlobalObject> global_object =
5696           CreateNewGlobals(global_proxy_template, global_proxy);
5697       HookUpGlobalObject(global_object);
5698 
5699       if (!ConfigureGlobalObjects(global_proxy_template)) return;
5700     } else {
5701       // The global proxy needs to be integrated into the native context.
5702       HookUpGlobalProxy(global_proxy);
5703     }
5704     DCHECK(!global_proxy->IsDetachedFrom(native_context()->global_object()));
5705   } else {
5706     base::ElapsedTimer timer;
5707     if (FLAG_profile_deserialization) timer.Start();
5708     DCHECK_EQ(0u, context_snapshot_index);
5709     // We get here if there was no context snapshot.
5710     CreateRoots();
5711     Handle<JSFunction> empty_function = CreateEmptyFunction();
5712     CreateSloppyModeFunctionMaps(empty_function);
5713     CreateStrictModeFunctionMaps(empty_function);
5714     CreateObjectFunction(empty_function);
5715     CreateIteratorMaps(empty_function);
5716     CreateAsyncIteratorMaps(empty_function);
5717     CreateAsyncFunctionMaps(empty_function);
5718     Handle<JSGlobalObject> global_object =
5719         CreateNewGlobals(global_proxy_template, global_proxy);
5720     InitializeGlobal(global_object, empty_function, context_type);
5721     InitializeNormalizedMapCaches();
5722 
5723     if (!InstallNatives(context_type)) return;
5724     if (!InstallExtraNatives()) return;
5725     if (!ConfigureGlobalObjects(global_proxy_template)) return;
5726 
5727     isolate->counters()->contexts_created_from_scratch()->Increment();
5728 
5729     if (FLAG_profile_deserialization) {
5730       double ms = timer.Elapsed().InMillisecondsF();
5731       i::PrintF("[Initializing context from scratch took %0.3f ms]\n", ms);
5732     }
5733   }
5734 
5735   // Install experimental natives. Do not include them into the
5736   // snapshot as we should be able to turn them off at runtime. Re-installing
5737   // them after they have already been deserialized would also fail.
5738   if (context_type == FULL_CONTEXT) {
5739     if (!isolate->serializer_enabled()) {
5740       InitializeExperimentalGlobal();
5741 
5742       if (FLAG_experimental_extras) {
5743         if (!InstallExperimentalExtraNatives()) return;
5744       }
5745 
5746       // Store String.prototype's map again in case it has been changed by
5747       // experimental natives.
5748       Handle<JSFunction> string_function(native_context()->string_function(),
5749                                          isolate);
5750       JSObject* string_function_prototype =
5751           JSObject::cast(string_function->initial_map()->prototype());
5752       DCHECK(string_function_prototype->HasFastProperties());
5753       native_context()->set_string_function_prototype_map(
5754           string_function_prototype->map());
5755     }
5756   } else if (context_type == DEBUG_CONTEXT) {
5757     DCHECK(!isolate->serializer_enabled());
5758     InitializeExperimentalGlobal();
5759     if (!InstallDebuggerNatives()) return;
5760   }
5761 
5762   if (FLAG_disallow_code_generation_from_strings) {
5763     native_context()->set_allow_code_gen_from_strings(
5764         ReadOnlyRoots(isolate).false_value());
5765   }
5766 
5767   ConfigureUtilsObject(context_type);
5768 
5769   // We created new functions, which may require debug instrumentation.
5770   if (isolate->debug()->is_active()) {
5771     isolate->debug()->InstallDebugBreakTrampoline();
5772   }
5773 
5774   native_context()->ResetErrorsThrown();
5775   result_ = native_context();
5776 }
5777 
Genesis(Isolate * isolate,MaybeHandle<JSGlobalProxy> maybe_global_proxy,v8::Local<v8::ObjectTemplate> global_proxy_template)5778 Genesis::Genesis(Isolate* isolate,
5779                  MaybeHandle<JSGlobalProxy> maybe_global_proxy,
5780                  v8::Local<v8::ObjectTemplate> global_proxy_template)
5781     : isolate_(isolate), active_(isolate->bootstrapper()) {
5782   result_ = Handle<Context>::null();
5783   global_proxy_ = Handle<JSGlobalProxy>::null();
5784 
5785   // Before creating the roots we must save the context and restore it
5786   // on all function exits.
5787   SaveContext saved_context(isolate);
5788 
5789   const int proxy_size = JSGlobalProxy::SizeWithEmbedderFields(
5790       global_proxy_template->InternalFieldCount());
5791 
5792   Handle<JSGlobalProxy> global_proxy;
5793   if (!maybe_global_proxy.ToHandle(&global_proxy)) {
5794     global_proxy = factory()->NewUninitializedJSGlobalProxy(proxy_size);
5795   }
5796 
5797   // Create a remote object as the global object.
5798   Handle<ObjectTemplateInfo> global_proxy_data =
5799       Utils::OpenHandle(*global_proxy_template);
5800   Handle<FunctionTemplateInfo> global_constructor(
5801       FunctionTemplateInfo::cast(global_proxy_data->constructor()), isolate);
5802 
5803   Handle<ObjectTemplateInfo> global_object_template(
5804       ObjectTemplateInfo::cast(global_constructor->prototype_template()),
5805       isolate);
5806   Handle<JSObject> global_object =
5807       ApiNatives::InstantiateRemoteObject(
5808           global_object_template).ToHandleChecked();
5809 
5810   // (Re)initialize the global proxy object.
5811   DCHECK_EQ(global_proxy_data->embedder_field_count(),
5812             global_proxy_template->InternalFieldCount());
5813   Handle<Map> global_proxy_map = isolate->factory()->NewMap(
5814       JS_GLOBAL_PROXY_TYPE, proxy_size, TERMINAL_FAST_ELEMENTS_KIND);
5815   global_proxy_map->set_is_access_check_needed(true);
5816   global_proxy_map->set_has_hidden_prototype(true);
5817   global_proxy_map->set_may_have_interesting_symbols(true);
5818 
5819   // A remote global proxy has no native context.
5820   global_proxy->set_native_context(ReadOnlyRoots(heap()).null_value());
5821 
5822   // Configure the hidden prototype chain of the global proxy.
5823   JSObject::ForceSetPrototype(global_proxy, global_object);
5824   global_proxy->map()->SetConstructor(*global_constructor);
5825   // TODO(dcheng): This is a hack. Why does this need to be manually called
5826   // here? Line 4812 should have taken care of it?
5827   global_proxy->map()->set_has_hidden_prototype(true);
5828 
5829   global_proxy_ = global_proxy;
5830 }
5831 
5832 // Support for thread preemption.
5833 
5834 // Reserve space for statics needing saving and restoring.
ArchiveSpacePerThread()5835 int Bootstrapper::ArchiveSpacePerThread() {
5836   return sizeof(NestingCounterType);
5837 }
5838 
5839 
5840 // Archive statics that are thread-local.
ArchiveState(char * to)5841 char* Bootstrapper::ArchiveState(char* to) {
5842   *reinterpret_cast<NestingCounterType*>(to) = nesting_;
5843   nesting_ = 0;
5844   return to + sizeof(NestingCounterType);
5845 }
5846 
5847 
5848 // Restore statics that are thread-local.
RestoreState(char * from)5849 char* Bootstrapper::RestoreState(char* from) {
5850   nesting_ = *reinterpret_cast<NestingCounterType*>(from);
5851   return from + sizeof(NestingCounterType);
5852 }
5853 
5854 
5855 // Called when the top-level V8 mutex is destroyed.
FreeThreadResources()5856 void Bootstrapper::FreeThreadResources() {
5857   DCHECK(!IsActive());
5858 }
5859 
5860 }  // namespace internal
5861 }  // namespace v8
5862