1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Copyright 2014 the V8 project authors. All rights reserved. 2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file. 4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/factory.h" 6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 7f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include "src/accessors.h" 8b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/allocation-site-scopes.h" 962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "src/ast/ast.h" 10b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/base/bits.h" 11014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#include "src/bootstrapper.h" 12f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include "src/compiler.h" 13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/conversions.h" 14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/isolate-inl.h" 15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#include "src/macro-assembler.h" 1662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "src/objects/module-info.h" 1762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "src/objects/scope-info.h" 18a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 19a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace v8 { 20a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blocknamespace internal { 21a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 22a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 23014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Calls the FUNCTION_CALL function and retries it up to three times 24014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// to guarantee that any allocations performed during the call will 25014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// succeed if there's enough memory. 26014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// 27014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Warning: Do not use the identifiers __object__, __maybe_object__, 28014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// __allocation__ or __scope__ in a call to this macro. 29014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 30014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define RETURN_OBJECT_UNLESS_RETRY(ISOLATE, TYPE) \ 31014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (__allocation__.To(&__object__)) { \ 32014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(__object__ != (ISOLATE)->heap()->exception()); \ 33014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Handle<TYPE>(TYPE::cast(__object__), ISOLATE); \ 34014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 35014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 36014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define CALL_HEAP_FUNCTION(ISOLATE, FUNCTION_CALL, TYPE) \ 37014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch do { \ 38014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch AllocationResult __allocation__ = FUNCTION_CALL; \ 39014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Object* __object__ = NULL; \ 40014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RETURN_OBJECT_UNLESS_RETRY(ISOLATE, TYPE) \ 41014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch /* Two GCs before panicking. In newspace will almost always succeed. */ \ 42014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (int __i__ = 0; __i__ < 2; __i__++) { \ 43f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch (ISOLATE)->heap()->CollectGarbage( \ 44f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch __allocation__.RetrySpace(), \ 45f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch GarbageCollectionReason::kAllocationFailure); \ 46014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch __allocation__ = FUNCTION_CALL; \ 47014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RETURN_OBJECT_UNLESS_RETRY(ISOLATE, TYPE) \ 48014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } \ 49014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch (ISOLATE)->counters()->gc_last_resort_from_handles()->Increment(); \ 50f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch (ISOLATE)->heap()->CollectAllAvailableGarbage( \ 51f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch GarbageCollectionReason::kLastResort); \ 52014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch { \ 53014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch AlwaysAllocateScope __scope__(ISOLATE); \ 54014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch __allocation__ = FUNCTION_CALL; \ 55014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } \ 56014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch RETURN_OBJECT_UNLESS_RETRY(ISOLATE, TYPE) \ 57014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch /* TODO(1181417): Fix this. */ \ 58014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch v8::internal::Heap::FatalProcessOutOfMemory("CALL_AND_RETRY_LAST", true); \ 59014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Handle<TYPE>(); \ 60014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } while (false) 61014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 62b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename T> 63b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<T> Factory::New(Handle<Map> map, AllocationSpace space) { 64b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CALL_HEAP_FUNCTION( 65b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate(), 66b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate()->heap()->Allocate(*map, space), 67b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T); 68b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 69b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 71b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename T> 72b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<T> Factory::New(Handle<Map> map, 73b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch AllocationSpace space, 74b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<AllocationSite> allocation_site) { 75b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CALL_HEAP_FUNCTION( 76b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate(), 77b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate()->heap()->Allocate(*map, space, *allocation_site), 78b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch T); 79b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 81b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 82b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<HeapObject> Factory::NewFillerObject(int size, 83b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool double_align, 84b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch AllocationSpace space) { 85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CALL_HEAP_FUNCTION( 86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate(), 87b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate()->heap()->AllocateFillerObject(size, double_align, space), 88b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch HeapObject); 89b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 90b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 91b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 92014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<PrototypeInfo> Factory::NewPrototypeInfo() { 93014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<PrototypeInfo> result = 94014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<PrototypeInfo>::cast(NewStruct(PROTOTYPE_INFO_TYPE)); 95014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch result->set_prototype_users(WeakFixedArray::Empty()); 96014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch result->set_registry_slot(PrototypeInfo::UNREGISTERED); 97c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch result->set_validity_cell(Smi::kZero); 9813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch result->set_bit_field(0); 99014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return result; 100014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 101014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 10262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochHandle<Tuple2> Factory::NewTuple2(Handle<Object> value1, 10362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<Object> value2) { 10462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<Tuple2> result = Handle<Tuple2>::cast(NewStruct(TUPLE2_TYPE)); 10562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch result->set_value1(*value1); 10662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch result->set_value2(*value2); 10762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return result; 10862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch} 10962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 110c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochHandle<Tuple3> Factory::NewTuple3(Handle<Object> value1, Handle<Object> value2, 111c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Handle<Object> value3) { 112c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Handle<Tuple3> result = Handle<Tuple3>::cast(NewStruct(TUPLE3_TYPE)); 113c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch result->set_value1(*value1); 114c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch result->set_value2(*value2); 115c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch result->set_value3(*value3); 116c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch return result; 117c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch} 118c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 119f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochHandle<ContextExtension> Factory::NewContextExtension( 120f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<ScopeInfo> scope_info, Handle<Object> extension) { 121f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<ContextExtension> result = 122f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<ContextExtension>::cast(NewStruct(CONTEXT_EXTENSION_TYPE)); 123014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch result->set_scope_info(*scope_info); 124014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch result->set_extension(*extension); 125014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return result; 126014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 127014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 12862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochHandle<ConstantElementsPair> Factory::NewConstantElementsPair( 12962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch ElementsKind elements_kind, Handle<FixedArrayBase> constant_values) { 13062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<ConstantElementsPair> result = Handle<ConstantElementsPair>::cast( 13162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch NewStruct(CONSTANT_ELEMENTS_PAIR_TYPE)); 13262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch result->set_elements_kind(elements_kind); 13362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch result->set_constant_values(*constant_values); 13462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return result; 13562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch} 13662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 137014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<Oddball> Factory::NewOddball(Handle<Map> map, const char* to_string, 138f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Handle<Object> to_number, 139014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch const char* type_of, byte kind) { 140014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Oddball> oddball = New<Oddball>(map, OLD_SPACE); 141f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Oddball::Initialize(isolate(), oddball, to_string, to_number, type_of, kind); 142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return oddball; 143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 144b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 146a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<FixedArray> Factory::NewFixedArray(int size, PretenureFlag pretenure) { 147b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(0 <= size); 14844f0eee88ff00398ff7f715fab053374d808c90dSteve Block CALL_HEAP_FUNCTION( 14944f0eee88ff00398ff7f715fab053374d808c90dSteve Block isolate(), 15044f0eee88ff00398ff7f715fab053374d808c90dSteve Block isolate()->heap()->AllocateFixedArray(size, pretenure), 15144f0eee88ff00398ff7f715fab053374d808c90dSteve Block FixedArray); 152a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 153a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 154c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochMaybeHandle<FixedArray> Factory::TryNewFixedArray(int size, 155c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch PretenureFlag pretenure) { 156c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DCHECK(0 <= size); 157c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch AllocationResult allocation = 158c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch isolate()->heap()->AllocateFixedArray(size, pretenure); 159c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Object* array = NULL; 160c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch if (!allocation.To(&array)) return MaybeHandle<FixedArray>(); 161c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch return Handle<FixedArray>(FixedArray::cast(array), isolate()); 162c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch} 163a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1646ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockHandle<FixedArray> Factory::NewFixedArrayWithHoles(int size, 1656ded16be15dd865a9b21ea304d5273c8be299c87Steve Block PretenureFlag pretenure) { 166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(0 <= size); 16744f0eee88ff00398ff7f715fab053374d808c90dSteve Block CALL_HEAP_FUNCTION( 16844f0eee88ff00398ff7f715fab053374d808c90dSteve Block isolate(), 169b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate()->heap()->AllocateFixedArrayWithFiller(size, 170b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch pretenure, 171b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch *the_hole_value()), 17244f0eee88ff00398ff7f715fab053374d808c90dSteve Block FixedArray); 173a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 174a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 175b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<FixedArray> Factory::NewUninitializedFixedArray(int size) { 176b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CALL_HEAP_FUNCTION( 177b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate(), 178b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate()->heap()->AllocateUninitializedFixedArray(size), 179b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FixedArray); 180b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 181b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 18262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochHandle<BoilerplateDescription> Factory::NewBoilerplateDescription( 18362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch int boilerplate, int all_properties, int index_keys, bool has_seen_proto) { 18462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DCHECK_GE(boilerplate, 0); 18562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DCHECK_GE(all_properties, index_keys); 18662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DCHECK_GE(index_keys, 0); 18762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 18862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch int backing_store_size = 18962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch all_properties - index_keys - (has_seen_proto ? 1 : 0); 19062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DCHECK_GE(backing_store_size, 0); 19162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch bool has_different_size_backing_store = boilerplate != backing_store_size; 19262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 19362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Space for name and value for every boilerplate property. 19462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch int size = 2 * boilerplate; 19562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 19662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (has_different_size_backing_store) { 19762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // An extra entry for the backing store size. 19862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch size++; 19962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } 20062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 20162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<BoilerplateDescription> description = 20262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<BoilerplateDescription>::cast(NewFixedArray(size, TENURED)); 20362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 20462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (has_different_size_backing_store) { 20562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DCHECK((boilerplate != (all_properties - index_keys)) || has_seen_proto); 20662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch description->set_backing_store_size(isolate(), backing_store_size); 20762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } 20862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return description; 20962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch} 210b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 211b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<FixedArrayBase> Factory::NewFixedDoubleArray(int size, 212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PretenureFlag pretenure) { 213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(0 <= size); 2143fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch CALL_HEAP_FUNCTION( 2153fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch isolate(), 2163fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch isolate()->heap()->AllocateUninitializedFixedDoubleArray(size, pretenure), 217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FixedArrayBase); 2183fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 2193fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 2203fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<FixedArrayBase> Factory::NewFixedDoubleArrayWithHoles( 222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int size, 223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PretenureFlag pretenure) { 224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(0 <= size); 225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<FixedArrayBase> array = NewFixedDoubleArray(size, pretenure); 226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (size > 0) { 22762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<FixedDoubleArray>::cast(array)->FillWithHoles(0, size); 228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return array; 230a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 231a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 232f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochHandle<FrameArray> Factory::NewFrameArray(int number_of_frames, 233f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch PretenureFlag pretenure) { 234f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DCHECK_LE(0, number_of_frames); 235f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<FixedArray> result = 236f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch NewFixedArrayWithHoles(FrameArray::LengthFor(number_of_frames)); 237c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch result->set(FrameArray::kFrameCountIndex, Smi::kZero); 238f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return Handle<FrameArray>::cast(result); 239f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch} 240a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<OrderedHashSet> Factory::NewOrderedHashSet() { 242958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return OrderedHashSet::Allocate(isolate(), OrderedHashSet::kMinCapacity); 2433ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 2443ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2453ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<OrderedHashMap> Factory::NewOrderedHashMap() { 247958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return OrderedHashMap::Allocate(isolate(), OrderedHashMap::kMinCapacity); 24869a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch} 24969a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 25069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 251b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<AccessorPair> Factory::NewAccessorPair() { 252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<AccessorPair> accessors = 253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<AccessorPair>::cast(NewStruct(ACCESSOR_PAIR_TYPE)); 254bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch accessors->set_getter(*null_value(), SKIP_WRITE_BARRIER); 255bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch accessors->set_setter(*null_value(), SKIP_WRITE_BARRIER); 256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return accessors; 257a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 258a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 259a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 260b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<TypeFeedbackInfo> Factory::NewTypeFeedbackInfo() { 261b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<TypeFeedbackInfo> info = 262b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<TypeFeedbackInfo>::cast(NewStruct(TYPE_FEEDBACK_INFO_TYPE)); 263b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch info->initialize_storage(); 264b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return info; 265b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 266b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 267b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 268b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Internalized strings are created in the old generation (data space). 269b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<String> Factory::InternalizeUtf8String(Vector<const char> string) { 270b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Utf8StringKey key(string, isolate()->heap()->HashSeed()); 271b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return InternalizeStringWithKey(&key); 272b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 273b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 274b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 275b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<String> Factory::InternalizeOneByteString(Vector<const uint8_t> string) { 276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch OneByteStringKey key(string, isolate()->heap()->HashSeed()); 277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return InternalizeStringWithKey(&key); 2783ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 2793ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 281b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<String> Factory::InternalizeOneByteString( 282b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<SeqOneByteString> string, int from, int length) { 283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SeqOneByteSubStringKey key(string, from, length); 284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return InternalizeStringWithKey(&key); 285a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 286a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<String> Factory::InternalizeTwoByteString(Vector<const uc16> string) { 289b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TwoByteStringKey key(string, isolate()->heap()->HashSeed()); 290b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return InternalizeStringWithKey(&key); 291257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 292257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<class StringTableKey> 295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<String> Factory::InternalizeStringWithKey(StringTableKey* key) { 296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return StringTable::LookupKey(isolate(), key); 2979fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block} 2989fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 299257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 300b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMaybeHandle<String> Factory::NewStringFromOneByte(Vector<const uint8_t> string, 301b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PretenureFlag pretenure) { 302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int length = string.length(); 30362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (length == 0) return empty_string(); 304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (length == 1) return LookupSingleCharacterStringFromCode(string[0]); 305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<SeqOneByteString> result; 306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ASSIGN_RETURN_ON_EXCEPTION( 307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate(), 308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result, 309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch NewRawOneByteString(string.length(), pretenure), 310b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch String); 311b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 312b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DisallowHeapAllocation no_gc; 313b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Copy the characters into the new object. 314b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CopyChars(SeqOneByteString::cast(*result)->GetChars(), 315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch string.start(), 316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch length); 317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 318257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 319257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMaybeHandle<String> Factory::NewStringFromUtf8(Vector<const char> string, 321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PretenureFlag pretenure) { 322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Check for ASCII first since this is the common case. 323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const char* start = string.start(); 324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int length = string.length(); 325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int non_ascii_start = String::NonAsciiStart(start, length); 326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (non_ascii_start >= length) { 327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // If the string is ASCII, we do not need to convert the characters 328b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // since UTF8 is backwards compatible with ASCII. 329b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return NewStringFromOneByte(Vector<const uint8_t>::cast(string), pretenure); 330b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 331257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 332b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Non-ASCII and we need to decode. 333b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Access<UnicodeCache::Utf8Decoder> 334b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch decoder(isolate()->unicode_cache()->utf8_decoder()); 335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch decoder->Reset(string.start() + non_ascii_start, 336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch length - non_ascii_start); 337014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int utf16_length = static_cast<int>(decoder->Utf16Length()); 338b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(utf16_length > 0); 339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Allocate string. 340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<SeqTwoByteString> result; 341b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ASSIGN_RETURN_ON_EXCEPTION( 342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate(), result, 343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch NewRawTwoByteString(non_ascii_start + utf16_length, pretenure), 344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch String); 345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Copy ASCII portion. 346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint16_t* data = result->GetChars(); 347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const char* ascii_data = string.start(); 348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < non_ascii_start; i++) { 349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch *data++ = *ascii_data++; 350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Now write the remainder. 352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch decoder->WriteUtf16(data, utf16_length); 353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 356c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochMaybeHandle<String> Factory::NewStringFromUtf8SubString( 357c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Handle<SeqOneByteString> str, int begin, int length, 358c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch PretenureFlag pretenure) { 359c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Check for ASCII first since this is the common case. 360c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch const char* start = reinterpret_cast<const char*>(str->GetChars() + begin); 361c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch int non_ascii_start = String::NonAsciiStart(start, length); 362c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch if (non_ascii_start >= length) { 363c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // If the string is ASCII, we can just make a substring. 364c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // TODO(v8): the pretenure flag is ignored in this case. 365c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch return NewSubString(str, begin, begin + length); 366c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch } 367c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 368c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Non-ASCII and we need to decode. 369c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Access<UnicodeCache::Utf8Decoder> decoder( 370c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch isolate()->unicode_cache()->utf8_decoder()); 371c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch decoder->Reset(start + non_ascii_start, length - non_ascii_start); 372c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch int utf16_length = static_cast<int>(decoder->Utf16Length()); 373c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DCHECK(utf16_length > 0); 374c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Allocate string. 375c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Handle<SeqTwoByteString> result; 376c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch ASSIGN_RETURN_ON_EXCEPTION( 377c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch isolate(), result, 378c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch NewRawTwoByteString(non_ascii_start + utf16_length, pretenure), String); 379c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 380c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Reset the decoder, because the original {str} may have moved. 381c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch const char* ascii_data = 382c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch reinterpret_cast<const char*>(str->GetChars() + begin); 383c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch decoder->Reset(ascii_data + non_ascii_start, length - non_ascii_start); 384c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Copy ASCII portion. 385c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch uint16_t* data = result->GetChars(); 386c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch for (int i = 0; i < non_ascii_start; i++) { 387c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch *data++ = *ascii_data++; 388c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch } 389c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Now write the remainder. 390c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch decoder->WriteUtf16(data, utf16_length); 391c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch return result; 392c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch} 393c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 39413e2dadd00298019ed862f2b2fc5068bba730bcfBen MurdochMaybeHandle<String> Factory::NewStringFromTwoByte(const uc16* string, 39513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch int length, 396b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PretenureFlag pretenure) { 39762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (length == 0) return empty_string(); 39813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch if (String::IsOneByte(string, length)) { 399b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (length == 1) return LookupSingleCharacterStringFromCode(string[0]); 400b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<SeqOneByteString> result; 401b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ASSIGN_RETURN_ON_EXCEPTION( 402b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate(), 403b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result, 404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch NewRawOneByteString(length, pretenure), 405b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch String); 40613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch CopyChars(result->GetChars(), string, length); 407b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 408b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 409b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<SeqTwoByteString> result; 410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ASSIGN_RETURN_ON_EXCEPTION( 411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate(), 412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result, 413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch NewRawTwoByteString(length, pretenure), 414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch String); 41513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch CopyChars(result->GetChars(), string, length); 416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 4189fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block} 4199fac840a46e8b7e26894f4792ba26dde14c56b04Steve Block 42013e2dadd00298019ed862f2b2fc5068bba730bcfBen MurdochMaybeHandle<String> Factory::NewStringFromTwoByte(Vector<const uc16> string, 42113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch PretenureFlag pretenure) { 42213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch return NewStringFromTwoByte(string.start(), string.length(), pretenure); 42313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch} 42413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 42513e2dadd00298019ed862f2b2fc5068bba730bcfBen MurdochMaybeHandle<String> Factory::NewStringFromTwoByte( 42613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch const ZoneVector<uc16>* string, PretenureFlag pretenure) { 42713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch return NewStringFromTwoByte(string->data(), static_cast<int>(string->size()), 42813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch pretenure); 42913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch} 430a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<String> Factory::NewInternalizedStringFromUtf8(Vector<const char> str, 432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int chars, 433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t hash_field) { 43444f0eee88ff00398ff7f715fab053374d808c90dSteve Block CALL_HEAP_FUNCTION( 43544f0eee88ff00398ff7f715fab053374d808c90dSteve Block isolate(), 436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate()->heap()->AllocateInternalizedStringFromUtf8( 437b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch str, chars, hash_field), 43844f0eee88ff00398ff7f715fab053374d808c90dSteve Block String); 439a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 440a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMUST_USE_RESULT Handle<String> Factory::NewOneByteInternalizedString( 443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Vector<const uint8_t> str, 444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t hash_field) { 44544f0eee88ff00398ff7f715fab053374d808c90dSteve Block CALL_HEAP_FUNCTION( 44644f0eee88ff00398ff7f715fab053374d808c90dSteve Block isolate(), 447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate()->heap()->AllocateOneByteInternalizedString(str, hash_field), 448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch String); 449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMUST_USE_RESULT Handle<String> Factory::NewOneByteInternalizedSubString( 453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<SeqOneByteString> string, int offset, int length, 454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t hash_field) { 455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CALL_HEAP_FUNCTION( 456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate(), isolate()->heap()->AllocateOneByteInternalizedString( 457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Vector<const uint8_t>(string->GetChars() + offset, length), 458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch hash_field), 45944f0eee88ff00398ff7f715fab053374d808c90dSteve Block String); 460a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 461a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 462a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMUST_USE_RESULT Handle<String> Factory::NewTwoByteInternalizedString( 464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Vector<const uc16> str, 465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint32_t hash_field) { 46644f0eee88ff00398ff7f715fab053374d808c90dSteve Block CALL_HEAP_FUNCTION( 46744f0eee88ff00398ff7f715fab053374d808c90dSteve Block isolate(), 468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate()->heap()->AllocateTwoByteInternalizedString(str, hash_field), 46944f0eee88ff00398ff7f715fab053374d808c90dSteve Block String); 470a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 471a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 472a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<String> Factory::NewInternalizedStringImpl( 474b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<String> string, int chars, uint32_t hash_field) { 475b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CALL_HEAP_FUNCTION( 476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate(), 477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate()->heap()->AllocateInternalizedStringImpl( 478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch *string, chars, hash_field), 479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch String); 480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 48262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochnamespace { 483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 48462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochMaybeHandle<Map> GetInternalizedStringMap(Factory* f, Handle<String> string) { 485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch switch (string->map()->instance_type()) { 48662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch case STRING_TYPE: 48762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return f->internalized_string_map(); 488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case ONE_BYTE_STRING_TYPE: 48962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return f->one_byte_internalized_string_map(); 49062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch case EXTERNAL_STRING_TYPE: 49162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return f->external_internalized_string_map(); 492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case EXTERNAL_ONE_BYTE_STRING_TYPE: 49362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return f->external_one_byte_internalized_string_map(); 494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case EXTERNAL_STRING_WITH_ONE_BYTE_DATA_TYPE: 49562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return f->external_internalized_string_with_one_byte_data_map(); 496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case SHORT_EXTERNAL_STRING_TYPE: 49762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return f->short_external_internalized_string_map(); 498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case SHORT_EXTERNAL_ONE_BYTE_STRING_TYPE: 49962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return f->short_external_one_byte_internalized_string_map(); 500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case SHORT_EXTERNAL_STRING_WITH_ONE_BYTE_DATA_TYPE: 50162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return f->short_external_internalized_string_with_one_byte_data_map(); 502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch default: return MaybeHandle<Map>(); // No match found. 503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 504b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 50662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch} // namespace 50762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 50862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochMaybeHandle<Map> Factory::InternalizedStringMapForString( 50962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<String> string) { 51062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // If the string is in new space it cannot be used as internalized. 51162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (isolate()->heap()->InNewSpace(*string)) return MaybeHandle<Map>(); 51262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 51362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return GetInternalizedStringMap(this, string); 51462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch} 51562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 51662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate <class StringClass> 51762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochHandle<StringClass> Factory::InternalizeExternalString(Handle<String> string) { 51862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<StringClass> cast_string = Handle<StringClass>::cast(string); 51962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<Map> map = GetInternalizedStringMap(this, string).ToHandleChecked(); 52062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<StringClass> external_string = New<StringClass>(map, OLD_SPACE); 52162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch external_string->set_length(cast_string->length()); 52262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch external_string->set_hash_field(cast_string->hash_field()); 52362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch external_string->set_resource(nullptr); 52462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch isolate()->heap()->RegisterExternalString(*external_string); 52562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return external_string; 52662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch} 52762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 52862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate Handle<ExternalOneByteString> 52962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Factory::InternalizeExternalString<ExternalOneByteString>(Handle<String>); 53062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochtemplate Handle<ExternalTwoByteString> 53162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Factory::InternalizeExternalString<ExternalTwoByteString>(Handle<String>); 532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 533b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMaybeHandle<SeqOneByteString> Factory::NewRawOneByteString( 534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int length, PretenureFlag pretenure) { 535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (length > String::kMaxLength || length < 0) { 536b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch THROW_NEW_ERROR(isolate(), NewInvalidStringLengthError(), SeqOneByteString); 537b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 53862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DCHECK(length > 0); // Use Factory::empty_string() instead. 53944f0eee88ff00398ff7f715fab053374d808c90dSteve Block CALL_HEAP_FUNCTION( 54044f0eee88ff00398ff7f715fab053374d808c90dSteve Block isolate(), 541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate()->heap()->AllocateRawOneByteString(length, pretenure), 542b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SeqOneByteString); 543ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke} 544ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke 545ac95265630a4e0c317a7a7201d17a57df7d9bcceLeon Clarke 546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMaybeHandle<SeqTwoByteString> Factory::NewRawTwoByteString( 547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int length, PretenureFlag pretenure) { 548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (length > String::kMaxLength || length < 0) { 549b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch THROW_NEW_ERROR(isolate(), NewInvalidStringLengthError(), SeqTwoByteString); 550b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 55162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DCHECK(length > 0); // Use Factory::empty_string() instead. 55244f0eee88ff00398ff7f715fab053374d808c90dSteve Block CALL_HEAP_FUNCTION( 55344f0eee88ff00398ff7f715fab053374d808c90dSteve Block isolate(), 55444f0eee88ff00398ff7f715fab053374d808c90dSteve Block isolate()->heap()->AllocateRawTwoByteString(length, pretenure), 5553fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch SeqTwoByteString); 556a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 557a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 558a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 559b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<String> Factory::LookupSingleCharacterStringFromCode(uint32_t code) { 560b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (code <= String::kMaxOneByteCharCodeU) { 561b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch { 562b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DisallowHeapAllocation no_allocation; 563b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Object* value = single_character_string_cache()->get(code); 564b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (value != *undefined_value()) { 565b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return handle(String::cast(value), isolate()); 566b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 567b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 568b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint8_t buffer[1]; 569b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch buffer[0] = static_cast<uint8_t>(code); 570b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<String> result = 571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch InternalizeOneByteString(Vector<const uint8_t>(buffer, 1)); 572b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch single_character_string_cache()->set(code, *result); 573b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 574b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(code <= String::kMaxUtf16CodeUnitU); 576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<SeqTwoByteString> result = NewRawTwoByteString(1).ToHandleChecked(); 578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result->SeqTwoByteStringSet(0, static_cast<uint16_t>(code)); 579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 580a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 581a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 582a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Returns true for a character in a range. Both limits are inclusive. 584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic inline bool Between(uint32_t character, uint32_t from, uint32_t to) { 585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // This makes uses of the the unsigned wraparound. 586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return character - from <= to - from; 587b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 588b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 589b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 590b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic inline Handle<String> MakeOrFindTwoCharacterString(Isolate* isolate, 591b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint16_t c1, 592b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint16_t c2) { 593b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Numeric strings have a different hash algorithm not known by 594b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // LookupTwoCharsStringIfExists, so we skip this step for such strings. 595b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!Between(c1, '0', '9') || !Between(c2, '0', '9')) { 596b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<String> result; 597b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (StringTable::LookupTwoCharsStringIfExists(isolate, c1, c2). 598b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ToHandle(&result)) { 599b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 600b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 601b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 602b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 603b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Now we know the length is 2, we might as well make use of that fact 604b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // when building the new string. 605b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (static_cast<unsigned>(c1 | c2) <= String::kMaxOneByteCharCodeU) { 606b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // We can do this. 607b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(base::bits::IsPowerOfTwo32(String::kMaxOneByteCharCodeU + 608b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1)); // because of this. 609b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<SeqOneByteString> str = 610b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate->factory()->NewRawOneByteString(2).ToHandleChecked(); 611b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint8_t* dest = str->GetChars(); 612b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch dest[0] = static_cast<uint8_t>(c1); 613b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch dest[1] = static_cast<uint8_t>(c2); 614b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return str; 615b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 616b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<SeqTwoByteString> str = 617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate->factory()->NewRawTwoByteString(2).ToHandleChecked(); 618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uc16* dest = str->GetChars(); 619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch dest[0] = c1; 620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch dest[1] = c2; 621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return str; 622b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 623b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 624b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 625b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 626b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochtemplate<typename SinkChar, typename StringType> 627b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<String> ConcatStringContent(Handle<StringType> result, 628b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<String> first, 629b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<String> second) { 630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DisallowHeapAllocation pointer_stays_valid; 631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SinkChar* sink = result->GetChars(); 632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch String::WriteToFlat(*first, sink, 0, first->length()); 633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch String::WriteToFlat(*second, sink + first->length(), 0, second->length()); 634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 635b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 636b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 637b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMaybeHandle<String> Factory::NewConsString(Handle<String> left, 639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<String> right) { 64062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (left->IsThinString()) { 64162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch left = handle(Handle<ThinString>::cast(left)->actual(), isolate()); 64262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } 64362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (right->IsThinString()) { 64462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch right = handle(Handle<ThinString>::cast(right)->actual(), isolate()); 64562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } 646b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int left_length = left->length(); 647b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (left_length == 0) return right; 648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int right_length = right->length(); 649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (right_length == 0) return left; 650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int length = left_length + right_length; 652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (length == 2) { 654b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint16_t c1 = left->Get(0); 655b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint16_t c2 = right->Get(0); 656b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return MakeOrFindTwoCharacterString(isolate(), c1, c2); 657b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 659b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Make sure that an out of memory exception is thrown if the length 660b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // of the new cons string is too large. 661b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (length > String::kMaxLength || length < 0) { 662b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch THROW_NEW_ERROR(isolate(), NewInvalidStringLengthError(), String); 663b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 664b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 665b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool left_is_one_byte = left->IsOneByteRepresentation(); 666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool right_is_one_byte = right->IsOneByteRepresentation(); 667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool is_one_byte = left_is_one_byte && right_is_one_byte; 668b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool is_one_byte_data_in_two_byte_string = false; 669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!is_one_byte) { 670b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // At least one of the strings uses two-byte representation so we 671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // can't use the fast case code for short one-byte strings below, but 672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // we can try to save memory if all chars actually fit in one-byte. 673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch is_one_byte_data_in_two_byte_string = 674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch left->HasOnlyOneByteChars() && right->HasOnlyOneByteChars(); 675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (is_one_byte_data_in_two_byte_string) { 676b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate()->counters()->string_add_runtime_ext_to_one_byte()->Increment(); 677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // If the resulting string is small make a flat string. 681b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (length < ConsString::kMinLength) { 682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Note that neither of the two inputs can be a slice because: 683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STATIC_ASSERT(ConsString::kMinLength <= SlicedString::kMinLength); 684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(left->IsFlat()); 685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(right->IsFlat()); 686b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 687b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STATIC_ASSERT(ConsString::kMinLength <= String::kMaxLength); 688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (is_one_byte) { 689b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<SeqOneByteString> result = 690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch NewRawOneByteString(length).ToHandleChecked(); 691b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DisallowHeapAllocation no_gc; 692b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint8_t* dest = result->GetChars(); 693b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Copy left part. 694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const uint8_t* src = 695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch left->IsExternalString() 696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ? Handle<ExternalOneByteString>::cast(left)->GetChars() 697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : Handle<SeqOneByteString>::cast(left)->GetChars(); 698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < left_length; i++) *dest++ = src[i]; 699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Copy right part. 700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch src = right->IsExternalString() 701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ? Handle<ExternalOneByteString>::cast(right)->GetChars() 702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : Handle<SeqOneByteString>::cast(right)->GetChars(); 703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < right_length; i++) *dest++ = src[i]; 704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return (is_one_byte_data_in_two_byte_string) 708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ? ConcatStringContent<uint8_t>( 709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch NewRawOneByteString(length).ToHandleChecked(), left, right) 710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : ConcatStringContent<uc16>( 711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch NewRawTwoByteString(length).ToHandleChecked(), left, right); 712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 714014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<ConsString> result = 715014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch (is_one_byte || is_one_byte_data_in_two_byte_string) 716014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ? New<ConsString>(cons_one_byte_string_map(), NEW_SPACE) 717014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch : New<ConsString>(cons_string_map(), NEW_SPACE); 718b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 719b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DisallowHeapAllocation no_gc; 720b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch WriteBarrierMode mode = result->GetWriteBarrierMode(no_gc); 721b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 722b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result->set_hash_field(String::kEmptyHashField); 723b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result->set_length(length); 724b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result->set_first(*left, mode); 725b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result->set_second(*right, mode); 726b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 727a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 728a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 729f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochHandle<String> Factory::NewSurrogatePairString(uint16_t lead, uint16_t trail) { 730f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DCHECK_GE(lead, 0xD800); 731f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DCHECK_LE(lead, 0xDBFF); 732f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DCHECK_GE(trail, 0xDC00); 733f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DCHECK_LE(trail, 0xDFFF); 734f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 735f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<SeqTwoByteString> str = 736f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch isolate()->factory()->NewRawTwoByteString(2).ToHandleChecked(); 737f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch uc16* dest = str->GetChars(); 738f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch dest[0] = lead; 739f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch dest[1] = trail; 740f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return str; 741f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch} 742a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 7433fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochHandle<String> Factory::NewProperSubString(Handle<String> str, 7443fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch int begin, 7453fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch int end) { 746b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#if VERIFY_HEAP 747b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (FLAG_verify_heap) str->StringVerify(); 748b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 749b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(begin > 0 || end < str->length()); 750b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 751b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch str = String::Flatten(str); 752b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 753b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int length = end - begin; 754b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (length <= 0) return empty_string(); 755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (length == 1) { 756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return LookupSingleCharacterStringFromCode(str->Get(begin)); 757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (length == 2) { 759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Optimization for 2-byte strings often used as keys in a decompression 760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // dictionary. Check whether we already have the string in the string 761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // table to prevent creation of many unnecessary strings. 762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint16_t c1 = str->Get(begin); 763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint16_t c2 = str->Get(begin + 1); 764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return MakeOrFindTwoCharacterString(isolate(), c1, c2); 765b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 767b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!FLAG_string_slices || length < SlicedString::kMinLength) { 768b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (str->IsOneByteRepresentation()) { 769b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<SeqOneByteString> result = 770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch NewRawOneByteString(length).ToHandleChecked(); 771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uint8_t* dest = result->GetChars(); 772b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DisallowHeapAllocation no_gc; 773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch String::WriteToFlat(*str, dest, begin, end); 774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 776b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<SeqTwoByteString> result = 777b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch NewRawTwoByteString(length).ToHandleChecked(); 778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch uc16* dest = result->GetChars(); 779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DisallowHeapAllocation no_gc; 780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch String::WriteToFlat(*str, dest, begin, end); 781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 784b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 785b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int offset = begin; 786b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 787b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (str->IsSlicedString()) { 788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<SlicedString> slice = Handle<SlicedString>::cast(str); 789b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch str = Handle<String>(slice->parent(), isolate()); 790b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch offset += slice->offset(); 791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 79262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (str->IsThinString()) { 79362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<ThinString> thin = Handle<ThinString>::cast(str); 79462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch str = handle(thin->actual(), isolate()); 79562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } 796b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(str->IsSeqString() || str->IsExternalString()); 798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Map> map = str->IsOneByteRepresentation() 799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ? sliced_one_byte_string_map() 800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : sliced_string_map(); 801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<SlicedString> slice = New<SlicedString>(map, NEW_SPACE); 802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch slice->set_hash_field(String::kEmptyHashField); 804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch slice->set_length(length); 805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch slice->set_parent(*str); 806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch slice->set_offset(offset); 807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return slice; 8083fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 8093fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 8103fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 811b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMaybeHandle<String> Factory::NewExternalStringFromOneByte( 812b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const ExternalOneByteString::Resource* resource) { 813b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch size_t length = resource->length(); 814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (length > static_cast<size_t>(String::kMaxLength)) { 815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch THROW_NEW_ERROR(isolate(), NewInvalidStringLengthError(), String); 816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 81762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (length == 0) return empty_string(); 818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 819014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Map> map; 820014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (resource->IsCompressible()) { 821014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // TODO(hajimehoshi): Rename this to 'uncached_external_one_byte_string_map' 822014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch map = short_external_one_byte_string_map(); 823014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 824014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch map = external_one_byte_string_map(); 825014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 826b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<ExternalOneByteString> external_string = 827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch New<ExternalOneByteString>(map, NEW_SPACE); 828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch external_string->set_length(static_cast<int>(length)); 829b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch external_string->set_hash_field(String::kEmptyHashField); 830b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch external_string->set_resource(resource); 831b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 832b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return external_string; 833a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 834a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 835a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochMaybeHandle<String> Factory::NewExternalStringFromTwoByte( 8373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch const ExternalTwoByteString::Resource* resource) { 838b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch size_t length = resource->length(); 839b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (length > static_cast<size_t>(String::kMaxLength)) { 840b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch THROW_NEW_ERROR(isolate(), NewInvalidStringLengthError(), String); 841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 84262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (length == 0) return empty_string(); 843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // For small strings we check whether the resource contains only 845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // one byte characters. If yes, we use a different string map. 846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch static const size_t kOneByteCheckLengthLimit = 32; 847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool is_one_byte = length <= kOneByteCheckLengthLimit && 848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch String::IsOneByte(resource->data(), static_cast<int>(length)); 849014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Map> map; 850014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (resource->IsCompressible()) { 851014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // TODO(hajimehoshi): Rename these to 'uncached_external_string_...'. 852014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch map = is_one_byte ? short_external_string_with_one_byte_data_map() 853014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch : short_external_string_map(); 854014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 855014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch map = is_one_byte ? external_string_with_one_byte_data_map() 856014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch : external_string_map(); 857014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<ExternalTwoByteString> external_string = 859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch New<ExternalTwoByteString>(map, NEW_SPACE); 860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch external_string->set_length(static_cast<int>(length)); 861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch external_string->set_hash_field(String::kEmptyHashField); 862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch external_string->set_resource(resource); 863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return external_string; 865a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 866a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 86713e2dadd00298019ed862f2b2fc5068bba730bcfBen MurdochHandle<ExternalOneByteString> Factory::NewNativeSourceString( 86813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch const ExternalOneByteString::Resource* resource) { 86913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch size_t length = resource->length(); 87013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch DCHECK_LE(length, static_cast<size_t>(String::kMaxLength)); 87113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 87213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Handle<Map> map = native_source_string_map(); 87313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Handle<ExternalOneByteString> external_string = 87413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch New<ExternalOneByteString>(map, OLD_SPACE); 87513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch external_string->set_length(static_cast<int>(length)); 87613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch external_string->set_hash_field(String::kEmptyHashField); 87713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch external_string->set_resource(resource); 87813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 87913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch return external_string; 88013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch} 88113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 882f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochHandle<JSStringIterator> Factory::NewJSStringIterator(Handle<String> string) { 883f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<Map> map(isolate()->native_context()->string_iterator_map(), 884f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch isolate()); 885f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<String> flat_string = String::Flatten(string); 886f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<JSStringIterator> iterator = 887f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<JSStringIterator>::cast(NewJSObjectFromMap(map)); 888f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch iterator->set_string(*flat_string); 889f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch iterator->set_index(0); 890f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 891f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return iterator; 892f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch} 893a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<Symbol> Factory::NewSymbol() { 89544f0eee88ff00398ff7f715fab053374d808c90dSteve Block CALL_HEAP_FUNCTION( 89644f0eee88ff00398ff7f715fab053374d808c90dSteve Block isolate(), 897b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate()->heap()->AllocateSymbol(), 898b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Symbol); 899b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 900b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 901b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 902b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<Symbol> Factory::NewPrivateSymbol() { 903b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Symbol> symbol = NewSymbol(); 904b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch symbol->set_is_private(true); 905b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return symbol; 906b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 907b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<Context> Factory::NewNativeContext() { 910014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<FixedArray> array = 911014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch NewFixedArray(Context::NATIVE_CONTEXT_SLOTS, TENURED); 912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch array->set_map_no_write_barrier(*native_context_map()); 913b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Context> context = Handle<Context>::cast(array); 914014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch context->set_native_context(*context); 915c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch context->set_errors_thrown(Smi::kZero); 916c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch context->set_math_random_index(Smi::kZero); 917014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<WeakCell> weak_cell = NewWeakCell(context); 918014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch context->set_self_weak_cell(*weak_cell); 919b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(context->IsNativeContext()); 920b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return context; 921b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 922b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 923b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 924958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierHandle<Context> Factory::NewScriptContext(Handle<JSFunction> function, 925b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<ScopeInfo> scope_info) { 926f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch DCHECK_EQ(scope_info->scope_type(), SCRIPT_SCOPE); 927b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<FixedArray> array = 928b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch NewFixedArray(scope_info->ContextLength(), TENURED); 929958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier array->set_map_no_write_barrier(*script_context_map()); 930b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Context> context = Handle<Context>::cast(array); 931b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch context->set_closure(*function); 932b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch context->set_previous(function->context()); 933b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch context->set_extension(*scope_info); 934014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch context->set_native_context(function->native_context()); 935958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DCHECK(context->IsScriptContext()); 936b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return context; 937b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 938b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 939b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 940958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierHandle<ScriptContextTable> Factory::NewScriptContextTable() { 941958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<FixedArray> array = NewFixedArray(1); 942958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier array->set_map_no_write_barrier(*script_context_table_map()); 943958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<ScriptContextTable> context_table = 944958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<ScriptContextTable>::cast(array); 945958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier context_table->set_used(0); 946958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return context_table; 947958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 948958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 949f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochHandle<Context> Factory::NewModuleContext(Handle<Module> module, 950f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<JSFunction> function, 951f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<ScopeInfo> scope_info) { 952f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch DCHECK_EQ(scope_info->scope_type(), MODULE_SCOPE); 953b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<FixedArray> array = 954b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch NewFixedArray(scope_info->ContextLength(), TENURED); 955b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch array->set_map_no_write_barrier(*module_context_map()); 956b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Context> context = Handle<Context>::cast(array); 957f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch context->set_closure(*function); 958f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch context->set_previous(function->context()); 959f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch context->set_extension(*module); 960f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch context->set_native_context(function->native_context()); 961f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DCHECK(context->IsModuleContext()); 962b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return context; 963a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 964a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 965a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<Context> Factory::NewFunctionContext(int length, 96662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<JSFunction> function, 96762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch ScopeType scope_type) { 96862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DCHECK(function->shared()->scope_info()->scope_type() == scope_type); 969b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(length >= Context::MIN_CONTEXT_SLOTS); 970b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<FixedArray> array = NewFixedArray(length); 97162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<Map> map; 97262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch switch (scope_type) { 97362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch case EVAL_SCOPE: 97462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch map = eval_context_map(); 97562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch break; 97662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch case FUNCTION_SCOPE: 97762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch map = function_context_map(); 97862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch break; 97962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch default: 98062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch UNREACHABLE(); 98162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } 98262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch array->set_map_no_write_barrier(*map); 983b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Context> context = Handle<Context>::cast(array); 984b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch context->set_closure(*function); 985b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch context->set_previous(function->context()); 986014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch context->set_extension(*the_hole_value()); 987014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch context->set_native_context(function->native_context()); 988b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return context; 989a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 990a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 9913fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochHandle<Context> Factory::NewCatchContext(Handle<JSFunction> function, 9923fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch Handle<Context> previous, 993f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<ScopeInfo> scope_info, 9943fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch Handle<String> name, 9953fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch Handle<Object> thrown_object) { 996b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch STATIC_ASSERT(Context::MIN_CONTEXT_SLOTS == Context::THROWN_OBJECT_INDEX); 997f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<ContextExtension> extension = NewContextExtension(scope_info, name); 998b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<FixedArray> array = NewFixedArray(Context::MIN_CONTEXT_SLOTS + 1); 999b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch array->set_map_no_write_barrier(*catch_context_map()); 1000b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Context> context = Handle<Context>::cast(array); 1001b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch context->set_closure(*function); 1002b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch context->set_previous(*previous); 1003f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch context->set_extension(*extension); 1004014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch context->set_native_context(previous->native_context()); 1005b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch context->set(Context::THROWN_OBJECT_INDEX, *thrown_object); 1006b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return context; 10073fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch} 10083fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 10093b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben MurdochHandle<Context> Factory::NewDebugEvaluateContext(Handle<Context> previous, 1010f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<ScopeInfo> scope_info, 10113b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Handle<JSReceiver> extension, 10123b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Handle<Context> wrapped, 10133b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Handle<StringSet> whitelist) { 10143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch STATIC_ASSERT(Context::WHITE_LIST_INDEX == Context::MIN_CONTEXT_SLOTS + 1); 1015f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DCHECK(scope_info->IsDebugEvaluateScope()); 1016f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<ContextExtension> context_extension = NewContextExtension( 1017f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch scope_info, extension.is_null() ? Handle<Object>::cast(undefined_value()) 1018f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch : Handle<Object>::cast(extension)); 10193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Handle<FixedArray> array = NewFixedArray(Context::MIN_CONTEXT_SLOTS + 2); 10203b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch array->set_map_no_write_barrier(*debug_evaluate_context_map()); 10213b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Handle<Context> c = Handle<Context>::cast(array); 10223b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch c->set_closure(wrapped.is_null() ? previous->closure() : wrapped->closure()); 10233b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch c->set_previous(*previous); 10243b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch c->set_native_context(previous->native_context()); 1025f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch c->set_extension(*context_extension); 10263b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch if (!wrapped.is_null()) c->set(Context::WRAPPED_CONTEXT_INDEX, *wrapped); 10273b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch if (!whitelist.is_null()) c->set(Context::WHITE_LIST_INDEX, *whitelist); 10283b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return c; 10293b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 10303fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch 10313fb3ca8c7ca439d408449a395897395c0faae8d1Ben MurdochHandle<Context> Factory::NewWithContext(Handle<JSFunction> function, 10323fb3ca8c7ca439d408449a395897395c0faae8d1Ben Murdoch Handle<Context> previous, 1033f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<ScopeInfo> scope_info, 1034b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSReceiver> extension) { 1035f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<ContextExtension> context_extension = 1036f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch NewContextExtension(scope_info, extension); 1037b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<FixedArray> array = NewFixedArray(Context::MIN_CONTEXT_SLOTS); 1038b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch array->set_map_no_write_barrier(*with_context_map()); 1039b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Context> context = Handle<Context>::cast(array); 1040b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch context->set_closure(*function); 1041b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch context->set_previous(*previous); 1042f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch context->set_extension(*context_extension); 1043014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch context->set_native_context(previous->native_context()); 1044b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return context; 1045a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1046a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1047a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1048b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<Context> Factory::NewBlockContext(Handle<JSFunction> function, 1049b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Context> previous, 1050b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<ScopeInfo> scope_info) { 1051f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch DCHECK_EQ(scope_info->scope_type(), BLOCK_SCOPE); 1052014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<FixedArray> array = NewFixedArray(scope_info->ContextLength()); 1053b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch array->set_map_no_write_barrier(*block_context_map()); 1054b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Context> context = Handle<Context>::cast(array); 1055b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch context->set_closure(*function); 1056b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch context->set_previous(*previous); 1057b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch context->set_extension(*scope_info); 1058014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch context->set_native_context(previous->native_context()); 1059b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return context; 106069a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch} 106169a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 1062a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<Struct> Factory::NewStruct(InstanceType type) { 106344f0eee88ff00398ff7f715fab053374d808c90dSteve Block CALL_HEAP_FUNCTION( 106444f0eee88ff00398ff7f715fab053374d808c90dSteve Block isolate(), 106544f0eee88ff00398ff7f715fab053374d808c90dSteve Block isolate()->heap()->AllocateStruct(type), 106644f0eee88ff00398ff7f715fab053374d808c90dSteve Block Struct); 1067a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1068a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1069b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<AliasedArgumentsEntry> Factory::NewAliasedArgumentsEntry( 1070b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int aliased_context_slot) { 1071b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<AliasedArgumentsEntry> entry = Handle<AliasedArgumentsEntry>::cast( 1072b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch NewStruct(ALIASED_ARGUMENTS_ENTRY_TYPE)); 1073b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch entry->set_aliased_context_slot(aliased_context_slot); 1074b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return entry; 1075b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1076b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1077b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1078109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben MurdochHandle<AccessorInfo> Factory::NewAccessorInfo() { 1079109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<AccessorInfo> info = 1080109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<AccessorInfo>::cast(NewStruct(ACCESSOR_INFO_TYPE)); 1081a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block info->set_flag(0); // Must clear the flag, it was initialized as undefined. 10823b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch info->set_is_sloppy(true); 1083a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return info; 1084a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1085a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1086a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1087a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<Script> Factory::NewScript(Handle<String> source) { 1088a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Create and initialize script object. 1089014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Heap* heap = isolate()->heap(); 1090a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Handle<Script> script = Handle<Script>::cast(NewStruct(SCRIPT_TYPE)); 1091a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block script->set_source(*source); 109244f0eee88ff00398ff7f715fab053374d808c90dSteve Block script->set_name(heap->undefined_value()); 1093014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch script->set_id(isolate()->heap()->NextScriptId()); 1094014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch script->set_line_offset(0); 1095014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch script->set_column_offset(0); 109644f0eee88ff00398ff7f715fab053374d808c90dSteve Block script->set_context_data(heap->undefined_value()); 1097014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch script->set_type(Script::TYPE_NORMAL); 1098958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier script->set_wrapper(heap->undefined_value()); 109944f0eee88ff00398ff7f715fab053374d808c90dSteve Block script->set_line_ends(heap->undefined_value()); 110044f0eee88ff00398ff7f715fab053374d808c90dSteve Block script->set_eval_from_shared(heap->undefined_value()); 1101bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch script->set_eval_from_position(0); 110262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch script->set_shared_function_infos(*empty_fixed_array(), SKIP_WRITE_BARRIER); 1103014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch script->set_flags(0); 1104a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1105014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch heap->set_script_list(*WeakFixedArray::Add(script_list(), script)); 1106a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return script; 1107a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1108a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1109a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1110257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochHandle<Foreign> Factory::NewForeign(Address addr, PretenureFlag pretenure) { 111144f0eee88ff00398ff7f715fab053374d808c90dSteve Block CALL_HEAP_FUNCTION(isolate(), 1112257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch isolate()->heap()->AllocateForeign(addr, pretenure), 1113257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Foreign); 1114a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1115a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1116a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1117257744e915dfc84d6d07a6b2accf8402d9ffc708Ben MurdochHandle<Foreign> Factory::NewForeign(const AccessorDescriptor* desc) { 1118257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch return NewForeign((Address) desc, TENURED); 1119a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1120a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1121a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1122a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<ByteArray> Factory::NewByteArray(int length, PretenureFlag pretenure) { 1123b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(0 <= length); 112444f0eee88ff00398ff7f715fab053374d808c90dSteve Block CALL_HEAP_FUNCTION( 112544f0eee88ff00398ff7f715fab053374d808c90dSteve Block isolate(), 112644f0eee88ff00398ff7f715fab053374d808c90dSteve Block isolate()->heap()->AllocateByteArray(length, pretenure), 112744f0eee88ff00398ff7f715fab053374d808c90dSteve Block ByteArray); 1128a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1129a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1130a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1131014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<BytecodeArray> Factory::NewBytecodeArray( 1132014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int length, const byte* raw_bytecodes, int frame_size, int parameter_count, 1133014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<FixedArray> constant_pool) { 1134014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(0 <= length); 1135014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CALL_HEAP_FUNCTION(isolate(), isolate()->heap()->AllocateBytecodeArray( 1136014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch length, raw_bytecodes, frame_size, 1137014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch parameter_count, *constant_pool), 1138014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch BytecodeArray); 1139014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 1140014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1141014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1142014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<FixedTypedArrayBase> Factory::NewFixedTypedArrayWithExternalPointer( 1143014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int length, ExternalArrayType array_type, void* external_pointer, 1144014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PretenureFlag pretenure) { 1145b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(0 <= length && length <= Smi::kMaxValue); 114644f0eee88ff00398ff7f715fab053374d808c90dSteve Block CALL_HEAP_FUNCTION( 1147014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch isolate(), isolate()->heap()->AllocateFixedTypedArrayWithExternalPointer( 1148014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch length, array_type, external_pointer, pretenure), 1149014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FixedTypedArrayBase); 11503ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block} 11513ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 11523ce2e2076e8e3e60cf1810eec160ea2d8557e9e7Steve Block 1153b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<FixedTypedArrayBase> Factory::NewFixedTypedArray( 1154014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int length, ExternalArrayType array_type, bool initialize, 1155b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PretenureFlag pretenure) { 1156b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(0 <= length && length <= Smi::kMaxValue); 1157014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CALL_HEAP_FUNCTION(isolate(), isolate()->heap()->AllocateFixedTypedArray( 1158014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch length, array_type, initialize, pretenure), 1159014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FixedTypedArrayBase); 1160b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch} 1161b0fe1620dcb4135ac3ab2d66ff93072373911299Ben Murdoch 1162b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<Cell> Factory::NewCell(Handle<Object> value) { 1163b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch AllowDeferredHandleDereference convert_to_cell; 116444f0eee88ff00398ff7f715fab053374d808c90dSteve Block CALL_HEAP_FUNCTION( 116544f0eee88ff00398ff7f715fab053374d808c90dSteve Block isolate(), 1166b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate()->heap()->AllocateCell(*value), 1167b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Cell); 1168a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1169a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 117062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochHandle<Cell> Factory::NewNoClosuresCell(Handle<Object> value) { 117162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<Cell> cell = NewCell(value); 117262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch cell->set_map_no_write_barrier(*no_closures_cell_map()); 117362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return cell; 117462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch} 117562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 117662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochHandle<Cell> Factory::NewOneClosureCell(Handle<Object> value) { 117762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<Cell> cell = NewCell(value); 117862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch cell->set_map_no_write_barrier(*one_closure_cell_map()); 117962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return cell; 118062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch} 118162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 118262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochHandle<Cell> Factory::NewManyClosuresCell(Handle<Object> value) { 118362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<Cell> cell = NewCell(value); 118462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch cell->set_map_no_write_barrier(*many_closures_cell_map()); 118562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return cell; 118662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch} 1187a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1188014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<PropertyCell> Factory::NewPropertyCell() { 118944f0eee88ff00398ff7f715fab053374d808c90dSteve Block CALL_HEAP_FUNCTION( 119044f0eee88ff00398ff7f715fab053374d808c90dSteve Block isolate(), 1191b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate()->heap()->AllocatePropertyCell(), 1192b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PropertyCell); 1193a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1194a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1195a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1196958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierHandle<WeakCell> Factory::NewWeakCell(Handle<HeapObject> value) { 1197014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // It is safe to dereference the value because we are embedding it 1198014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // in cell and not inspecting its fields. 1199958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier AllowDeferredHandleDereference convert_to_cell; 1200958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier CALL_HEAP_FUNCTION(isolate(), isolate()->heap()->AllocateWeakCell(*value), 1201958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier WeakCell); 1202958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 1203958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1204958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 1205014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<TransitionArray> Factory::NewTransitionArray(int capacity) { 1206014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CALL_HEAP_FUNCTION(isolate(), 1207014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch isolate()->heap()->AllocateTransitionArray(capacity), 1208014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch TransitionArray); 1209014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 1210014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1211014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1212b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<AllocationSite> Factory::NewAllocationSite() { 1213b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Map> map = allocation_site_map(); 1214014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<AllocationSite> site = New<AllocationSite>(map, OLD_SPACE); 1215b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch site->Initialize(); 1216b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1217b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Link the site 1218b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch site->set_weak_next(isolate()->heap()->allocation_sites_list()); 1219b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate()->heap()->set_allocation_sites_list(*site); 1220b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return site; 1221b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1222b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1223b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1224b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<Map> Factory::NewMap(InstanceType type, 1225b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int instance_size, 1226b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ElementsKind elements_kind) { 1227b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CALL_HEAP_FUNCTION( 1228b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate(), 1229b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate()->heap()->AllocateMap(type, instance_size, elements_kind), 1230b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Map); 1231a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1232a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 12338defd9ff6930b4e24729971a61cf7469daf119beSteve Block 1234b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<JSObject> Factory::CopyJSObject(Handle<JSObject> object) { 1235b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CALL_HEAP_FUNCTION(isolate(), 1236b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate()->heap()->CopyJSObject(*object, NULL), 1237b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch JSObject); 1238a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1239a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1240a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1241b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<JSObject> Factory::CopyJSObjectWithAllocationSite( 1242b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSObject> object, 1243b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<AllocationSite> site) { 1244b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CALL_HEAP_FUNCTION(isolate(), 1245b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate()->heap()->CopyJSObject( 1246b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch *object, 1247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch site.is_null() ? NULL : *site), 1248b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch JSObject); 12491e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block} 12501e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 12511e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block 1252b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<FixedArray> Factory::CopyFixedArrayWithMap(Handle<FixedArray> array, 1253b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Map> map) { 1254b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CALL_HEAP_FUNCTION(isolate(), 1255b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate()->heap()->CopyFixedArrayWithMap(*array, *map), 1256b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FixedArray); 1257a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1258a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1259a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1260014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<FixedArray> Factory::CopyFixedArrayAndGrow(Handle<FixedArray> array, 1261014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int grow_by, 1262014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PretenureFlag pretenure) { 1263014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CALL_HEAP_FUNCTION(isolate(), isolate()->heap()->CopyFixedArrayAndGrow( 1264014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch *array, grow_by, pretenure), 1265014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch FixedArray); 1266014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 1267014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1268109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben MurdochHandle<FixedArray> Factory::CopyFixedArrayUpTo(Handle<FixedArray> array, 1269109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch int new_len, 1270109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch PretenureFlag pretenure) { 1271109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch CALL_HEAP_FUNCTION(isolate(), isolate()->heap()->CopyFixedArrayUpTo( 1272109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch *array, new_len, pretenure), 1273109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch FixedArray); 1274109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch} 1275014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1276b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<FixedArray> Factory::CopyFixedArray(Handle<FixedArray> array) { 1277b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CALL_HEAP_FUNCTION(isolate(), 1278b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate()->heap()->CopyFixedArray(*array), 1279b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FixedArray); 12803ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 12813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 12823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1283b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<FixedArray> Factory::CopyAndTenureFixedCOWArray( 1284b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<FixedArray> array) { 1285b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(isolate()->heap()->InNewSpace(*array)); 1286b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CALL_HEAP_FUNCTION(isolate(), 1287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate()->heap()->CopyAndTenureFixedCOWArray(*array), 1288b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FixedArray); 1289a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1290a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1291a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1292b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<FixedDoubleArray> Factory::CopyFixedDoubleArray( 1293b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<FixedDoubleArray> array) { 1294b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CALL_HEAP_FUNCTION(isolate(), 1295b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate()->heap()->CopyFixedDoubleArray(*array), 1296b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch FixedDoubleArray); 1297b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 129844f0eee88ff00398ff7f715fab053374d808c90dSteve Block 12998f9999fcc44cfd4f5e1140c6678bbca4cf8ea1c7Ben Murdoch 1300a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<Object> Factory::NewNumber(double value, 1301a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block PretenureFlag pretenure) { 1302f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Materialize as a SMI if possible 1303f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch int32_t int_value; 1304f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch if (DoubleToSmiInteger(value, &int_value)) { 1305b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return handle(Smi::FromInt(int_value), isolate()); 1306b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1307b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1308b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Materialize the value in the heap. 1309b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return NewHeapNumber(value, IMMUTABLE, pretenure); 1310a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1311a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1312a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 13133ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHandle<Object> Factory::NewNumberFromInt(int32_t value, 13143ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch PretenureFlag pretenure) { 1315b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (Smi::IsValid(value)) return handle(Smi::FromInt(value), isolate()); 1316b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Bypass NewNumber to avoid various redundant checks. 1317b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return NewHeapNumber(FastI2D(value), IMMUTABLE, pretenure); 1318a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1319a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1320a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 13213ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHandle<Object> Factory::NewNumberFromUint(uint32_t value, 1322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PretenureFlag pretenure) { 1323b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int32_t int32v = static_cast<int32_t>(value); 1324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (int32v >= 0 && Smi::IsValid(int32v)) { 1325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return handle(Smi::FromInt(int32v), isolate()); 1326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return NewHeapNumber(FastUI2D(value), IMMUTABLE, pretenure); 1328a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1329a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 133062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochHandle<HeapNumber> Factory::NewHeapNumber(MutableMode mode, 1331b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PretenureFlag pretenure) { 133262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch CALL_HEAP_FUNCTION(isolate(), 133362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch isolate()->heap()->AllocateHeapNumber(mode, pretenure), 133462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch HeapNumber); 1335a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1336a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1337014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<Object> Factory::NewError(Handle<JSFunction> constructor, 1338014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MessageTemplate::Template template_index, 1339014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> arg0, Handle<Object> arg1, 1340014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> arg2) { 1341014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch HandleScope scope(isolate()); 1342014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (isolate()->bootstrapper()->IsActive()) { 1343014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // During bootstrapping we cannot construct error objects. 1344014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return scope.CloseAndEscape(NewStringFromAsciiChecked( 1345014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MessageTemplate::TemplateString(template_index))); 1346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1348014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (arg0.is_null()) arg0 = undefined_value(); 1349014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (arg1.is_null()) arg1 = undefined_value(); 1350014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (arg2.is_null()) arg2 = undefined_value(); 1351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> result; 1353f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch if (!ErrorUtils::MakeGenericError(isolate(), constructor, template_index, 1354f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch arg0, arg1, arg2, SKIP_NONE) 1355014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch .ToHandle(&result)) { 1356f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // If an exception is thrown while 1357f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // running the factory method, use the exception as the result. 1358f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch DCHECK(isolate()->has_pending_exception()); 1359f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch result = handle(isolate()->pending_exception(), isolate()); 1360f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch isolate()->clear_pending_exception(); 1361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1362f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 1363014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return scope.CloseAndEscape(result); 1364b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1365b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1367014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<Object> Factory::NewError(Handle<JSFunction> constructor, 1368014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<String> message) { 1369f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Construct a new error object. If an exception is thrown, use the exception 1370f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // as the result. 1371b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1372f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Handle<Object> no_caller; 1373f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch MaybeHandle<Object> maybe_error = 1374f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch ErrorUtils::Construct(isolate(), constructor, constructor, message, 1375f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch SKIP_NONE, no_caller, false); 1376f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch if (maybe_error.is_null()) { 1377f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch DCHECK(isolate()->has_pending_exception()); 1378f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch maybe_error = handle(isolate()->pending_exception(), isolate()); 1379f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch isolate()->clear_pending_exception(); 1380b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1381f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 1382f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return maybe_error.ToHandleChecked(); 1383b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1384b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1385f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochHandle<Object> Factory::NewInvalidStringLengthError() { 1386f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch // Invalidate the "string length" protector. 1387f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch if (isolate()->IsStringLengthOverflowIntact()) { 1388f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch isolate()->InvalidateStringLengthOverflowProtector(); 1389f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch } 1390f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return NewRangeError(MessageTemplate::kInvalidStringLength); 1391f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch} 1392b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1393014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define DEFINE_ERROR(NAME, name) \ 1394014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> Factory::New##NAME(MessageTemplate::Template template_index, \ 1395014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> arg0, Handle<Object> arg1, \ 1396014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> arg2) { \ 1397014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return NewError(isolate()->name##_function(), template_index, arg0, arg1, \ 1398014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch arg2); \ 1399014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1400014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochDEFINE_ERROR(Error, error) 1401014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochDEFINE_ERROR(EvalError, eval_error) 1402014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochDEFINE_ERROR(RangeError, range_error) 1403014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochDEFINE_ERROR(ReferenceError, reference_error) 1404014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochDEFINE_ERROR(SyntaxError, syntax_error) 1405014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochDEFINE_ERROR(TypeError, type_error) 1406c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochDEFINE_ERROR(WasmCompileError, wasm_compile_error) 140762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochDEFINE_ERROR(WasmLinkError, wasm_link_error) 1408c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochDEFINE_ERROR(WasmRuntimeError, wasm_runtime_error) 1409014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef DEFINE_ERROR 1410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1411b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<JSFunction> Factory::NewFunction(Handle<Map> map, 1412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<SharedFunctionInfo> info, 1413f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Handle<Object> context_or_undefined, 1414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PretenureFlag pretenure) { 1415014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch AllocationSpace space = pretenure == TENURED ? OLD_SPACE : NEW_SPACE; 1416014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSFunction> function = New<JSFunction>(map, space); 1417f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch DCHECK(context_or_undefined->IsContext() || 1418f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch context_or_undefined->IsUndefined(isolate())); 1419014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1420014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch function->initialize_properties(); 1421014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch function->initialize_elements(); 1422014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch function->set_shared(*info); 1423014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch function->set_code(info->code()); 1424f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch function->set_context(*context_or_undefined); 1425014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch function->set_prototype_or_initial_map(*the_hole_value()); 142662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch function->set_feedback_vector_cell(*undefined_cell()); 1427014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch function->set_next_function_link(*undefined_value(), SKIP_WRITE_BARRIER); 1428014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch isolate()->heap()->InitializeJSObjectBody(*function, *map, JSFunction::kSize); 1429014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return function; 1430b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1431b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1432b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1433b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<JSFunction> Factory::NewFunction(Handle<Map> map, 1434b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<String> name, 1435b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch MaybeHandle<Code> code) { 1436b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Context> context(isolate()->native_context()); 1437014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<SharedFunctionInfo> info = 1438014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch NewSharedFunctionInfo(name, code, map->is_constructor()); 1439014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(is_sloppy(info->language_mode())); 144013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch DCHECK(!map->IsUndefined(isolate())); 1441014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK( 1442014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch map.is_identical_to(isolate()->sloppy_function_map()) || 1443014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch map.is_identical_to(isolate()->sloppy_function_without_prototype_map()) || 1444014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch map.is_identical_to( 1445014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch isolate()->sloppy_function_with_readonly_prototype_map()) || 1446014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch map.is_identical_to(isolate()->strict_function_map()) || 1447bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch map.is_identical_to(isolate()->strict_function_without_prototype_map()) || 1448014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // TODO(titzer): wasm_function_map() could be undefined here. ugly. 1449014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch (*map == context->get(Context::WASM_FUNCTION_MAP_INDEX)) || 145062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch (*map == context->get(Context::NATIVE_FUNCTION_MAP_INDEX)) || 1451014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch map.is_identical_to(isolate()->proxy_function_map())); 1452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return NewFunction(map, info, context); 1453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1455b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1456b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<JSFunction> Factory::NewFunction(Handle<String> name) { 1457b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return NewFunction( 1458b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate()->sloppy_function_map(), name, MaybeHandle<Code>()); 1459b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<JSFunction> Factory::NewFunctionWithoutPrototype(Handle<String> name, 1463014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Code> code, 1464014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool is_strict) { 1465014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Map> map = is_strict 1466014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ? isolate()->strict_function_without_prototype_map() 1467014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch : isolate()->sloppy_function_without_prototype_map(); 1468014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return NewFunction(map, name, code); 1469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1470b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1471b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1472014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<JSFunction> Factory::NewFunction(Handle<String> name, Handle<Code> code, 1473b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> prototype, 1474014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool is_strict) { 147513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Handle<Map> map = is_strict ? isolate()->strict_function_map() 147613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch : isolate()->sloppy_function_map(); 1477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSFunction> result = NewFunction(map, name, code); 1478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result->set_prototype_or_initial_map(*prototype); 1479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 1480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1483958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierHandle<JSFunction> Factory::NewFunction(Handle<String> name, Handle<Code> code, 1484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> prototype, 1485958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier InstanceType type, int instance_size, 1486014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool is_strict) { 1487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Allocate the function 148813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch Handle<JSFunction> function = NewFunction(name, code, prototype, is_strict); 1489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1490958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ElementsKind elements_kind = 1491958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier type == JS_ARRAY_TYPE ? FAST_SMI_ELEMENTS : FAST_HOLEY_SMI_ELEMENTS; 1492958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<Map> initial_map = NewMap(type, instance_size, elements_kind); 149313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // TODO(littledan): Why do we have this is_generator test when 149413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // NewFunctionPrototype already handles finding an appropriately 149513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // shared prototype? 1496f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch if (!IsResumableFunction(function->shared()->kind())) { 149713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch if (prototype->IsTheHole(isolate())) { 1498958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier prototype = NewFunctionPrototype(function); 1499958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 1500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1501a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1502b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch JSFunction::SetInitialMap(function, initial_map, 1503b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSReceiver>::cast(prototype)); 1504a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return function; 1506a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1507a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1508a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<JSFunction> Factory::NewFunction(Handle<String> name, 1510b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Code> code, 1511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch InstanceType type, 1512b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int instance_size) { 1513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return NewFunction(name, code, the_hole_value(), type, instance_size); 1514a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1515a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1516a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<JSObject> Factory::NewFunctionPrototype(Handle<JSFunction> function) { 1518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Make sure to use globals from the function's context, since the function 1519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // can be from a different context. 1520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Context> native_context(function->context()->native_context()); 1521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Map> new_map; 1522f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch if (IsResumableFunction(function->shared()->kind())) { 152313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // Generator and async function prototypes can share maps since they 152413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch // don't have "constructor" properties. 1525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new_map = handle(native_context->generator_object_prototype_map()); 1526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 1527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Each function prototype gets a fresh map to avoid unwanted sharing of 1528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // maps between prototypes of different constructors. 1529b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSFunction> object_function(native_context->object_function()); 1530b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(object_function->has_initial_map()); 1531b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new_map = handle(object_function->initial_map()); 1532b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1533a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1534b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!new_map->is_prototype_map()); 1535b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSObject> prototype = NewJSObjectFromMap(new_map); 1536a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1537f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch if (!IsResumableFunction(function->shared()->kind())) { 1538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch JSObject::AddProperty(prototype, constructor_string(), function, DONT_ENUM); 1539b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1540a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1541b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return prototype; 1542a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1543a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1544a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1545b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<JSFunction> Factory::NewFunctionFromSharedFunctionInfo( 1546b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<SharedFunctionInfo> info, 1547b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Context> context, 1548b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PretenureFlag pretenure) { 1549014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int map_index = 1550014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Context::FunctionMapIndex(info->language_mode(), info->kind()); 1551014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Map> initial_map(Map::cast(context->native_context()->get(map_index))); 1552014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1553014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return NewFunctionFromSharedFunctionInfo(initial_map, info, context, 1554014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch pretenure); 1555014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 1556014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1557014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<JSFunction> Factory::NewFunctionFromSharedFunctionInfo( 155862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<SharedFunctionInfo> info, Handle<Context> context, 155962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<Cell> vector, PretenureFlag pretenure) { 156062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch int map_index = 156162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Context::FunctionMapIndex(info->language_mode(), info->kind()); 156262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<Map> initial_map(Map::cast(context->native_context()->get(map_index))); 156362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 156462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return NewFunctionFromSharedFunctionInfo(initial_map, info, context, vector, 156562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch pretenure); 156662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch} 156762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 156862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochHandle<JSFunction> Factory::NewFunctionFromSharedFunctionInfo( 1569014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Map> initial_map, Handle<SharedFunctionInfo> info, 1570f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Handle<Object> context_or_undefined, PretenureFlag pretenure) { 1571014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK_EQ(JS_FUNCTION_TYPE, initial_map->instance_type()); 1572014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSFunction> result = 1573f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch NewFunction(initial_map, info, context_or_undefined, pretenure); 1574a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (info->ic_age() != isolate()->heap()->global_ic_age()) { 1576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch info->ResetForNewContext(isolate()->heap()->global_ic_age()); 1577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1578a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1579f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch if (context_or_undefined->IsContext()) { 1580f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Give compiler a chance to pre-initialize. 1581f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Compiler::PostInstantiation(result, pretenure); 1582f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 1583014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 1585a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1586a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 158762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochHandle<JSFunction> Factory::NewFunctionFromSharedFunctionInfo( 158862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<Map> initial_map, Handle<SharedFunctionInfo> info, 158962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<Object> context_or_undefined, Handle<Cell> vector, 159062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch PretenureFlag pretenure) { 159162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DCHECK_EQ(JS_FUNCTION_TYPE, initial_map->instance_type()); 159262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<JSFunction> result = 159362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch NewFunction(initial_map, info, context_or_undefined, pretenure); 159462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 159562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Bump the closure count that is encoded in the vector cell's map. 159662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (vector->map() == *no_closures_cell_map()) { 159762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch vector->set_map(*one_closure_cell_map()); 159862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } else if (vector->map() == *one_closure_cell_map()) { 159962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch vector->set_map(*many_closures_cell_map()); 160062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } else { 160162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DCHECK_EQ(vector->map(), *many_closures_cell_map()); 160262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } 160362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 160462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch result->set_feedback_vector_cell(*vector); 160562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (info->ic_age() != isolate()->heap()->global_ic_age()) { 160662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch info->ResetForNewContext(isolate()->heap()->global_ic_age()); 160762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } 160862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 160962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch if (context_or_undefined->IsContext()) { 161062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Give compiler a chance to pre-initialize. 161162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Compiler::PostInstantiation(result, pretenure); 161262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } 161362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 161462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return result; 161562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch} 1616a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1617b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<ScopeInfo> Factory::NewScopeInfo(int length) { 1618b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<FixedArray> array = NewFixedArray(length, TENURED); 1619b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch array->set_map_no_write_barrier(*scope_info_map()); 1620b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<ScopeInfo> scope_info = Handle<ScopeInfo>::cast(array); 1621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return scope_info; 1622a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1623a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1624f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochHandle<ModuleInfo> Factory::NewModuleInfo() { 1625f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<FixedArray> array = NewFixedArray(ModuleInfo::kLength, TENURED); 1626f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch array->set_map_no_write_barrier(*module_info_map()); 1627f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return Handle<ModuleInfo>::cast(array); 1628f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch} 1629a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1630b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<JSObject> Factory::NewExternal(void* value) { 1631b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Foreign> foreign = NewForeign(static_cast<Address>(value)); 1632b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSObject> external = NewJSObjectFromMap(external_map()); 1633b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch external->SetInternalField(0, *foreign); 1634b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return external; 16356ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 16366ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 16376ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 1638b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<Code> Factory::NewCodeRaw(int object_size, bool immovable) { 1639b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CALL_HEAP_FUNCTION(isolate(), 1640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate()->heap()->AllocateCode(object_size, immovable), 1641b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Code); 164269a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch} 164369a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 164469a99ed0b2b2ef69d393c371b03db3a98aaf880eBen Murdoch 1645a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<Code> Factory::NewCode(const CodeDesc& desc, 1646a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Code::Flags flags, 164744f0eee88ff00398ff7f715fab053374d808c90dSteve Block Handle<Object> self_ref, 1648b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool immovable, 1649b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool crankshafted, 1650b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int prologue_offset, 1651b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool is_debug) { 1652b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<ByteArray> reloc_info = NewByteArray(desc.reloc_size, TENURED); 1653b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 165413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch bool has_unwinding_info = desc.unwinding_info != nullptr; 165513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch DCHECK((has_unwinding_info && desc.unwinding_info_size > 0) || 165613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch (!has_unwinding_info && desc.unwinding_info_size == 0)); 165713e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch 1658b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Compute size. 165913e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch int body_size = desc.instr_size; 166013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch int unwinding_info_size_field_size = kInt64Size; 166113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch if (has_unwinding_info) { 166213e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch body_size = RoundUp(body_size, kInt64Size) + desc.unwinding_info_size + 166313e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch unwinding_info_size_field_size; 166413e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch } 166513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch int obj_size = Code::SizeFor(RoundUp(body_size, kObjectAlignment)); 1666b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1667b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Code> code = NewCodeRaw(obj_size, immovable); 166813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch DCHECK(!isolate()->heap()->memory_allocator()->code_range()->valid() || 1669bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch isolate()->heap()->memory_allocator()->code_range()->contains( 1670bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch code->address()) || 1671014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch obj_size <= isolate()->heap()->code_space()->AreaSize()); 1672b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1673b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The code object has not been fully initialized yet. We rely on the 1674b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // fact that no allocation will happen from this point on. 1675b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DisallowHeapAllocation no_gc; 1676c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch code->set_gc_metadata(Smi::kZero); 1677b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch code->set_ic_age(isolate()->heap()->global_ic_age()); 1678b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch code->set_instruction_size(desc.instr_size); 1679b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch code->set_relocation_info(*reloc_info); 1680b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch code->set_flags(flags); 168113e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch code->set_has_unwinding_info(has_unwinding_info); 1682b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch code->set_raw_kind_specific_flags1(0); 1683b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch code->set_raw_kind_specific_flags2(0); 1684b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch code->set_is_crankshafted(crankshafted); 1685b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch code->set_deoptimization_data(*empty_fixed_array(), SKIP_WRITE_BARRIER); 1686c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch code->set_raw_type_feedback_info(Smi::kZero); 1687f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch code->set_next_code_link(*undefined_value(), SKIP_WRITE_BARRIER); 1688b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch code->set_handler_table(*empty_fixed_array(), SKIP_WRITE_BARRIER); 1689f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch code->set_source_position_table(*empty_byte_array(), SKIP_WRITE_BARRIER); 1690b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch code->set_prologue_offset(prologue_offset); 1691014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch code->set_constant_pool_offset(desc.instr_size - desc.constant_pool_size); 1692f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch code->set_builtin_index(-1); 1693014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1694b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (code->kind() == Code::OPTIMIZED_FUNCTION) { 1695b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch code->set_marked_for_deoptimization(false); 1696b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1697b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1698b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (is_debug) { 1699b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(code->kind() == Code::FUNCTION); 1700b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch code->set_has_debug_break_slots(true); 1701b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1702b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1703b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Allow self references to created code object by patching the handle to 1704b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // point to the newly allocated Code object. 1705b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!self_ref.is_null()) *(self_ref.location()) = *code; 1706b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Migrate generated code. 1708b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The generated code can contain Object** values (typically from handles) 1709b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // that are dereferenced during the copy to point directly to the actual heap 1710b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // objects. These pointers can include references to the code object itself, 1711b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // through the self_reference parameter. 1712b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch code->CopyFrom(desc); 1713b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1714b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifdef VERIFY_HEAP 1715b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (FLAG_verify_heap) code->ObjectVerify(); 1716b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif 1717b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return code; 1718a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1719a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1720a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1721a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<Code> Factory::CopyCode(Handle<Code> code) { 172244f0eee88ff00398ff7f715fab053374d808c90dSteve Block CALL_HEAP_FUNCTION(isolate(), 172344f0eee88ff00398ff7f715fab053374d808c90dSteve Block isolate()->heap()->CopyCode(*code), 172444f0eee88ff00398ff7f715fab053374d808c90dSteve Block Code); 1725a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1726a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1727a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1728109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben MurdochHandle<BytecodeArray> Factory::CopyBytecodeArray( 1729109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Handle<BytecodeArray> bytecode_array) { 1730109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch CALL_HEAP_FUNCTION(isolate(), 1731109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch isolate()->heap()->CopyBytecodeArray(*bytecode_array), 1732109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch BytecodeArray); 1733109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch} 17346ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 1735b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<JSObject> Factory::NewJSObject(Handle<JSFunction> constructor, 1736b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PretenureFlag pretenure) { 1737b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch JSFunction::EnsureHasInitialMap(constructor); 1738b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CALL_HEAP_FUNCTION( 1739b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate(), 1740b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate()->heap()->AllocateJSObject(*constructor, pretenure), JSObject); 1741a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1742a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 174362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochHandle<JSObject> Factory::NewJSObjectWithNullProto(PretenureFlag pretenure) { 174462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<JSObject> result = 174562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch NewJSObject(isolate()->object_function(), pretenure); 17463b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Handle<Map> new_map = 17473b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Map::Copy(Handle<Map>(result->map()), "ObjectWithNullProto"); 17483b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Map::SetPrototype(new_map, null_value()); 17493b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch JSObject::MigrateToMap(result, new_map); 17503b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return result; 17513b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch} 1752a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1753014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<JSGlobalObject> Factory::NewJSGlobalObject( 1754014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSFunction> constructor) { 1755b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(constructor->has_initial_map()); 1756b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Map> map(constructor->initial_map()); 1757b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(map->is_dictionary_map()); 1758b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1759b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Make sure no field properties are described in the initial map. 1760b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // This guarantees us that normalizing the properties does not 1761b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // require us to change property values to PropertyCells. 1762b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(map->NextFreePropertyIndex() == 0); 1763b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1764b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Make sure we don't have a ton of pre-allocated slots in the 1765b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // global objects. They will be unused once we normalize the object. 1766b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(map->unused_property_fields() == 0); 1767014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(map->GetInObjectProperties() == 0); 1768b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1769b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Initial size of the backing store to avoid resize of the storage during 1770b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // bootstrapping. The size differs between the JS global object ad the 1771b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // builtins object. 1772014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int initial_size = 64; 1773b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1774b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Allocate a dictionary object for backing storage. 1775b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int at_least_space_for = map->NumberOfOwnDescriptors() * 2 + initial_size; 1776014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<GlobalDictionary> dictionary = 1777014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GlobalDictionary::New(isolate(), at_least_space_for); 1778b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1779b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The global object might be created from an object template with accessors. 1780b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Fill these accessors into the dictionary. 1781b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<DescriptorArray> descs(map->instance_descriptors()); 1782b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch for (int i = 0; i < map->NumberOfOwnDescriptors(); i++) { 1783b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PropertyDetails details = descs->GetDetails(i); 1784014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Only accessors are expected. 178562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DCHECK_EQ(kAccessor, details.kind()); 178662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch PropertyDetails d(kAccessor, details.attributes(), i + 1, 1787014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PropertyCellType::kMutable); 1788b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Name> name(descs->GetKey(i)); 1789014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<PropertyCell> cell = NewPropertyCell(); 179062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch cell->set_value(descs->GetValue(i)); 1791b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // |dictionary| already contains enough space for all properties. 1792014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch USE(GlobalDictionary::Add(dictionary, name, cell, d)); 1793b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 1794b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1795b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Allocate the global object and initialize it with the backing store. 1796014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSGlobalObject> global = New<JSGlobalObject>(map, OLD_SPACE); 1797b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate()->heap()->InitializeJSObjectFromMap(*global, *dictionary, *map); 1798b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1799b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Create a new map for the global object. 1800b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Map> new_map = Map::CopyDropDescriptors(map); 1801b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch new_map->set_dictionary_map(true); 1802b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1803b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Set up the global object as a normalized object. 1804b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch global->set_map(*new_map); 1805b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch global->set_properties(*dictionary); 1806b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1807b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Make sure result is a global object with properties in dictionary. 1808014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(global->IsJSGlobalObject() && !global->HasFastProperties()); 1809b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return global; 1810a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1811a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1812a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1813b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<JSObject> Factory::NewJSObjectFromMap( 1814b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Map> map, 1815b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PretenureFlag pretenure, 1816b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<AllocationSite> allocation_site) { 1817b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch CALL_HEAP_FUNCTION( 1818b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate(), 1819b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate()->heap()->AllocateJSObjectFromMap( 1820b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch *map, 1821b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch pretenure, 1822b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch allocation_site.is_null() ? NULL : *allocation_site), 1823b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch JSObject); 1824b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1825a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1826a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1827b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<JSArray> Factory::NewJSArray(ElementsKind elements_kind, 1828b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PretenureFlag pretenure) { 18293b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Map* map = isolate()->get_initial_js_array_map(elements_kind); 1830014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (map == nullptr) { 1831014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Context* native_context = isolate()->context()->native_context(); 1832014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch JSFunction* array_function = native_context->array_function(); 1833014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch map = array_function->initial_map(); 1834014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 1835b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Handle<JSArray>::cast(NewJSObjectFromMap(handle(map), pretenure)); 1836b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 18373ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 1838014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<JSArray> Factory::NewJSArray(ElementsKind elements_kind, int length, 18393b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch int capacity, 1840b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ArrayStorageAllocationMode mode, 1841b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PretenureFlag pretenure) { 18423b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Handle<JSArray> array = NewJSArray(elements_kind, pretenure); 1843b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch NewJSArrayStorage(array, length, capacity, mode); 1844b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return array; 1845b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1846b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1847b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<JSArray> Factory::NewJSArrayWithElements(Handle<FixedArrayBase> elements, 1848b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ElementsKind elements_kind, 18493b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch int length, 1850b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch PretenureFlag pretenure) { 1851b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(length <= elements->length()); 18523b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Handle<JSArray> array = NewJSArray(elements_kind, pretenure); 1853b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1854b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch array->set_elements(*elements); 1855b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch array->set_length(Smi::FromInt(length)); 1856b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch JSObject::ValidateElements(array); 1857b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return array; 1858b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 1859b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1860b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1861b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Factory::NewJSArrayStorage(Handle<JSArray> array, 1862b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int length, 1863b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int capacity, 1864b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ArrayStorageAllocationMode mode) { 1865b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(capacity >= length); 1866b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 1867b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (capacity == 0) { 1868c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch array->set_length(Smi::kZero); 1869b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch array->set_elements(*empty_fixed_array()); 1870b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return; 1871a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 1872a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1873958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier HandleScope inner_scope(isolate()); 1874b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<FixedArrayBase> elms; 1875b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch ElementsKind elements_kind = array->GetElementsKind(); 1876b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (IsFastDoubleElementsKind(elements_kind)) { 1877b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (mode == DONT_INITIALIZE_ARRAY_ELEMENTS) { 1878b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch elms = NewFixedDoubleArray(capacity); 1879a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } else { 1880b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(mode == INITIALIZE_ARRAY_ELEMENTS_WITH_HOLE); 1881b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch elms = NewFixedDoubleArrayWithHoles(capacity); 1882a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 1883b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 1884b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsFastSmiOrObjectElementsKind(elements_kind)); 1885b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (mode == DONT_INITIALIZE_ARRAY_ELEMENTS) { 1886b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch elms = NewUninitializedFixedArray(capacity); 1887b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 1888b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(mode == INITIALIZE_ARRAY_ELEMENTS_WITH_HOLE); 1889b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch elms = NewFixedArrayWithHoles(capacity); 1890a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 1891a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block } 1892a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1893b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch array->set_elements(*elms); 1894b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch array->set_length(Smi::FromInt(length)); 1895a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1896a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1897c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochHandle<JSModuleNamespace> Factory::NewJSModuleNamespace() { 1898c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Handle<Map> map = isolate()->js_module_namespace_map(); 189962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<JSModuleNamespace> module_namespace( 190062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<JSModuleNamespace>::cast(NewJSObjectFromMap(map))); 190162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch FieldIndex index = FieldIndex::ForDescriptor( 190262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch *map, JSModuleNamespace::kToStringTagFieldIndex); 190362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch module_namespace->FastPropertyAtPut(index, 190462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch isolate()->heap()->Module_string()); 190562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return module_namespace; 1906c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch} 1907a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1908b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<JSGeneratorObject> Factory::NewJSGeneratorObject( 1909b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSFunction> function) { 1910f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch DCHECK(IsResumableFunction(function->shared()->kind())); 1911b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch JSFunction::EnsureHasInitialMap(function); 1912b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Map> map(function->initial_map()); 1913014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK_EQ(JS_GENERATOR_OBJECT_TYPE, map->instance_type()); 191444f0eee88ff00398ff7f715fab053374d808c90dSteve Block CALL_HEAP_FUNCTION( 191544f0eee88ff00398ff7f715fab053374d808c90dSteve Block isolate(), 1916b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate()->heap()->AllocateJSObjectFromMap(*map), 1917b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch JSGeneratorObject); 1918a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1919a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1920f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochHandle<Module> Factory::NewModule(Handle<SharedFunctionInfo> code) { 1921f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<ModuleInfo> module_info(code->scope_info()->ModuleDescriptorInfo(), 1922f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch isolate()); 1923f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<ObjectHashTable> exports = 1924c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch ObjectHashTable::New(isolate(), module_info->RegularExportCount()); 1925c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Handle<FixedArray> regular_exports = 1926c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch NewFixedArray(module_info->RegularExportCount()); 1927c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Handle<FixedArray> regular_imports = 1928c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch NewFixedArray(module_info->regular_imports()->length()); 1929f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch int requested_modules_length = module_info->module_requests()->length(); 1930f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<FixedArray> requested_modules = 1931f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch requested_modules_length > 0 ? NewFixedArray(requested_modules_length) 1932f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch : empty_fixed_array(); 1933f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch 1934f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<Module> module = Handle<Module>::cast(NewStruct(MODULE_TYPE)); 1935f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch module->set_code(*code); 1936f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch module->set_exports(*exports); 1937c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch module->set_regular_exports(*regular_exports); 1938c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch module->set_regular_imports(*regular_imports); 1939c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch module->set_hash(isolate()->GenerateIdentityHash(Smi::kMaxValue)); 1940c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch module->set_module_namespace(isolate()->heap()->undefined_value()); 1941f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch module->set_requested_modules(*requested_modules); 1942c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DCHECK(!module->instantiated()); 1943c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DCHECK(!module->evaluated()); 1944f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return module; 1945f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch} 1946a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1947014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<JSArrayBuffer> Factory::NewJSArrayBuffer(SharedFlag shared, 1948014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PretenureFlag pretenure) { 1949b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSFunction> array_buffer_fun( 1950014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch shared == SharedFlag::kShared 1951014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ? isolate()->native_context()->shared_array_buffer_fun() 1952014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch : isolate()->native_context()->array_buffer_fun()); 1953014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CALL_HEAP_FUNCTION(isolate(), isolate()->heap()->AllocateJSObject( 1954014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch *array_buffer_fun, pretenure), 1955014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch JSArrayBuffer); 1956a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1957a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1958a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1959b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<JSDataView> Factory::NewJSDataView() { 1960b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSFunction> data_view_fun( 1961b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate()->native_context()->data_view_fun()); 196244f0eee88ff00398ff7f715fab053374d808c90dSteve Block CALL_HEAP_FUNCTION( 196344f0eee88ff00398ff7f715fab053374d808c90dSteve Block isolate(), 1964b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate()->heap()->AllocateJSObject(*data_view_fun), 1965b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch JSDataView); 1966a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 1967a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 1968f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben MurdochHandle<JSIteratorResult> Factory::NewJSIteratorResult(Handle<Object> value, 1969f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch bool done) { 1970f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<Map> map(isolate()->native_context()->iterator_result_map()); 1971f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<JSIteratorResult> js_iter_result = 1972f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch Handle<JSIteratorResult>::cast(NewJSObjectFromMap(map)); 1973f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch js_iter_result->set_value(*value); 1974f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch js_iter_result->set_done(*ToBoolean(done)); 1975f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch return js_iter_result; 1976f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch} 1977a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 197862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochHandle<JSAsyncFromSyncIterator> Factory::NewJSAsyncFromSyncIterator( 197962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<JSReceiver> sync_iterator) { 198062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<Map> map(isolate()->native_context()->async_from_sync_iterator_map()); 198162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<JSAsyncFromSyncIterator> iterator = 198262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<JSAsyncFromSyncIterator>::cast(NewJSObjectFromMap(map)); 198362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 198462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch iterator->set_sync_iterator(*sync_iterator); 198562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return iterator; 198662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch} 198762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 1988014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<JSMap> Factory::NewJSMap() { 1989014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Map> map(isolate()->native_context()->js_map_map()); 1990014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSMap> js_map = Handle<JSMap>::cast(NewJSObjectFromMap(map)); 1991014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch JSMap::Initialize(js_map, isolate()); 1992014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return js_map; 1993014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 1994014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1995014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 1996014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<JSSet> Factory::NewJSSet() { 1997014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Map> map(isolate()->native_context()->js_set_map()); 1998014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSSet> js_set = Handle<JSSet>::cast(NewJSObjectFromMap(map)); 1999014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch JSSet::Initialize(js_set, isolate()); 2000014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return js_set; 2001014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 2002014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2003014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2004958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierHandle<JSMapIterator> Factory::NewJSMapIterator() { 2005958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<Map> map(isolate()->native_context()->map_iterator_map()); 2006958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier CALL_HEAP_FUNCTION(isolate(), 2007958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier isolate()->heap()->AllocateJSObjectFromMap(*map), 2008958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier JSMapIterator); 2009958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 2010958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2011958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2012958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierHandle<JSSetIterator> Factory::NewJSSetIterator() { 2013958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<Map> map(isolate()->native_context()->set_iterator_map()); 2014958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier CALL_HEAP_FUNCTION(isolate(), 2015958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier isolate()->heap()->AllocateJSObjectFromMap(*map), 2016958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier JSSetIterator); 2017958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 2018958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2019958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2020958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniernamespace { 2021958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2022958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierElementsKind GetExternalArrayElementsKind(ExternalArrayType type) { 2023958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier switch (type) { 2024958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#define TYPED_ARRAY_CASE(Type, type, TYPE, ctype, size) \ 2025958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case kExternal##Type##Array: \ 2026014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return TYPE##_ELEMENTS; 2027958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier TYPED_ARRAYS(TYPED_ARRAY_CASE) 2028958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2029958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier UNREACHABLE(); 2030014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return FIRST_FIXED_TYPED_ARRAY_ELEMENTS_KIND; 2031958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#undef TYPED_ARRAY_CASE 2032958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 2033958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2034958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2035958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniersize_t GetExternalArrayElementSize(ExternalArrayType type) { 2036958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier switch (type) { 2037958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#define TYPED_ARRAY_CASE(Type, type, TYPE, ctype, size) \ 2038958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier case kExternal##Type##Array: \ 2039958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return size; 2040958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier TYPED_ARRAYS(TYPED_ARRAY_CASE) 2041014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch default: 2042014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch UNREACHABLE(); 2043014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return 0; 2044014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 2045014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef TYPED_ARRAY_CASE 2046014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 2047014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2048014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2049014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochsize_t GetFixedTypedArraysElementSize(ElementsKind kind) { 2050014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch switch (kind) { 2051014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define TYPED_ARRAY_CASE(Type, type, TYPE, ctype, size) \ 2052014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case TYPE##_ELEMENTS: \ 2053014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return size; 2054014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch TYPED_ARRAYS(TYPED_ARRAY_CASE) 2055014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch default: 2056014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch UNREACHABLE(); 2057014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return 0; 2058014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 2059014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef TYPED_ARRAY_CASE 2060014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 2061014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2062014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2063014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochExternalArrayType GetArrayTypeFromElementsKind(ElementsKind kind) { 2064014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch switch (kind) { 2065014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define TYPED_ARRAY_CASE(Type, type, TYPE, ctype, size) \ 2066014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case TYPE##_ELEMENTS: \ 2067014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return kExternal##Type##Array; 2068014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch TYPED_ARRAYS(TYPED_ARRAY_CASE) 2069014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch default: 2070014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch UNREACHABLE(); 2071014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return kExternalInt8Array; 2072958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2073958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#undef TYPED_ARRAY_CASE 2074958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 2075958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2076958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2077958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierJSFunction* GetTypedArrayFun(ExternalArrayType type, Isolate* isolate) { 2078b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Context* native_context = isolate->context()->native_context(); 2079b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch switch (type) { 2080b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define TYPED_ARRAY_FUN(Type, type, TYPE, ctype, size) \ 2081b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch case kExternal##Type##Array: \ 2082b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return native_context->type##_array_fun(); 2083b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2084b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch TYPED_ARRAYS(TYPED_ARRAY_FUN) 2085b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#undef TYPED_ARRAY_FUN 2086b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2087b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch default: 2088b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch UNREACHABLE(); 2089b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return NULL; 2090b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2091a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2092a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2093a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2094014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochJSFunction* GetTypedArrayFun(ElementsKind elements_kind, Isolate* isolate) { 2095014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Context* native_context = isolate->context()->native_context(); 2096014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch switch (elements_kind) { 2097014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#define TYPED_ARRAY_FUN(Type, type, TYPE, ctype, size) \ 2098014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch case TYPE##_ELEMENTS: \ 2099014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return native_context->type##_array_fun(); 2100014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2101014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch TYPED_ARRAYS(TYPED_ARRAY_FUN) 2102014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch#undef TYPED_ARRAY_FUN 2103014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2104014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch default: 2105014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch UNREACHABLE(); 2106014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return NULL; 2107014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 2108014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 2109014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2110014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2111958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Berniervoid SetupArrayBufferView(i::Isolate* isolate, 2112958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i::Handle<i::JSArrayBufferView> obj, 2113958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i::Handle<i::JSArrayBuffer> buffer, 2114014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch size_t byte_offset, size_t byte_length, 2115014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PretenureFlag pretenure = NOT_TENURED) { 2116958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier DCHECK(byte_offset + byte_length <= 2117958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static_cast<size_t>(buffer->byte_length()->Number())); 2118958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2119c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DCHECK_EQ(obj->GetInternalFieldCount(), 2120c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch v8::ArrayBufferView::kInternalFieldCount); 2121c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch for (int i = 0; i < v8::ArrayBufferView::kInternalFieldCount; i++) { 2122c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch obj->SetInternalField(i, Smi::kZero); 2123c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch } 2124c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 2125958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier obj->set_buffer(*buffer); 2126958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2127958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i::Handle<i::Object> byte_offset_object = 2128014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch isolate->factory()->NewNumberFromSize(byte_offset, pretenure); 2129958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier obj->set_byte_offset(*byte_offset_object); 2130958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2131958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier i::Handle<i::Object> byte_length_object = 2132014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch isolate->factory()->NewNumberFromSize(byte_length, pretenure); 2133958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier obj->set_byte_length(*byte_length_object); 2134958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 2135958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2136958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2137958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} // namespace 2138958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2139958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2140014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<JSTypedArray> Factory::NewJSTypedArray(ExternalArrayType type, 2141014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PretenureFlag pretenure) { 2142b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSFunction> typed_array_fun_handle(GetTypedArrayFun(type, isolate())); 2143b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2144014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CALL_HEAP_FUNCTION(isolate(), isolate()->heap()->AllocateJSObject( 2145014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch *typed_array_fun_handle, pretenure), 2146014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch JSTypedArray); 2147014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 2148014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2149014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2150014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<JSTypedArray> Factory::NewJSTypedArray(ElementsKind elements_kind, 2151014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PretenureFlag pretenure) { 2152014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSFunction> typed_array_fun_handle( 2153014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch GetTypedArrayFun(elements_kind, isolate())); 2154014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2155014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CALL_HEAP_FUNCTION(isolate(), isolate()->heap()->AllocateJSObject( 2156014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch *typed_array_fun_handle, pretenure), 2157014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch JSTypedArray); 21583ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 21593ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 21603ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2161958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierHandle<JSTypedArray> Factory::NewJSTypedArray(ExternalArrayType type, 2162958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<JSArrayBuffer> buffer, 2163014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch size_t byte_offset, size_t length, 2164014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PretenureFlag pretenure) { 2165014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSTypedArray> obj = NewJSTypedArray(type, pretenure); 2166958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2167958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier size_t element_size = GetExternalArrayElementSize(type); 2168958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier ElementsKind elements_kind = GetExternalArrayElementsKind(type); 2169958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2170958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier CHECK(byte_offset % element_size == 0); 2171958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2172958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier CHECK(length <= (std::numeric_limits<size_t>::max() / element_size)); 2173958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier CHECK(length <= static_cast<size_t>(Smi::kMaxValue)); 2174958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier size_t byte_length = length * element_size; 2175014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch SetupArrayBufferView(isolate(), obj, buffer, byte_offset, byte_length, 2176014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch pretenure); 2177958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2178014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> length_object = NewNumberFromSize(length, pretenure); 2179958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier obj->set_length(*length_object); 2180958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2181014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<FixedTypedArrayBase> elements = NewFixedTypedArrayWithExternalPointer( 2182958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier static_cast<int>(length), type, 2183014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static_cast<uint8_t*>(buffer->backing_store()) + byte_offset, pretenure); 2184958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<Map> map = JSObject::GetElementsTransitionMap(obj, elements_kind); 2185958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier JSObject::SetMapAndElements(obj, map, elements); 2186958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return obj; 2187958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 2188958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2189958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2190014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<JSTypedArray> Factory::NewJSTypedArray(ElementsKind elements_kind, 2191014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch size_t number_of_elements, 2192014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch PretenureFlag pretenure) { 2193014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSTypedArray> obj = NewJSTypedArray(elements_kind, pretenure); 2194c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch DCHECK_EQ(obj->GetInternalFieldCount(), 2195c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch v8::ArrayBufferView::kInternalFieldCount); 2196c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch for (int i = 0; i < v8::ArrayBufferView::kInternalFieldCount; i++) { 2197c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch obj->SetInternalField(i, Smi::kZero); 2198c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch } 2199014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2200014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch size_t element_size = GetFixedTypedArraysElementSize(elements_kind); 2201014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch ExternalArrayType array_type = GetArrayTypeFromElementsKind(elements_kind); 2202014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2203014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK(number_of_elements <= 2204014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch (std::numeric_limits<size_t>::max() / element_size)); 2205014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CHECK(number_of_elements <= static_cast<size_t>(Smi::kMaxValue)); 2206014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch size_t byte_length = number_of_elements * element_size; 2207014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2208c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch obj->set_byte_offset(Smi::kZero); 2209014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch i::Handle<i::Object> byte_length_object = 2210014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch NewNumberFromSize(byte_length, pretenure); 2211014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch obj->set_byte_length(*byte_length_object); 2212014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> length_object = 2213014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch NewNumberFromSize(number_of_elements, pretenure); 2214014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch obj->set_length(*length_object); 2215014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2216014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSArrayBuffer> buffer = 2217014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch NewJSArrayBuffer(SharedFlag::kNotShared, pretenure); 2218014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch JSArrayBuffer::Setup(buffer, isolate(), true, NULL, byte_length, 2219014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch SharedFlag::kNotShared); 2220014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch obj->set_buffer(*buffer); 2221014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<FixedTypedArrayBase> elements = NewFixedTypedArray( 2222014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static_cast<int>(number_of_elements), array_type, true, pretenure); 2223014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch obj->set_elements(*elements); 2224014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return obj; 2225014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} 2226014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2227014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2228958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily BernierHandle<JSDataView> Factory::NewJSDataView(Handle<JSArrayBuffer> buffer, 2229958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier size_t byte_offset, 2230958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier size_t byte_length) { 2231958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<JSDataView> obj = NewJSDataView(); 2232958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier SetupArrayBufferView(isolate(), obj, buffer, byte_offset, byte_length); 2233958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return obj; 2234958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} 2235958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2236958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2237014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochMaybeHandle<JSBoundFunction> Factory::NewJSBoundFunction( 2238014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSReceiver> target_function, Handle<Object> bound_this, 2239014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Vector<Handle<Object>> bound_args) { 2240014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(target_function->IsCallable()); 2241014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch STATIC_ASSERT(Code::kMaxArguments <= FixedArray::kMaxLength); 2242014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (bound_args.length() >= Code::kMaxArguments) { 2243014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch THROW_NEW_ERROR(isolate(), 2244014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch NewRangeError(MessageTemplate::kTooManyArguments), 2245014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch JSBoundFunction); 2246014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 2247b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2248014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Determine the prototype of the {target_function}. 2249014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> prototype; 2250109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch ASSIGN_RETURN_ON_EXCEPTION( 2251109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch isolate(), prototype, 2252109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch JSReceiver::GetPrototype(isolate(), target_function), JSBoundFunction); 2253014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2254014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Create the [[BoundArguments]] for the result. 2255014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<FixedArray> bound_arguments; 2256014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (bound_args.length() == 0) { 2257014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bound_arguments = empty_fixed_array(); 2258014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 2259014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bound_arguments = NewFixedArray(bound_args.length()); 2260014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch for (int i = 0; i < bound_args.length(); ++i) { 2261014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bound_arguments->set(i, *bound_args[i]); 2262014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 2263014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 2264014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2265014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Setup the map for the JSBoundFunction instance. 2266bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch Handle<Map> map = target_function->IsConstructor() 2267bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch ? isolate()->bound_function_with_constructor_map() 2268bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch : isolate()->bound_function_without_constructor_map(); 2269014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (map->prototype() != *prototype) { 2270014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch map = Map::TransitionToPrototype(map, prototype, REGULAR_PROTOTYPE); 2271014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 2272014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK_EQ(target_function->IsConstructor(), map->is_constructor()); 2273014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2274014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Setup the JSBoundFunction instance. 2275014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSBoundFunction> result = 2276014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSBoundFunction>::cast(NewJSObjectFromMap(map)); 2277014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch result->set_bound_target_function(*target_function); 2278014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch result->set_bound_this(*bound_this); 2279014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch result->set_bound_arguments(*bound_arguments); 2280b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 22813ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 22823ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 22833ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2284014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// ES6 section 9.5.15 ProxyCreate (target, handler) 2285014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<JSProxy> Factory::NewJSProxy(Handle<JSReceiver> target, 2286014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSReceiver> handler) { 2287b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Allocate the proxy object. 2288014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Map> map; 2289014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (target->IsCallable()) { 2290014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (target->IsConstructor()) { 2291014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch map = Handle<Map>(isolate()->proxy_constructor_map()); 2292014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 2293014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch map = Handle<Map>(isolate()->proxy_callable_map()); 2294014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 2295014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 2296014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch map = Handle<Map>(isolate()->proxy_map()); 2297014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 229813e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch DCHECK(map->prototype()->IsNull(isolate())); 2299014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSProxy> result = New<JSProxy>(map, NEW_SPACE); 2300014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch result->initialize_properties(); 2301014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch result->set_target(*target); 2302b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result->set_handler(*handler); 2303b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch result->set_hash(*undefined_value(), SKIP_WRITE_BARRIER); 2304b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 23053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 23063ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2307c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochHandle<JSGlobalProxy> Factory::NewUninitializedJSGlobalProxy(int size) { 2308014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Create an empty shell of a JSGlobalProxy that needs to be reinitialized 2309014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // via ReinitializeJSGlobalProxy later. 2310c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Handle<Map> map = NewMap(JS_GLOBAL_PROXY_TYPE, size); 2311014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Maintain invariant expected from any JSGlobalProxy. 2312014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch map->set_is_access_check_needed(true); 2313014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CALL_HEAP_FUNCTION( 2314014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch isolate(), isolate()->heap()->AllocateJSObjectFromMap(*map, NOT_TENURED), 2315014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch JSGlobalProxy); 2316592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch} 2317592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 2318592a9fc1d8ea420377a2e7efd0600e20b058be2bBen Murdoch 2319b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Factory::ReinitializeJSGlobalProxy(Handle<JSGlobalProxy> object, 2320b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSFunction> constructor) { 2321b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(constructor->has_initial_map()); 2322b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Map> map(constructor->initial_map(), isolate()); 2323014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Map> old_map(object->map(), isolate()); 2324b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2325b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // The proxy's hash should be retained across reinitialization. 2326b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> hash(object->hash(), isolate()); 2327b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2328014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (old_map->is_prototype_map()) { 2329014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch map = Map::Copy(map, "CopyAsPrototypeForJSGlobalProxy"); 2330014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch map->set_is_prototype_map(true); 2331014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } 2332c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch JSObject::NotifyMapChange(old_map, map, isolate()); 233362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch old_map->NotifyLeafMapLayoutChange(); 2334014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2335b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Check that the already allocated object has the same size and type as 2336b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // objects allocated using the constructor. 2337014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(map->instance_size() == old_map->instance_size()); 2338014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch DCHECK(map->instance_type() == old_map->instance_type()); 2339b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2340b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Allocate the backing storage for the properties. 2341014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<FixedArray> properties = empty_fixed_array(); 2342b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2343b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // In order to keep heap in consistent state there must be no allocations 2344b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // before object re-initialization is finished. 2345b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DisallowHeapAllocation no_allocation; 2346b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2347b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Reset the map for the object. 2348b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch object->synchronized_set_map(*map); 2349b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2350b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Heap* heap = isolate()->heap(); 2351b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Reinitialize the object from the constructor map. 2352b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch heap->InitializeJSObjectFromMap(*object, *properties, *map); 2353b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2354b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Restore the saved hash. 2355b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch object->set_hash(*hash); 2356257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch} 2357257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch 23586ded16be15dd865a9b21ea304d5273c8be299c87Steve BlockHandle<SharedFunctionInfo> Factory::NewSharedFunctionInfo( 235962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<String> name, FunctionKind kind, Handle<Code> code, 236062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<ScopeInfo> scope_info) { 2361b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(IsValidFunctionKind(kind)); 2362014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<SharedFunctionInfo> shared = NewSharedFunctionInfo( 2363014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch name, code, IsConstructable(kind, scope_info->language_mode())); 23643bec4d28b1f388dbc06a9c4276e1a03e86c52b04Ben Murdoch shared->set_scope_info(*scope_info); 2365f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch shared->set_outer_scope_info(*the_hole_value()); 2366b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch shared->set_kind(kind); 2367b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (IsGeneratorFunction(kind)) { 2368b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch shared->set_instance_class_name(isolate()->heap()->Generator_string()); 2369bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch } 23706ded16be15dd865a9b21ea304d5273c8be299c87Steve Block return shared; 23716ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 23726ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 237362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochHandle<SharedFunctionInfo> Factory::NewSharedFunctionInfoForLiteral( 237462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch FunctionLiteral* literal, Handle<Script> script) { 237562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<Code> code = isolate()->builtins()->CompileLazy(); 237662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<ScopeInfo> scope_info(ScopeInfo::Empty(isolate())); 237762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<SharedFunctionInfo> result = 237862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch NewSharedFunctionInfo(literal->name(), literal->kind(), code, scope_info); 237962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch SharedFunctionInfo::InitFromFunctionLiteral(result, literal); 238062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch SharedFunctionInfo::SetScript(result, script); 238162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return result; 238262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch} 23836ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 23841e0659c275bb392c045087af4f6b0d7565cb3d77Steve BlockHandle<JSMessageObject> Factory::NewJSMessageObject( 2385014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch MessageTemplate::Template message, Handle<Object> argument, 2386014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch int start_position, int end_position, Handle<Object> script, 23871e0659c275bb392c045087af4f6b0d7565cb3d77Steve Block Handle<Object> stack_frames) { 2388b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Map> map = message_object_map(); 2389014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<JSMessageObject> message_obj = New<JSMessageObject>(map, NEW_SPACE); 2390014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch message_obj->set_properties(*empty_fixed_array(), SKIP_WRITE_BARRIER); 2391014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch message_obj->initialize_elements(); 2392014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch message_obj->set_elements(*empty_fixed_array(), SKIP_WRITE_BARRIER); 2393014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch message_obj->set_type(message); 2394014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch message_obj->set_argument(*argument); 2395014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch message_obj->set_start_position(start_position); 2396014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch message_obj->set_end_position(end_position); 2397014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch message_obj->set_script(*script); 2398014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch message_obj->set_stack_frames(*stack_frames); 239962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch message_obj->set_error_level(v8::Isolate::kMessageError); 2400014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return message_obj; 2401a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2402a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2403a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2404b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<SharedFunctionInfo> Factory::NewSharedFunctionInfo( 2405014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<String> name, MaybeHandle<Code> maybe_code, bool is_constructor) { 2406109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // Function names are assumed to be flat elsewhere. Must flatten before 2407109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch // allocating SharedFunctionInfo to avoid GC seeing the uninitialized SFI. 2408109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch name = String::Flatten(name, TENURED); 2409109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch 2410b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Map> map = shared_function_info_map(); 2411014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<SharedFunctionInfo> share = New<SharedFunctionInfo>(map, OLD_SPACE); 2412b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2413b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Set pointer fields. 2414b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch share->set_name(*name); 241562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch share->set_function_data(*undefined_value(), SKIP_WRITE_BARRIER); 2416b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Code> code; 2417b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!maybe_code.ToHandle(&code)) { 2418014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch code = isolate()->builtins()->Illegal(); 2419b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2420b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch share->set_code(*code); 2421c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch share->set_optimized_code_map(*empty_fixed_array()); 2422b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch share->set_scope_info(ScopeInfo::Empty(isolate())); 2423f3b273f5e6ffd2f6ba1c18a27a17db41dfb113c3Ben Murdoch share->set_outer_scope_info(*the_hole_value()); 2424014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Code> construct_stub = 2425014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch is_constructor ? isolate()->builtins()->JSConstructStubGeneric() 2426014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch : isolate()->builtins()->ConstructedNonConstructable(); 2427f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch share->SetConstructStub(*construct_stub); 2428b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch share->set_instance_class_name(*Object_string()); 2429b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch share->set_script(*undefined_value(), SKIP_WRITE_BARRIER); 243062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch share->set_debug_info(Smi::kZero, SKIP_WRITE_BARRIER); 24313b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch share->set_function_identifier(*undefined_value(), SKIP_WRITE_BARRIER); 2432014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch StaticFeedbackVectorSpec empty_spec; 243362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<FeedbackMetadata> feedback_metadata = 243462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch FeedbackMetadata::New(isolate(), &empty_spec); 243513e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch share->set_feedback_metadata(*feedback_metadata, SKIP_WRITE_BARRIER); 243662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch share->set_function_literal_id(FunctionLiteral::kIdTypeInvalid); 2437958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#if TRACE_MAPS 2438958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier share->set_unique_id(isolate()->GetNextUniqueSharedFunctionInfoId()); 2439958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier#endif 2440b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch share->set_profiler_ticks(0); 2441b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch share->set_ast_node_count(0); 2442b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch share->set_counters(0); 2443b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2444b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Set integer fields (smi or int, depending on the architecture). 2445b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch share->set_length(0); 2446014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch share->set_internal_formal_parameter_count(0); 2447b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch share->set_expected_nof_properties(0); 2448b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch share->set_start_position_and_type(0); 2449b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch share->set_end_position(0); 2450b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch share->set_function_token_position(0); 2451b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // All compiler hints default to false or 0. 2452b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch share->set_compiler_hints(0); 2453b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch share->set_opt_count_and_bailout_reason(0); 2454b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2455014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Link into the list. 2456014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Object> new_noscript_list = 2457014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch WeakFixedArray::Add(noscript_shared_function_infos(), share); 2458014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch isolate()->heap()->set_noscript_shared_function_infos(*new_noscript_list); 2459014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2460b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return share; 2461b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2462b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2463b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2464b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochstatic inline int NumberCacheHash(Handle<FixedArray> cache, 2465b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> number) { 2466b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int mask = (cache->length() >> 1) - 1; 2467b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (number->IsSmi()) { 2468b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Handle<Smi>::cast(number)->value() & mask; 2469b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 2470f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch int64_t bits = bit_cast<int64_t>(number->Number()); 2471f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return (static_cast<int>(bits) ^ static_cast<int>(bits >> 32)) & mask; 2472b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 24736ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 24746ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 24756ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 2476b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<Object> Factory::GetNumberStringCache(Handle<Object> number) { 2477b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DisallowHeapAllocation no_gc; 2478b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int hash = NumberCacheHash(number_string_cache(), number); 2479b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Object* key = number_string_cache()->get(hash * 2); 2480b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (key == *number || (key->IsHeapNumber() && number->IsHeapNumber() && 2481b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch key->Number() == number->Number())) { 2482b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return Handle<String>( 2483b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch String::cast(number_string_cache()->get(hash * 2 + 1)), isolate()); 2484b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2485b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return undefined_value(); 2486b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch} 2487b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2488b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 2489b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochvoid Factory::SetNumberStringCache(Handle<Object> number, 2490b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<String> string) { 2491b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int hash = NumberCacheHash(number_string_cache(), number); 2492b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (number_string_cache()->get(hash * 2) != *undefined_value()) { 2493b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int full_size = isolate()->heap()->FullSizeNumberStringCacheLength(); 2494b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (number_string_cache()->length() != full_size) { 2495b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<FixedArray> new_cache = NewFixedArray(full_size, TENURED); 2496b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate()->heap()->set_number_string_cache(*new_cache); 2497b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return; 2498b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2499b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2500b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch number_string_cache()->set(hash * 2, *number); 2501b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch number_string_cache()->set(hash * 2 + 1, *string); 25026ded16be15dd865a9b21ea304d5273c8be299c87Steve Block} 25036ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 25046ded16be15dd865a9b21ea304d5273c8be299c87Steve Block 2505b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<String> Factory::NumberToString(Handle<Object> number, 2506b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch bool check_number_string_cache) { 2507b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch isolate()->counters()->number_to_string_runtime()->Increment(); 2508b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (check_number_string_cache) { 2509b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Object> cached = GetNumberStringCache(number); 251013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch if (!cached->IsUndefined(isolate())) return Handle<String>::cast(cached); 2511b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2512e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 2513b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch char arr[100]; 2514b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Vector<char> buffer(arr, arraysize(arr)); 2515b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch const char* str; 2516b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (number->IsSmi()) { 2517b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch int num = Handle<Smi>::cast(number)->value(); 2518b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch str = IntToCString(num, buffer); 2519b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } else { 2520b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch double num = Handle<HeapNumber>::cast(number)->value(); 2521b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch str = DoubleToCString(num, buffer); 2522b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2523e46be819fca9468a0cd4e74859ce0f778eb8ca60Leon Clarke 2524b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // We tenure the allocated string since it is referenced from the 2525b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // number-string cache which lives in the old space. 2526b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<String> js_string = NewStringFromAsciiChecked(str, TENURED); 2527b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch SetNumberStringCache(number, js_string); 2528b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return js_string; 2529a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2530a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2531a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2532a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<DebugInfo> Factory::NewDebugInfo(Handle<SharedFunctionInfo> shared) { 253362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch DCHECK(!shared->HasDebugInfo()); 2534a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Allocate initial fixed array for active break points before allocating the 2535a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // debug info object to avoid allocation while setting up the debug info 2536a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // object. 2537a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Handle<FixedArray> break_points( 2538b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch NewFixedArray(DebugInfo::kEstimatedNofBreakPointsInFunction)); 2539a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2540f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Make a copy of the bytecode array if available. 2541f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Handle<Object> maybe_debug_bytecode_array = undefined_value(); 2542f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch if (shared->HasBytecodeArray()) { 2543f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Handle<BytecodeArray> original(shared->bytecode_array()); 2544f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch maybe_debug_bytecode_array = CopyBytecodeArray(original); 2545f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 2546f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 2547a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Create and set up the debug info object. Debug info contains function, a 2548a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // copy of the original code, the executing code and initial fixed array for 2549a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // active break points. 2550a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Handle<DebugInfo> debug_info = 255144f0eee88ff00398ff7f715fab053374d808c90dSteve Block Handle<DebugInfo>::cast(NewStruct(DEBUG_INFO_TYPE)); 2552a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block debug_info->set_shared(*shared); 255362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch debug_info->set_debugger_hints(shared->debugger_hints()); 2554f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch debug_info->set_debug_bytecode_array(*maybe_debug_bytecode_array); 2555a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block debug_info->set_break_points(*break_points); 2556a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2557a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block // Link debug info to function. 2558a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block shared->set_debug_info(*debug_info); 2559a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2560a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block return debug_info; 2561a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2562a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 256362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochHandle<BreakPointInfo> Factory::NewBreakPointInfo(int source_position) { 256462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<BreakPointInfo> new_break_point_info = 256562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<BreakPointInfo>::cast(NewStruct(BREAK_POINT_INFO_TYPE)); 256662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch new_break_point_info->set_source_position(source_position); 256762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch new_break_point_info->set_break_point_objects(*undefined_value()); 256862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return new_break_point_info; 256962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch} 2570a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2571b8a8cc1952d61a2f3a2568848933943a543b5d3eBen MurdochHandle<JSObject> Factory::NewArgumentsObject(Handle<JSFunction> callee, 2572a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int length) { 2573014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch bool strict_mode_callee = is_strict(callee->shared()->language_mode()) || 2574014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch !callee->shared()->has_simple_parameters(); 2575b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Map> map = strict_mode_callee ? isolate()->strict_arguments_map() 2576b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch : isolate()->sloppy_arguments_map(); 2577b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch AllocationSiteUsageContext context(isolate(), Handle<AllocationSite>(), 2578b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch false); 2579b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch DCHECK(!isolate()->has_pending_exception()); 2580b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<JSObject> result = NewJSObjectFromMap(map); 2581b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Handle<Smi> value(Smi::FromInt(length), isolate()); 2582b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Object::SetProperty(result, length_string(), value, STRICT).Assert(); 2583b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch if (!strict_mode_callee) { 2584b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch Object::SetProperty(result, callee_string(), callee, STRICT).Assert(); 2585b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch } 2586b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return result; 2587a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2588a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2589a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2590014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<JSWeakMap> Factory::NewJSWeakMap() { 2591014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // TODO(adamk): Currently the map is only created three times per 2592014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // isolate. If it's created more often, the map should be moved into the 2593014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // strong root list. 2594014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Map> map = NewMap(JS_WEAK_MAP_TYPE, JSWeakMap::kSize); 2595014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return Handle<JSWeakMap>::cast(NewJSObjectFromMap(map)); 2596a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2597a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2598a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2599a7e24c173cf37484693b9abb38e494fa7bd7baebSteve BlockHandle<Map> Factory::ObjectLiteralMapFromCache(Handle<Context> context, 2600958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int number_of_properties, 2601958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier bool* is_result_from_cache) { 2602958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier const int kMapCacheSize = 128; 2603958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2604014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // We do not cache maps for too many properties or when running builtin code. 2605014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (number_of_properties > kMapCacheSize || 2606014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch isolate()->bootstrapper()->IsActive()) { 2607958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier *is_result_from_cache = false; 2608014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<Map> map = Map::Create(isolate(), number_of_properties); 2609014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch return map; 2610958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2611958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier *is_result_from_cache = true; 2612958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (number_of_properties == 0) { 2613958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Reuse the initial map of the Object function if the literal has no 26143b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch // predeclared properties. 26153b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch return handle(context->object_function()->initial_map(), isolate()); 2616958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2617014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2618958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier int cache_index = number_of_properties - 1; 26193b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch Handle<Object> maybe_cache(context->map_cache(), isolate()); 262013e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch if (maybe_cache->IsUndefined(isolate())) { 2621b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch // Allocate the new map cache for the native context. 2622014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch maybe_cache = NewFixedArray(kMapCacheSize, TENURED); 26233b9bc31999c9787eb726ecdbfd5796bfdec32a18Ben Murdoch context->set_map_cache(*maybe_cache); 2624014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch } else { 2625014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Check to see whether there is a matching element in the cache. 2626014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<FixedArray> cache = Handle<FixedArray>::cast(maybe_cache); 2627958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Object* result = cache->get(cache_index); 2628958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (result->IsWeakCell()) { 2629958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier WeakCell* cell = WeakCell::cast(result); 2630958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier if (!cell->cleared()) { 2631958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier return handle(Map::cast(cell->value()), isolate()); 2632958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2633958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2634958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier } 2635958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Create a new map and add it to the cache. 2636014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Handle<FixedArray> cache = Handle<FixedArray>::cast(maybe_cache); 2637958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<Map> map = Map::Create(isolate(), number_of_properties); 2638958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Handle<WeakCell> cell = NewWeakCell(map); 2639958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier cache->set(cache_index, *cell); 2640b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return map; 2641a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2642a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2643a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2644a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Factory::SetRegExpAtomData(Handle<JSRegExp> regexp, 2645a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block JSRegExp::Type type, 2646a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Handle<String> source, 2647a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block JSRegExp::Flags flags, 2648a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Handle<Object> data) { 2649a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Handle<FixedArray> store = NewFixedArray(JSRegExp::kAtomDataSize); 2650a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2651a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block store->set(JSRegExp::kTagIndex, Smi::FromInt(type)); 2652a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block store->set(JSRegExp::kSourceIndex, *source); 2653014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch store->set(JSRegExp::kFlagsIndex, Smi::FromInt(flags)); 2654a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block store->set(JSRegExp::kAtomPatternIndex, *data); 2655a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block regexp->set_data(*store); 2656a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2657a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2658958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 2659a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Blockvoid Factory::SetRegExpIrregexpData(Handle<JSRegExp> regexp, 2660a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block JSRegExp::Type type, 2661a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Handle<String> source, 2662a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block JSRegExp::Flags flags, 2663a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block int capture_count) { 2664a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Handle<FixedArray> store = NewFixedArray(JSRegExp::kIrregexpDataSize); 2665257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch Smi* uninitialized = Smi::FromInt(JSRegExp::kUninitializedValue); 2666a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block store->set(JSRegExp::kTagIndex, Smi::FromInt(type)); 2667a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block store->set(JSRegExp::kSourceIndex, *source); 2668014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch store->set(JSRegExp::kFlagsIndex, Smi::FromInt(flags)); 2669b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch store->set(JSRegExp::kIrregexpLatin1CodeIndex, uninitialized); 2670257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch store->set(JSRegExp::kIrregexpUC16CodeIndex, uninitialized); 2671b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch store->set(JSRegExp::kIrregexpLatin1CodeSavedIndex, uninitialized); 2672257744e915dfc84d6d07a6b2accf8402d9ffc708Ben Murdoch store->set(JSRegExp::kIrregexpUC16CodeSavedIndex, uninitialized); 2673c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch store->set(JSRegExp::kIrregexpMaxRegisterCountIndex, Smi::kZero); 2674a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block store->set(JSRegExp::kIrregexpCaptureCountIndex, 2675a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block Smi::FromInt(capture_count)); 267613e2dadd00298019ed862f2b2fc5068bba730bcfBen Murdoch store->set(JSRegExp::kIrregexpCaptureNameMapIndex, uninitialized); 2677a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block regexp->set_data(*store); 2678a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block} 2679a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2680c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen MurdochHandle<RegExpMatchInfo> Factory::NewRegExpMatchInfo() { 2681c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // Initially, the last match info consists of all fixed fields plus space for 2682c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch // the match itself (i.e., 2 capture indices). 2683c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch static const int kInitialSize = RegExpMatchInfo::kFirstCaptureIndex + 2684c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch RegExpMatchInfo::kInitialCaptureIndices; 2685c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 2686c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Handle<FixedArray> elems = NewFixedArray(kInitialSize); 2687c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch Handle<RegExpMatchInfo> result = Handle<RegExpMatchInfo>::cast(elems); 2688c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 2689c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch result->SetNumberOfCaptureRegisters(RegExpMatchInfo::kInitialCaptureIndices); 2690c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch result->SetLastSubject(*empty_string()); 2691c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch result->SetLastInput(*undefined_value()); 2692c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch result->SetCapture(0, 0); 2693c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch result->SetCapture(1, 0); 2694c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 2695c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch return result; 2696c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch} 2697a7e24c173cf37484693b9abb38e494fa7bd7baebSteve Block 2698014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben MurdochHandle<Object> Factory::GlobalConstantFor(Handle<Name> name) { 2699014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (Name::Equals(name, undefined_string())) return undefined_value(); 2700014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (Name::Equals(name, nan_string())) return nan_value(); 2701014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch if (Name::Equals(name, infinity_string())) return infinity_value(); 27023ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch return Handle<Object>::null(); 27033ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 27043ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 27053ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 27063ef787dbeca8a5fb1086949cda830dccee07bfbdBen MurdochHandle<Object> Factory::ToBoolean(bool value) { 2707b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch return value ? true_value() : false_value(); 27083ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch} 27093ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 2710f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochHandle<String> Factory::ToPrimitiveHintString(ToPrimitiveHint hint) { 2711f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch switch (hint) { 2712f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch case ToPrimitiveHint::kDefault: 2713f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return default_string(); 2714f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch case ToPrimitiveHint::kNumber: 2715f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return number_string(); 2716f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch case ToPrimitiveHint::kString: 2717f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return string_string(); 2718f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 2719f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch UNREACHABLE(); 2720f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return Handle<String>::null(); 2721f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} 2722f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 2723f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochHandle<Map> Factory::CreateSloppyFunctionMap(FunctionMode function_mode) { 2724f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Handle<Map> map = NewMap(JS_FUNCTION_TYPE, JSFunction::kSize); 2725f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch SetFunctionInstanceDescriptor(map, function_mode); 2726f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch map->set_is_constructor(IsFunctionModeWithPrototype(function_mode)); 2727f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch map->set_is_callable(); 2728f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return map; 2729f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} 2730f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 2731f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochvoid Factory::SetFunctionInstanceDescriptor(Handle<Map> map, 2732f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch FunctionMode function_mode) { 2733f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch int size = IsFunctionModeWithPrototype(function_mode) ? 5 : 4; 2734f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Map::EnsureDescriptorSlack(map, size); 2735f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 2736f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch PropertyAttributes ro_attribs = 2737f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY); 2738f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch PropertyAttributes roc_attribs = 2739f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY); 2740f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 2741f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch STATIC_ASSERT(JSFunction::kLengthDescriptorIndex == 0); 2742f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Handle<AccessorInfo> length = 2743f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Accessors::FunctionLengthInfo(isolate(), roc_attribs); 2744f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch { // Add length. 274562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Descriptor d = Descriptor::AccessorConstant( 274662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<Name>(Name::cast(length->name())), length, roc_attribs); 2747f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch map->AppendDescriptor(&d); 2748f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 2749f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 2750f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch STATIC_ASSERT(JSFunction::kNameDescriptorIndex == 1); 2751f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Handle<AccessorInfo> name = 275262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Accessors::FunctionNameInfo(isolate(), roc_attribs); 2753f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch { // Add name. 275462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Descriptor d = Descriptor::AccessorConstant( 275562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<Name>(Name::cast(name->name())), name, roc_attribs); 2756f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch map->AppendDescriptor(&d); 2757f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 2758f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Handle<AccessorInfo> args = 2759f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Accessors::FunctionArgumentsInfo(isolate(), ro_attribs); 2760f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch { // Add arguments. 276162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Descriptor d = Descriptor::AccessorConstant( 276262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<Name>(Name::cast(args->name())), args, ro_attribs); 2763f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch map->AppendDescriptor(&d); 2764f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 2765f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Handle<AccessorInfo> caller = 2766f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Accessors::FunctionCallerInfo(isolate(), ro_attribs); 2767f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch { // Add caller. 276862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Descriptor d = Descriptor::AccessorConstant( 276962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<Name>(Name::cast(caller->name())), caller, ro_attribs); 2770f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch map->AppendDescriptor(&d); 2771f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 2772f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch if (IsFunctionModeWithPrototype(function_mode)) { 2773f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch if (function_mode == FUNCTION_WITH_WRITEABLE_PROTOTYPE) { 2774f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch ro_attribs = static_cast<PropertyAttributes>(ro_attribs & ~READ_ONLY); 2775f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 2776f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Handle<AccessorInfo> prototype = 2777f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Accessors::FunctionPrototypeInfo(isolate(), ro_attribs); 277862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Descriptor d = Descriptor::AccessorConstant( 277962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<Name>(Name::cast(prototype->name())), prototype, ro_attribs); 2780f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch map->AppendDescriptor(&d); 2781f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 2782f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} 2783f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 2784f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochHandle<Map> Factory::CreateStrictFunctionMap( 2785f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch FunctionMode function_mode, Handle<JSFunction> empty_function) { 2786f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Handle<Map> map = NewMap(JS_FUNCTION_TYPE, JSFunction::kSize); 2787f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch SetStrictFunctionInstanceDescriptor(map, function_mode); 2788f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch map->set_is_constructor(IsFunctionModeWithPrototype(function_mode)); 2789f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch map->set_is_callable(); 2790f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Map::SetPrototype(map, empty_function); 2791f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch return map; 2792f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} 2793f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 2794f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochvoid Factory::SetStrictFunctionInstanceDescriptor(Handle<Map> map, 2795f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch FunctionMode function_mode) { 2796f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch int size = IsFunctionModeWithPrototype(function_mode) ? 3 : 2; 2797f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Map::EnsureDescriptorSlack(map, size); 2798f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 2799f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch PropertyAttributes rw_attribs = 2800f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE); 2801f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch PropertyAttributes ro_attribs = 2802f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE | READ_ONLY); 2803f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch PropertyAttributes roc_attribs = 2804f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY); 2805f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 2806f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch DCHECK(function_mode == FUNCTION_WITH_WRITEABLE_PROTOTYPE || 2807f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch function_mode == FUNCTION_WITH_READONLY_PROTOTYPE || 2808f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch function_mode == FUNCTION_WITHOUT_PROTOTYPE); 2809f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch STATIC_ASSERT(JSFunction::kLengthDescriptorIndex == 0); 2810f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch { // Add length. 2811f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Handle<AccessorInfo> length = 2812f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Accessors::FunctionLengthInfo(isolate(), roc_attribs); 281362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Descriptor d = Descriptor::AccessorConstant( 281462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch handle(Name::cast(length->name())), length, roc_attribs); 2815f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch map->AppendDescriptor(&d); 2816f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 2817f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch 2818f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch STATIC_ASSERT(JSFunction::kNameDescriptorIndex == 1); 2819f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch { // Add name. 2820f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Handle<AccessorInfo> name = 2821f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Accessors::FunctionNameInfo(isolate(), roc_attribs); 282262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Descriptor d = Descriptor::AccessorConstant( 282362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch handle(Name::cast(name->name())), name, roc_attribs); 2824f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch map->AppendDescriptor(&d); 2825f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 2826f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch if (IsFunctionModeWithPrototype(function_mode)) { 2827f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch // Add prototype. 2828f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch PropertyAttributes attribs = 2829f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch function_mode == FUNCTION_WITH_WRITEABLE_PROTOTYPE ? rw_attribs 2830f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch : ro_attribs; 2831f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Handle<AccessorInfo> prototype = 2832f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch Accessors::FunctionPrototypeInfo(isolate(), attribs); 283362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Descriptor d = Descriptor::AccessorConstant( 283462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<Name>(Name::cast(prototype->name())), prototype, attribs); 2835f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch map->AppendDescriptor(&d); 2836f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch } 2837f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch} 28383ef787dbeca8a5fb1086949cda830dccee07bfbdBen Murdoch 283962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen MurdochHandle<Map> Factory::CreateClassFunctionMap(Handle<JSFunction> empty_function) { 284062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<Map> map = NewMap(JS_FUNCTION_TYPE, JSFunction::kSize); 284162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch SetClassFunctionInstanceDescriptor(map); 284262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch map->set_is_constructor(true); 284362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch map->set_is_callable(); 284462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Map::SetPrototype(map, empty_function); 284562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch return map; 284662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch} 284762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 284862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochvoid Factory::SetClassFunctionInstanceDescriptor(Handle<Map> map) { 284962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Map::EnsureDescriptorSlack(map, 2); 285062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 285162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch PropertyAttributes rw_attribs = 285262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static_cast<PropertyAttributes>(DONT_ENUM | DONT_DELETE); 285362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch PropertyAttributes roc_attribs = 285462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static_cast<PropertyAttributes>(DONT_ENUM | READ_ONLY); 285562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 285662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch STATIC_ASSERT(JSFunction::kLengthDescriptorIndex == 0); 285762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch { // Add length. 285862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<AccessorInfo> length = 285962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Accessors::FunctionLengthInfo(isolate(), roc_attribs); 286062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Descriptor d = Descriptor::AccessorConstant( 286162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch handle(Name::cast(length->name())), length, roc_attribs); 286262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch map->AppendDescriptor(&d); 286362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } 286462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 286562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch { 286662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch // Add prototype. 286762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<AccessorInfo> prototype = 286862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Accessors::FunctionPrototypeInfo(isolate(), rw_attribs); 286962ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Descriptor d = Descriptor::AccessorConstant( 287062ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Handle<Name>(Name::cast(prototype->name())), prototype, rw_attribs); 287162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch map->AppendDescriptor(&d); 287262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch } 2873c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch} 2874c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch 2875014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace internal 2876014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch} // namespace v8 2877