1
// Copyright 2012 the V8 project authors. All rights reserved.
2
// Redistribution and use in source and binary forms, with or without
3
// modification, are permitted provided that the following conditions are
6
// * Redistributions of source code must retain the above copyright
7
// notice, this list of conditions and the following disclaimer.
8
// * Redistributions in binary form must reproduce the above
9
// copyright notice, this list of conditions and the following
10
// disclaimer in the documentation and/or other materials provided
11
// with the distribution.
12
// * Neither the name of Google Inc. nor the names of its
13
// contributors may be used to endorse or promote products derived
14
// from this software without specific prior written permission.
16
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32
#include "execution.h"
34
#include "macro-assembler.h"
36
#include "objects-visiting.h"
38
#include "scopeinfo.h"
44
Handle<FixedArray> Factory::NewFixedArray(int size, PretenureFlag pretenure) {
48
isolate()->heap()->AllocateFixedArray(size, pretenure),
53
Handle<FixedArray> Factory::NewFixedArrayWithHoles(int size,
54
PretenureFlag pretenure) {
58
isolate()->heap()->AllocateFixedArrayWithHoles(size, pretenure),
63
Handle<FixedDoubleArray> Factory::NewFixedDoubleArray(int size,
64
PretenureFlag pretenure) {
68
isolate()->heap()->AllocateUninitializedFixedDoubleArray(size, pretenure),
73
Handle<StringDictionary> Factory::NewStringDictionary(int at_least_space_for) {
74
ASSERT(0 <= at_least_space_for);
75
CALL_HEAP_FUNCTION(isolate(),
76
StringDictionary::Allocate(at_least_space_for),
81
Handle<SeededNumberDictionary> Factory::NewSeededNumberDictionary(
82
int at_least_space_for) {
83
ASSERT(0 <= at_least_space_for);
84
CALL_HEAP_FUNCTION(isolate(),
85
SeededNumberDictionary::Allocate(at_least_space_for),
86
SeededNumberDictionary);
90
Handle<UnseededNumberDictionary> Factory::NewUnseededNumberDictionary(
91
int at_least_space_for) {
92
ASSERT(0 <= at_least_space_for);
93
CALL_HEAP_FUNCTION(isolate(),
94
UnseededNumberDictionary::Allocate(at_least_space_for),
95
UnseededNumberDictionary);
99
Handle<ObjectHashSet> Factory::NewObjectHashSet(int at_least_space_for) {
100
ASSERT(0 <= at_least_space_for);
101
CALL_HEAP_FUNCTION(isolate(),
102
ObjectHashSet::Allocate(at_least_space_for),
107
Handle<ObjectHashTable> Factory::NewObjectHashTable(int at_least_space_for) {
108
ASSERT(0 <= at_least_space_for);
109
CALL_HEAP_FUNCTION(isolate(),
110
ObjectHashTable::Allocate(at_least_space_for),
115
Handle<DescriptorArray> Factory::NewDescriptorArray(int number_of_descriptors) {
116
ASSERT(0 <= number_of_descriptors);
117
CALL_HEAP_FUNCTION(isolate(),
118
DescriptorArray::Allocate(number_of_descriptors,
119
DescriptorArray::MAY_BE_SHARED),
124
Handle<DeoptimizationInputData> Factory::NewDeoptimizationInputData(
125
int deopt_entry_count,
126
PretenureFlag pretenure) {
127
ASSERT(deopt_entry_count > 0);
128
CALL_HEAP_FUNCTION(isolate(),
129
DeoptimizationInputData::Allocate(deopt_entry_count,
131
DeoptimizationInputData);
135
Handle<DeoptimizationOutputData> Factory::NewDeoptimizationOutputData(
136
int deopt_entry_count,
137
PretenureFlag pretenure) {
138
ASSERT(deopt_entry_count > 0);
139
CALL_HEAP_FUNCTION(isolate(),
140
DeoptimizationOutputData::Allocate(deopt_entry_count,
142
DeoptimizationOutputData);
146
Handle<AccessorPair> Factory::NewAccessorPair() {
147
CALL_HEAP_FUNCTION(isolate(),
148
isolate()->heap()->AllocateAccessorPair(),
153
Handle<TypeFeedbackInfo> Factory::NewTypeFeedbackInfo() {
154
CALL_HEAP_FUNCTION(isolate(),
155
isolate()->heap()->AllocateTypeFeedbackInfo(),
160
// Symbols are created in the old generation (data space).
161
Handle<String> Factory::LookupSymbol(Vector<const char> string) {
162
CALL_HEAP_FUNCTION(isolate(),
163
isolate()->heap()->LookupSymbol(string),
167
// Symbols are created in the old generation (data space).
168
Handle<String> Factory::LookupSymbol(Handle<String> string) {
169
CALL_HEAP_FUNCTION(isolate(),
170
isolate()->heap()->LookupSymbol(*string),
174
Handle<String> Factory::LookupAsciiSymbol(Vector<const char> string) {
175
CALL_HEAP_FUNCTION(isolate(),
176
isolate()->heap()->LookupAsciiSymbol(string),
181
Handle<String> Factory::LookupAsciiSymbol(Handle<SeqAsciiString> string,
184
CALL_HEAP_FUNCTION(isolate(),
185
isolate()->heap()->LookupAsciiSymbol(string,
192
Handle<String> Factory::LookupTwoByteSymbol(Vector<const uc16> string) {
193
CALL_HEAP_FUNCTION(isolate(),
194
isolate()->heap()->LookupTwoByteSymbol(string),
199
Handle<String> Factory::NewStringFromAscii(Vector<const char> string,
200
PretenureFlag pretenure) {
203
isolate()->heap()->AllocateStringFromAscii(string, pretenure),
207
Handle<String> Factory::NewStringFromUtf8(Vector<const char> string,
208
PretenureFlag pretenure) {
211
isolate()->heap()->AllocateStringFromUtf8(string, pretenure),
216
Handle<String> Factory::NewStringFromTwoByte(Vector<const uc16> string,
217
PretenureFlag pretenure) {
220
isolate()->heap()->AllocateStringFromTwoByte(string, pretenure),
225
Handle<SeqAsciiString> Factory::NewRawAsciiString(int length,
226
PretenureFlag pretenure) {
229
isolate()->heap()->AllocateRawAsciiString(length, pretenure),
234
Handle<SeqTwoByteString> Factory::NewRawTwoByteString(int length,
235
PretenureFlag pretenure) {
238
isolate()->heap()->AllocateRawTwoByteString(length, pretenure),
243
Handle<String> Factory::NewConsString(Handle<String> first,
244
Handle<String> second) {
245
CALL_HEAP_FUNCTION(isolate(),
246
isolate()->heap()->AllocateConsString(*first, *second),
251
Handle<String> Factory::NewSubString(Handle<String> str,
254
CALL_HEAP_FUNCTION(isolate(),
255
str->SubString(begin, end),
260
Handle<String> Factory::NewProperSubString(Handle<String> str,
263
ASSERT(begin > 0 || end < str->length());
264
CALL_HEAP_FUNCTION(isolate(),
265
isolate()->heap()->AllocateSubString(*str, begin, end),
270
Handle<String> Factory::NewExternalStringFromAscii(
271
const ExternalAsciiString::Resource* resource) {
274
isolate()->heap()->AllocateExternalStringFromAscii(resource),
279
Handle<String> Factory::NewExternalStringFromTwoByte(
280
const ExternalTwoByteString::Resource* resource) {
283
isolate()->heap()->AllocateExternalStringFromTwoByte(resource),
288
Handle<Context> Factory::NewGlobalContext() {
291
isolate()->heap()->AllocateGlobalContext(),
296
Handle<Context> Factory::NewModuleContext(Handle<ScopeInfo> scope_info) {
299
isolate()->heap()->AllocateModuleContext(*scope_info),
304
Handle<Context> Factory::NewFunctionContext(int length,
305
Handle<JSFunction> function) {
308
isolate()->heap()->AllocateFunctionContext(length, *function),
313
Handle<Context> Factory::NewCatchContext(Handle<JSFunction> function,
314
Handle<Context> previous,
316
Handle<Object> thrown_object) {
319
isolate()->heap()->AllocateCatchContext(*function,
327
Handle<Context> Factory::NewWithContext(Handle<JSFunction> function,
328
Handle<Context> previous,
329
Handle<JSObject> extension) {
332
isolate()->heap()->AllocateWithContext(*function, *previous, *extension),
337
Handle<Context> Factory::NewBlockContext(Handle<JSFunction> function,
338
Handle<Context> previous,
339
Handle<ScopeInfo> scope_info) {
342
isolate()->heap()->AllocateBlockContext(*function,
349
Handle<Struct> Factory::NewStruct(InstanceType type) {
352
isolate()->heap()->AllocateStruct(type),
357
Handle<AccessorInfo> Factory::NewAccessorInfo() {
358
Handle<AccessorInfo> info =
359
Handle<AccessorInfo>::cast(NewStruct(ACCESSOR_INFO_TYPE));
360
info->set_flag(0); // Must clear the flag, it was initialized as undefined.
365
Handle<Script> Factory::NewScript(Handle<String> source) {
366
// Generate id for this script.
368
Heap* heap = isolate()->heap();
369
if (heap->last_script_id()->IsUndefined()) {
370
// Script ids start from one.
373
// Increment id, wrap when positive smi is exhausted.
374
id = Smi::cast(heap->last_script_id())->value();
376
if (!Smi::IsValid(id)) {
380
heap->SetLastScriptId(Smi::FromInt(id));
382
// Create and initialize script object.
383
Handle<Foreign> wrapper = NewForeign(0, TENURED);
384
Handle<Script> script = Handle<Script>::cast(NewStruct(SCRIPT_TYPE));
385
script->set_source(*source);
386
script->set_name(heap->undefined_value());
387
script->set_id(heap->last_script_id());
388
script->set_line_offset(Smi::FromInt(0));
389
script->set_column_offset(Smi::FromInt(0));
390
script->set_data(heap->undefined_value());
391
script->set_context_data(heap->undefined_value());
392
script->set_type(Smi::FromInt(Script::TYPE_NORMAL));
393
script->set_compilation_type(Smi::FromInt(Script::COMPILATION_TYPE_HOST));
394
script->set_compilation_state(
395
Smi::FromInt(Script::COMPILATION_STATE_INITIAL));
396
script->set_wrapper(*wrapper);
397
script->set_line_ends(heap->undefined_value());
398
script->set_eval_from_shared(heap->undefined_value());
399
script->set_eval_from_instructions_offset(Smi::FromInt(0));
405
Handle<Foreign> Factory::NewForeign(Address addr, PretenureFlag pretenure) {
406
CALL_HEAP_FUNCTION(isolate(),
407
isolate()->heap()->AllocateForeign(addr, pretenure),
412
Handle<Foreign> Factory::NewForeign(const AccessorDescriptor* desc) {
413
return NewForeign((Address) desc, TENURED);
417
Handle<ByteArray> Factory::NewByteArray(int length, PretenureFlag pretenure) {
421
isolate()->heap()->AllocateByteArray(length, pretenure),
426
Handle<ExternalArray> Factory::NewExternalArray(int length,
427
ExternalArrayType array_type,
428
void* external_pointer,
429
PretenureFlag pretenure) {
433
isolate()->heap()->AllocateExternalArray(length,
441
Handle<JSGlobalPropertyCell> Factory::NewJSGlobalPropertyCell(
442
Handle<Object> value) {
445
isolate()->heap()->AllocateJSGlobalPropertyCell(*value),
446
JSGlobalPropertyCell);
450
Handle<Map> Factory::NewMap(InstanceType type,
452
ElementsKind elements_kind) {
455
isolate()->heap()->AllocateMap(type, instance_size, elements_kind),
460
Handle<JSObject> Factory::NewFunctionPrototype(Handle<JSFunction> function) {
463
isolate()->heap()->AllocateFunctionPrototype(*function),
468
Handle<Map> Factory::CopyWithPreallocatedFieldDescriptors(Handle<Map> src) {
470
isolate(), src->CopyWithPreallocatedFieldDescriptors(), Map);
474
Handle<Map> Factory::CopyMap(Handle<Map> src,
475
int extra_inobject_properties) {
476
Handle<Map> copy = CopyWithPreallocatedFieldDescriptors(src);
477
// Check that we do not overflow the instance size when adding the
478
// extra inobject properties.
479
int instance_size_delta = extra_inobject_properties * kPointerSize;
480
int max_instance_size_delta =
481
JSObject::kMaxInstanceSize - copy->instance_size();
482
if (instance_size_delta > max_instance_size_delta) {
483
// If the instance size overflows, we allocate as many properties
484
// as we can as inobject properties.
485
instance_size_delta = max_instance_size_delta;
486
extra_inobject_properties = max_instance_size_delta >> kPointerSizeLog2;
488
// Adjust the map with the extra inobject properties.
489
int inobject_properties =
490
copy->inobject_properties() + extra_inobject_properties;
491
copy->set_inobject_properties(inobject_properties);
492
copy->set_unused_property_fields(inobject_properties);
493
copy->set_instance_size(copy->instance_size() + instance_size_delta);
494
copy->set_visitor_id(StaticVisitorBase::GetVisitorId(*copy));
499
Handle<Map> Factory::CopyMap(Handle<Map> src) {
500
CALL_HEAP_FUNCTION(isolate(), src->Copy(DescriptorArray::MAY_BE_SHARED), Map);
504
Handle<Map> Factory::GetElementsTransitionMap(
505
Handle<JSObject> src,
506
ElementsKind elements_kind) {
507
Isolate* i = isolate();
508
CALL_HEAP_FUNCTION(i,
509
src->GetElementsTransitionMap(i, elements_kind),
514
Handle<FixedArray> Factory::CopyFixedArray(Handle<FixedArray> array) {
515
CALL_HEAP_FUNCTION(isolate(), array->Copy(), FixedArray);
519
Handle<FixedDoubleArray> Factory::CopyFixedDoubleArray(
520
Handle<FixedDoubleArray> array) {
521
CALL_HEAP_FUNCTION(isolate(), array->Copy(), FixedDoubleArray);
525
Handle<JSFunction> Factory::BaseNewFunctionFromSharedFunctionInfo(
526
Handle<SharedFunctionInfo> function_info,
527
Handle<Map> function_map,
528
PretenureFlag pretenure) {
531
isolate()->heap()->AllocateFunction(*function_map,
533
isolate()->heap()->the_hole_value(),
539
Handle<JSFunction> Factory::NewFunctionFromSharedFunctionInfo(
540
Handle<SharedFunctionInfo> function_info,
541
Handle<Context> context,
542
PretenureFlag pretenure) {
543
Handle<JSFunction> result = BaseNewFunctionFromSharedFunctionInfo(
545
function_info->is_classic_mode()
546
? isolate()->function_map()
547
: isolate()->strict_mode_function_map(),
550
if (function_info->ic_age() != isolate()->heap()->global_ic_age()) {
551
function_info->ResetForNewContext(isolate()->heap()->global_ic_age());
554
result->set_context(*context);
556
int index = function_info->SearchOptimizedCodeMap(context->global_context());
557
if (!function_info->bound() && index < 0) {
558
int number_of_literals = function_info->num_literals();
559
Handle<FixedArray> literals = NewFixedArray(number_of_literals, pretenure);
560
if (number_of_literals > 0) {
561
// Store the global context in the literals array prefix. This
562
// context will be used when creating object, regexp and array
563
// literals in this function.
564
literals->set(JSFunction::kLiteralGlobalContextIndex,
565
context->global_context());
567
result->set_literals(*literals);
571
// Caching of optimized code enabled and optimized code found.
572
function_info->InstallFromOptimizedCodeMap(*result, index);
576
if (V8::UseCrankshaft() &&
578
result->is_compiled() &&
579
!function_info->is_toplevel() &&
580
function_info->allows_lazy_compilation() &&
581
!function_info->optimization_disabled()) {
582
result->MarkForLazyRecompilation();
588
Handle<Object> Factory::NewNumber(double value,
589
PretenureFlag pretenure) {
592
isolate()->heap()->NumberFromDouble(value, pretenure), Object);
596
Handle<Object> Factory::NewNumberFromInt(int32_t value,
597
PretenureFlag pretenure) {
600
isolate()->heap()->NumberFromInt32(value, pretenure), Object);
604
Handle<Object> Factory::NewNumberFromUint(uint32_t value,
605
PretenureFlag pretenure) {
608
isolate()->heap()->NumberFromUint32(value, pretenure), Object);
612
Handle<JSObject> Factory::NewNeanderObject() {
615
isolate()->heap()->AllocateJSObjectFromMap(
616
isolate()->heap()->neander_map()),
621
Handle<Object> Factory::NewTypeError(const char* type,
622
Vector< Handle<Object> > args) {
623
return NewError("MakeTypeError", type, args);
627
Handle<Object> Factory::NewTypeError(Handle<String> message) {
628
return NewError("$TypeError", message);
632
Handle<Object> Factory::NewRangeError(const char* type,
633
Vector< Handle<Object> > args) {
634
return NewError("MakeRangeError", type, args);
638
Handle<Object> Factory::NewRangeError(Handle<String> message) {
639
return NewError("$RangeError", message);
643
Handle<Object> Factory::NewSyntaxError(const char* type, Handle<JSArray> args) {
644
return NewError("MakeSyntaxError", type, args);
648
Handle<Object> Factory::NewSyntaxError(Handle<String> message) {
649
return NewError("$SyntaxError", message);
653
Handle<Object> Factory::NewReferenceError(const char* type,
654
Vector< Handle<Object> > args) {
655
return NewError("MakeReferenceError", type, args);
659
Handle<Object> Factory::NewReferenceError(Handle<String> message) {
660
return NewError("$ReferenceError", message);
664
Handle<Object> Factory::NewError(const char* maker, const char* type,
665
Vector< Handle<Object> > args) {
666
v8::HandleScope scope; // Instantiate a closeable HandleScope for EscapeFrom.
667
Handle<FixedArray> array = NewFixedArray(args.length());
668
for (int i = 0; i < args.length(); i++) {
669
array->set(i, *args[i]);
671
Handle<JSArray> object = NewJSArrayWithElements(array);
672
Handle<Object> result = NewError(maker, type, object);
673
return result.EscapeFrom(&scope);
677
Handle<Object> Factory::NewEvalError(const char* type,
678
Vector< Handle<Object> > args) {
679
return NewError("MakeEvalError", type, args);
683
Handle<Object> Factory::NewError(const char* type,
684
Vector< Handle<Object> > args) {
685
return NewError("MakeError", type, args);
689
Handle<String> Factory::EmergencyNewError(const char* type,
690
Handle<JSArray> args) {
691
const int kBufferSize = 1000;
692
char buffer[kBufferSize];
693
size_t space = kBufferSize;
694
char* p = &buffer[0];
696
Vector<char> v(buffer, kBufferSize);
697
OS::StrNCpy(v, type, space);
698
space -= Min(space, strlen(type));
699
p = &buffer[kBufferSize] - space;
701
for (unsigned i = 0; i < ARRAY_SIZE(args); i++) {
706
MaybeObject* maybe_arg = args->GetElement(i);
707
Handle<String> arg_str(reinterpret_cast<String*>(maybe_arg));
708
const char* arg = *arg_str->ToCString();
709
Vector<char> v2(p, static_cast<int>(space));
710
OS::StrNCpy(v2, arg, space);
711
space -= Min(space, strlen(arg));
712
p = &buffer[kBufferSize] - space;
719
buffer[kBufferSize - 1] = '\0';
721
Handle<String> error_string = NewStringFromUtf8(CStrVector(buffer), TENURED);
726
Handle<Object> Factory::NewError(const char* maker,
728
Handle<JSArray> args) {
729
Handle<String> make_str = LookupAsciiSymbol(maker);
730
Handle<Object> fun_obj(
731
isolate()->js_builtins_object()->GetPropertyNoExceptionThrown(*make_str));
732
// If the builtins haven't been properly configured yet this error
733
// constructor may not have been defined. Bail out.
734
if (!fun_obj->IsJSFunction()) {
735
return EmergencyNewError(type, args);
737
Handle<JSFunction> fun = Handle<JSFunction>::cast(fun_obj);
738
Handle<Object> type_obj = LookupAsciiSymbol(type);
739
Handle<Object> argv[] = { type_obj, args };
741
// Invoke the JavaScript factory method. If an exception is thrown while
742
// running the factory method, use the exception as the result.
743
bool caught_exception;
744
Handle<Object> result = Execution::TryCall(fun,
745
isolate()->js_builtins_object(),
753
Handle<Object> Factory::NewError(Handle<String> message) {
754
return NewError("$Error", message);
758
Handle<Object> Factory::NewError(const char* constructor,
759
Handle<String> message) {
760
Handle<String> constr = LookupAsciiSymbol(constructor);
761
Handle<JSFunction> fun = Handle<JSFunction>(
762
JSFunction::cast(isolate()->js_builtins_object()->
763
GetPropertyNoExceptionThrown(*constr)));
764
Handle<Object> argv[] = { message };
766
// Invoke the JavaScript factory method. If an exception is thrown while
767
// running the factory method, use the exception as the result.
768
bool caught_exception;
769
Handle<Object> result = Execution::TryCall(fun,
770
isolate()->js_builtins_object(),
778
Handle<JSFunction> Factory::NewFunction(Handle<String> name,
782
bool force_initial_map) {
783
// Allocate the function
784
Handle<JSFunction> function = NewFunction(name, the_hole_value());
786
// Set up the code pointer in both the shared function info and in
787
// the function itself.
788
function->shared()->set_code(*code);
789
function->set_code(*code);
791
if (force_initial_map ||
792
type != JS_OBJECT_TYPE ||
793
instance_size != JSObject::kHeaderSize) {
794
Handle<Map> initial_map = NewMap(type, instance_size);
795
Handle<JSObject> prototype = NewFunctionPrototype(function);
796
initial_map->set_prototype(*prototype);
797
function->set_initial_map(*initial_map);
798
initial_map->set_constructor(*function);
800
ASSERT(!function->has_initial_map());
801
ASSERT(!function->has_prototype());
808
Handle<JSFunction> Factory::NewFunctionWithPrototype(Handle<String> name,
811
Handle<JSObject> prototype,
813
bool force_initial_map) {
814
// Allocate the function.
815
Handle<JSFunction> function = NewFunction(name, prototype);
817
// Set up the code pointer in both the shared function info and in
818
// the function itself.
819
function->shared()->set_code(*code);
820
function->set_code(*code);
822
if (force_initial_map ||
823
type != JS_OBJECT_TYPE ||
824
instance_size != JSObject::kHeaderSize) {
825
Handle<Map> initial_map = NewMap(type,
827
GetInitialFastElementsKind());
828
function->set_initial_map(*initial_map);
829
initial_map->set_constructor(*function);
832
// Set function.prototype and give the prototype a constructor
833
// property that refers to the function.
834
SetPrototypeProperty(function, prototype);
835
// Currently safe because it is only invoked from Genesis.
836
CHECK_NOT_EMPTY_HANDLE(isolate(),
837
JSObject::SetLocalPropertyIgnoreAttributes(
838
prototype, constructor_symbol(),
839
function, DONT_ENUM));
844
Handle<JSFunction> Factory::NewFunctionWithoutPrototype(Handle<String> name,
846
Handle<JSFunction> function = NewFunctionWithoutPrototype(name,
848
function->shared()->set_code(*code);
849
function->set_code(*code);
850
ASSERT(!function->has_initial_map());
851
ASSERT(!function->has_prototype());
856
Handle<ScopeInfo> Factory::NewScopeInfo(int length) {
859
isolate()->heap()->AllocateScopeInfo(length),
864
Handle<Code> Factory::NewCode(const CodeDesc& desc,
866
Handle<Object> self_ref,
868
CALL_HEAP_FUNCTION(isolate(),
869
isolate()->heap()->CreateCode(
870
desc, flags, self_ref, immovable),
875
Handle<Code> Factory::CopyCode(Handle<Code> code) {
876
CALL_HEAP_FUNCTION(isolate(),
877
isolate()->heap()->CopyCode(*code),
882
Handle<Code> Factory::CopyCode(Handle<Code> code, Vector<byte> reloc_info) {
883
CALL_HEAP_FUNCTION(isolate(),
884
isolate()->heap()->CopyCode(*code, reloc_info),
889
Handle<String> Factory::SymbolFromString(Handle<String> value) {
890
CALL_HEAP_FUNCTION(isolate(),
891
isolate()->heap()->LookupSymbol(*value), String);
895
Handle<JSObject> Factory::NewJSObject(Handle<JSFunction> constructor,
896
PretenureFlag pretenure) {
899
isolate()->heap()->AllocateJSObject(*constructor, pretenure), JSObject);
903
Handle<JSModule> Factory::NewJSModule(Handle<Context> context,
904
Handle<ScopeInfo> scope_info) {
907
isolate()->heap()->AllocateJSModule(*context, *scope_info), JSModule);
911
Handle<GlobalObject> Factory::NewGlobalObject(
912
Handle<JSFunction> constructor) {
913
CALL_HEAP_FUNCTION(isolate(),
914
isolate()->heap()->AllocateGlobalObject(*constructor),
920
Handle<JSObject> Factory::NewJSObjectFromMap(Handle<Map> map) {
923
isolate()->heap()->AllocateJSObjectFromMap(*map, NOT_TENURED),
928
Handle<JSArray> Factory::NewJSArray(int capacity,
929
ElementsKind elements_kind,
930
PretenureFlag pretenure) {
931
CALL_HEAP_FUNCTION(isolate(),
932
isolate()->heap()->AllocateJSArrayAndStorage(
936
INITIALIZE_ARRAY_ELEMENTS_WITH_HOLE,
942
Handle<JSArray> Factory::NewJSArrayWithElements(Handle<FixedArrayBase> elements,
943
ElementsKind elements_kind,
944
PretenureFlag pretenure) {
947
isolate()->heap()->AllocateJSArrayWithElements(*elements,
954
void Factory::SetElementsCapacityAndLength(Handle<JSArray> array,
957
ElementsAccessor* accessor = array->GetElementsAccessor();
958
CALL_HEAP_FUNCTION_VOID(
960
accessor->SetCapacityAndLength(*array, capacity, length));
964
void Factory::SetContent(Handle<JSArray> array,
965
Handle<FixedArrayBase> elements) {
966
CALL_HEAP_FUNCTION_VOID(
968
array->SetContent(*elements));
972
void Factory::EnsureCanContainHeapObjectElements(Handle<JSArray> array) {
973
CALL_HEAP_FUNCTION_VOID(
975
array->EnsureCanContainHeapObjectElements());
979
void Factory::EnsureCanContainElements(Handle<JSArray> array,
980
Handle<FixedArrayBase> elements,
982
EnsureElementsMode mode) {
983
CALL_HEAP_FUNCTION_VOID(
985
array->EnsureCanContainElements(*elements, length, mode));
989
Handle<JSProxy> Factory::NewJSProxy(Handle<Object> handler,
990
Handle<Object> prototype) {
993
isolate()->heap()->AllocateJSProxy(*handler, *prototype),
998
void Factory::BecomeJSObject(Handle<JSReceiver> object) {
999
CALL_HEAP_FUNCTION_VOID(
1001
isolate()->heap()->ReinitializeJSReceiver(
1002
*object, JS_OBJECT_TYPE, JSObject::kHeaderSize));
1006
void Factory::BecomeJSFunction(Handle<JSReceiver> object) {
1007
CALL_HEAP_FUNCTION_VOID(
1009
isolate()->heap()->ReinitializeJSReceiver(
1010
*object, JS_FUNCTION_TYPE, JSFunction::kSize));
1014
void Factory::SetIdentityHash(Handle<JSObject> object, Smi* hash) {
1015
CALL_HEAP_FUNCTION_VOID(
1017
object->SetIdentityHash(hash, ALLOW_CREATION));
1021
Handle<SharedFunctionInfo> Factory::NewSharedFunctionInfo(
1022
Handle<String> name,
1023
int number_of_literals,
1025
Handle<ScopeInfo> scope_info) {
1026
Handle<SharedFunctionInfo> shared = NewSharedFunctionInfo(name);
1027
shared->set_code(*code);
1028
shared->set_scope_info(*scope_info);
1029
int literals_array_size = number_of_literals;
1030
// If the function contains object, regexp or array literals,
1031
// allocate extra space for a literals array prefix containing the
1033
if (number_of_literals > 0) {
1034
literals_array_size += JSFunction::kLiteralsPrefixSize;
1036
shared->set_num_literals(literals_array_size);
1041
Handle<JSMessageObject> Factory::NewJSMessageObject(
1042
Handle<String> type,
1043
Handle<JSArray> arguments,
1046
Handle<Object> script,
1047
Handle<Object> stack_trace,
1048
Handle<Object> stack_frames) {
1049
CALL_HEAP_FUNCTION(isolate(),
1050
isolate()->heap()->AllocateJSMessageObject(*type,
1060
Handle<SharedFunctionInfo> Factory::NewSharedFunctionInfo(Handle<String> name) {
1061
CALL_HEAP_FUNCTION(isolate(),
1062
isolate()->heap()->AllocateSharedFunctionInfo(*name),
1063
SharedFunctionInfo);
1067
Handle<String> Factory::NumberToString(Handle<Object> number) {
1068
CALL_HEAP_FUNCTION(isolate(),
1069
isolate()->heap()->NumberToString(*number), String);
1073
Handle<String> Factory::Uint32ToString(uint32_t value) {
1074
CALL_HEAP_FUNCTION(isolate(),
1075
isolate()->heap()->Uint32ToString(value), String);
1079
Handle<SeededNumberDictionary> Factory::DictionaryAtNumberPut(
1080
Handle<SeededNumberDictionary> dictionary,
1082
Handle<Object> value) {
1083
CALL_HEAP_FUNCTION(isolate(),
1084
dictionary->AtNumberPut(key, *value),
1085
SeededNumberDictionary);
1089
Handle<UnseededNumberDictionary> Factory::DictionaryAtNumberPut(
1090
Handle<UnseededNumberDictionary> dictionary,
1092
Handle<Object> value) {
1093
CALL_HEAP_FUNCTION(isolate(),
1094
dictionary->AtNumberPut(key, *value),
1095
UnseededNumberDictionary);
1099
Handle<JSFunction> Factory::NewFunctionHelper(Handle<String> name,
1100
Handle<Object> prototype) {
1101
Handle<SharedFunctionInfo> function_share = NewSharedFunctionInfo(name);
1104
isolate()->heap()->AllocateFunction(*isolate()->function_map(),
1111
Handle<JSFunction> Factory::NewFunction(Handle<String> name,
1112
Handle<Object> prototype) {
1113
Handle<JSFunction> fun = NewFunctionHelper(name, prototype);
1114
fun->set_context(isolate()->context()->global_context());
1119
Handle<JSFunction> Factory::NewFunctionWithoutPrototypeHelper(
1120
Handle<String> name,
1121
LanguageMode language_mode) {
1122
Handle<SharedFunctionInfo> function_share = NewSharedFunctionInfo(name);
1123
Handle<Map> map = (language_mode == CLASSIC_MODE)
1124
? isolate()->function_without_prototype_map()
1125
: isolate()->strict_mode_function_without_prototype_map();
1126
CALL_HEAP_FUNCTION(isolate(),
1127
isolate()->heap()->AllocateFunction(
1135
Handle<JSFunction> Factory::NewFunctionWithoutPrototype(
1136
Handle<String> name,
1137
LanguageMode language_mode) {
1138
Handle<JSFunction> fun =
1139
NewFunctionWithoutPrototypeHelper(name, language_mode);
1140
fun->set_context(isolate()->context()->global_context());
1145
Handle<Object> Factory::ToObject(Handle<Object> object) {
1146
CALL_HEAP_FUNCTION(isolate(), object->ToObject(), Object);
1150
Handle<Object> Factory::ToObject(Handle<Object> object,
1151
Handle<Context> global_context) {
1152
CALL_HEAP_FUNCTION(isolate(), object->ToObject(*global_context), Object);
1156
#ifdef ENABLE_DEBUGGER_SUPPORT
1157
Handle<DebugInfo> Factory::NewDebugInfo(Handle<SharedFunctionInfo> shared) {
1158
// Get the original code of the function.
1159
Handle<Code> code(shared->code());
1161
// Create a copy of the code before allocating the debug info object to avoid
1162
// allocation while setting up the debug info object.
1163
Handle<Code> original_code(*Factory::CopyCode(code));
1165
// Allocate initial fixed array for active break points before allocating the
1166
// debug info object to avoid allocation while setting up the debug info
1168
Handle<FixedArray> break_points(
1169
NewFixedArray(Debug::kEstimatedNofBreakPointsInFunction));
1171
// Create and set up the debug info object. Debug info contains function, a
1172
// copy of the original code, the executing code and initial fixed array for
1173
// active break points.
1174
Handle<DebugInfo> debug_info =
1175
Handle<DebugInfo>::cast(NewStruct(DEBUG_INFO_TYPE));
1176
debug_info->set_shared(*shared);
1177
debug_info->set_original_code(*original_code);
1178
debug_info->set_code(*code);
1179
debug_info->set_break_points(*break_points);
1181
// Link debug info to function.
1182
shared->set_debug_info(*debug_info);
1189
Handle<JSObject> Factory::NewArgumentsObject(Handle<Object> callee,
1193
isolate()->heap()->AllocateArgumentsObject(*callee, length), JSObject);
1197
Handle<JSFunction> Factory::CreateApiFunction(
1198
Handle<FunctionTemplateInfo> obj, ApiInstanceType instance_type) {
1199
Handle<Code> code = isolate()->builtins()->HandleApiCall();
1200
Handle<Code> construct_stub = isolate()->builtins()->JSConstructStubApi();
1202
int internal_field_count = 0;
1203
if (!obj->instance_template()->IsUndefined()) {
1204
Handle<ObjectTemplateInfo> instance_template =
1205
Handle<ObjectTemplateInfo>(
1206
ObjectTemplateInfo::cast(obj->instance_template()));
1207
internal_field_count =
1208
Smi::cast(instance_template->internal_field_count())->value();
1211
int instance_size = kPointerSize * internal_field_count;
1212
InstanceType type = INVALID_TYPE;
1213
switch (instance_type) {
1214
case JavaScriptObject:
1215
type = JS_OBJECT_TYPE;
1216
instance_size += JSObject::kHeaderSize;
1218
case InnerGlobalObject:
1219
type = JS_GLOBAL_OBJECT_TYPE;
1220
instance_size += JSGlobalObject::kSize;
1222
case OuterGlobalObject:
1223
type = JS_GLOBAL_PROXY_TYPE;
1224
instance_size += JSGlobalProxy::kSize;
1229
ASSERT(type != INVALID_TYPE);
1231
Handle<JSFunction> result =
1232
NewFunction(Factory::empty_symbol(),
1238
Handle<Object> class_name = Handle<Object>(obj->class_name());
1239
if (class_name->IsString()) {
1240
result->shared()->set_instance_class_name(*class_name);
1241
result->shared()->set_name(*class_name);
1244
Handle<Map> map = Handle<Map>(result->initial_map());
1246
// Mark as undetectable if needed.
1247
if (obj->undetectable()) {
1248
map->set_is_undetectable();
1251
// Mark as hidden for the __proto__ accessor if needed.
1252
if (obj->hidden_prototype()) {
1253
map->set_is_hidden_prototype();
1256
// Mark as needs_access_check if needed.
1257
if (obj->needs_access_check()) {
1258
map->set_is_access_check_needed(true);
1261
// Set interceptor information in the map.
1262
if (!obj->named_property_handler()->IsUndefined()) {
1263
map->set_has_named_interceptor();
1265
if (!obj->indexed_property_handler()->IsUndefined()) {
1266
map->set_has_indexed_interceptor();
1269
// Set instance call-as-function information in the map.
1270
if (!obj->instance_call_handler()->IsUndefined()) {
1271
map->set_has_instance_call_handler();
1274
result->shared()->set_function_data(*obj);
1275
result->shared()->set_construct_stub(*construct_stub);
1276
result->shared()->DontAdaptArguments();
1278
// Recursively copy parent templates' accessors, 'data' may be modified.
1280
Handle<Object> props = Handle<Object>(obj->property_accessors());
1281
if (!props->IsUndefined()) {
1282
Map::CopyAppendCallbackDescriptors(map, props);
1284
Handle<Object> parent = Handle<Object>(obj->parent_template());
1285
if (parent->IsUndefined()) break;
1286
obj = Handle<FunctionTemplateInfo>::cast(parent);
1289
ASSERT(result->shared()->IsApiFunction());
1294
Handle<MapCache> Factory::NewMapCache(int at_least_space_for) {
1295
CALL_HEAP_FUNCTION(isolate(),
1296
MapCache::Allocate(at_least_space_for), MapCache);
1300
MUST_USE_RESULT static MaybeObject* UpdateMapCacheWith(Context* context,
1304
{ MaybeObject* maybe_result =
1305
MapCache::cast(context->map_cache())->Put(keys, map);
1306
if (!maybe_result->ToObject(&result)) return maybe_result;
1308
context->set_map_cache(MapCache::cast(result));
1313
Handle<MapCache> Factory::AddToMapCache(Handle<Context> context,
1314
Handle<FixedArray> keys,
1316
CALL_HEAP_FUNCTION(isolate(),
1317
UpdateMapCacheWith(*context, *keys, *map), MapCache);
1321
Handle<Map> Factory::ObjectLiteralMapFromCache(Handle<Context> context,
1322
Handle<FixedArray> keys) {
1323
if (context->map_cache()->IsUndefined()) {
1324
// Allocate the new map cache for the global context.
1325
Handle<MapCache> new_cache = NewMapCache(24);
1326
context->set_map_cache(*new_cache);
1328
// Check to see whether there is a matching element in the cache.
1329
Handle<MapCache> cache =
1330
Handle<MapCache>(MapCache::cast(context->map_cache()));
1331
Handle<Object> result = Handle<Object>(cache->Lookup(*keys));
1332
if (result->IsMap()) return Handle<Map>::cast(result);
1333
// Create a new map and add it to the cache.
1335
CopyMap(Handle<Map>(context->object_function()->initial_map()),
1337
AddToMapCache(context, keys, map);
1338
return Handle<Map>(map);
1342
void Factory::SetRegExpAtomData(Handle<JSRegExp> regexp,
1343
JSRegExp::Type type,
1344
Handle<String> source,
1345
JSRegExp::Flags flags,
1346
Handle<Object> data) {
1347
Handle<FixedArray> store = NewFixedArray(JSRegExp::kAtomDataSize);
1349
store->set(JSRegExp::kTagIndex, Smi::FromInt(type));
1350
store->set(JSRegExp::kSourceIndex, *source);
1351
store->set(JSRegExp::kFlagsIndex, Smi::FromInt(flags.value()));
1352
store->set(JSRegExp::kAtomPatternIndex, *data);
1353
regexp->set_data(*store);
1356
void Factory::SetRegExpIrregexpData(Handle<JSRegExp> regexp,
1357
JSRegExp::Type type,
1358
Handle<String> source,
1359
JSRegExp::Flags flags,
1360
int capture_count) {
1361
Handle<FixedArray> store = NewFixedArray(JSRegExp::kIrregexpDataSize);
1362
Smi* uninitialized = Smi::FromInt(JSRegExp::kUninitializedValue);
1363
store->set(JSRegExp::kTagIndex, Smi::FromInt(type));
1364
store->set(JSRegExp::kSourceIndex, *source);
1365
store->set(JSRegExp::kFlagsIndex, Smi::FromInt(flags.value()));
1366
store->set(JSRegExp::kIrregexpASCIICodeIndex, uninitialized);
1367
store->set(JSRegExp::kIrregexpUC16CodeIndex, uninitialized);
1368
store->set(JSRegExp::kIrregexpASCIICodeSavedIndex, uninitialized);
1369
store->set(JSRegExp::kIrregexpUC16CodeSavedIndex, uninitialized);
1370
store->set(JSRegExp::kIrregexpMaxRegisterCountIndex, Smi::FromInt(0));
1371
store->set(JSRegExp::kIrregexpCaptureCountIndex,
1372
Smi::FromInt(capture_count));
1373
regexp->set_data(*store);
1378
void Factory::ConfigureInstance(Handle<FunctionTemplateInfo> desc,
1379
Handle<JSObject> instance,
1380
bool* pending_exception) {
1381
// Configure the instance by adding the properties specified by the
1382
// instance template.
1383
Handle<Object> instance_template = Handle<Object>(desc->instance_template());
1384
if (!instance_template->IsUndefined()) {
1385
Execution::ConfigureInstance(instance,
1389
*pending_exception = false;
1394
Handle<Object> Factory::GlobalConstantFor(Handle<String> name) {
1395
Heap* h = isolate()->heap();
1396
if (name->Equals(h->undefined_symbol())) return undefined_value();
1397
if (name->Equals(h->nan_symbol())) return nan_value();
1398
if (name->Equals(h->infinity_symbol())) return infinity_value();
1399
return Handle<Object>::null();
1403
Handle<Object> Factory::ToBoolean(bool value) {
1404
return Handle<Object>(value
1405
? isolate()->heap()->true_value()
1406
: isolate()->heap()->false_value());
1410
} } // namespace v8::internal