blob: 87c5dd549c3655f9de133b14660d65af9a68f01b [file] [log] [blame]
Ben Murdochf91f0612016-11-29 16:50:11 +00001// Copyright 2016 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include "src/builtins/builtins.h"
6#include "src/builtins/builtins-utils.h"
7#include "src/interface-descriptors.h"
8#include "src/macro-assembler.h"
9
10namespace v8 {
11namespace internal {
12
13BUILTIN(Illegal) {
14 UNREACHABLE();
15 return isolate->heap()->undefined_value(); // Make compiler happy.
16}
17
18BUILTIN(EmptyFunction) { return isolate->heap()->undefined_value(); }
19
20BUILTIN(UnsupportedThrower) {
21 HandleScope scope(isolate);
22 THROW_NEW_ERROR_RETURN_FAILURE(isolate,
23 NewError(MessageTemplate::kUnsupported));
24}
25
26// -----------------------------------------------------------------------------
27// Throwers for restricted function properties and strict arguments object
28// properties
29
30BUILTIN(RestrictedFunctionPropertiesThrower) {
31 HandleScope scope(isolate);
32 THROW_NEW_ERROR_RETURN_FAILURE(
33 isolate, NewTypeError(MessageTemplate::kRestrictedFunctionProperties));
34}
35
36BUILTIN(RestrictedStrictArgumentsPropertiesThrower) {
37 HandleScope scope(isolate);
38 THROW_NEW_ERROR_RETURN_FAILURE(
39 isolate, NewTypeError(MessageTemplate::kStrictPoisonPill));
40}
41
42// -----------------------------------------------------------------------------
43// Interrupt and stack checks.
44
45void Builtins::Generate_InterruptCheck(MacroAssembler* masm) {
46 masm->TailCallRuntime(Runtime::kInterrupt);
47}
48
49void Builtins::Generate_StackCheck(MacroAssembler* masm) {
50 masm->TailCallRuntime(Runtime::kStackGuard);
51}
52
53// -----------------------------------------------------------------------------
54// TurboFan support builtins.
55
56void Builtins::Generate_CopyFastSmiOrObjectElements(
57 CodeStubAssembler* assembler) {
58 typedef CodeStubAssembler::Label Label;
59 typedef compiler::Node Node;
60 typedef CopyFastSmiOrObjectElementsDescriptor Descriptor;
61
62 Node* object = assembler->Parameter(Descriptor::kObject);
63
64 // Load the {object}s elements.
65 Node* source = assembler->LoadObjectField(object, JSObject::kElementsOffset);
66
67 CodeStubAssembler::ParameterMode mode =
68 assembler->Is64() ? CodeStubAssembler::INTEGER_PARAMETERS
69 : CodeStubAssembler::SMI_PARAMETERS;
70 Node* length = (mode == CodeStubAssembler::INTEGER_PARAMETERS)
71 ? assembler->LoadAndUntagFixedArrayBaseLength(source)
72 : assembler->LoadFixedArrayBaseLength(source);
73
74 // Check if we can allocate in new space.
75 ElementsKind kind = FAST_ELEMENTS;
76 int max_elements = FixedArrayBase::GetMaxLengthForNewSpaceAllocation(kind);
77 Label if_newspace(assembler), if_oldspace(assembler);
78 assembler->Branch(
79 assembler->UintPtrLessThan(
80 length, assembler->IntPtrOrSmiConstant(max_elements, mode)),
81 &if_newspace, &if_oldspace);
82
83 assembler->Bind(&if_newspace);
84 {
85 Node* target = assembler->AllocateFixedArray(kind, length, mode);
86 assembler->CopyFixedArrayElements(kind, source, target, length,
87 SKIP_WRITE_BARRIER, mode);
88 assembler->StoreObjectField(object, JSObject::kElementsOffset, target);
89 assembler->Return(target);
90 }
91
92 assembler->Bind(&if_oldspace);
93 {
94 Node* target = assembler->AllocateFixedArray(
95 kind, length, mode, CodeStubAssembler::kPretenured);
96 assembler->CopyFixedArrayElements(kind, source, target, length,
97 UPDATE_WRITE_BARRIER, mode);
98 assembler->StoreObjectField(object, JSObject::kElementsOffset, target);
99 assembler->Return(target);
100 }
101}
102
103void Builtins::Generate_GrowFastDoubleElements(CodeStubAssembler* assembler) {
104 typedef CodeStubAssembler::Label Label;
105 typedef compiler::Node Node;
106 typedef GrowArrayElementsDescriptor Descriptor;
107
108 Node* object = assembler->Parameter(Descriptor::kObject);
109 Node* key = assembler->Parameter(Descriptor::kKey);
110 Node* context = assembler->Parameter(Descriptor::kContext);
111
112 Label runtime(assembler, CodeStubAssembler::Label::kDeferred);
113 Node* elements = assembler->LoadElements(object);
114 elements = assembler->CheckAndGrowElementsCapacity(
115 context, elements, FAST_DOUBLE_ELEMENTS, key, &runtime);
116 assembler->StoreObjectField(object, JSObject::kElementsOffset, elements);
117 assembler->Return(elements);
118
119 assembler->Bind(&runtime);
120 assembler->TailCallRuntime(Runtime::kGrowArrayElements, context, object, key);
121}
122
123void Builtins::Generate_GrowFastSmiOrObjectElements(
124 CodeStubAssembler* assembler) {
125 typedef CodeStubAssembler::Label Label;
126 typedef compiler::Node Node;
127 typedef GrowArrayElementsDescriptor Descriptor;
128
129 Node* object = assembler->Parameter(Descriptor::kObject);
130 Node* key = assembler->Parameter(Descriptor::kKey);
131 Node* context = assembler->Parameter(Descriptor::kContext);
132
133 Label runtime(assembler, CodeStubAssembler::Label::kDeferred);
134 Node* elements = assembler->LoadElements(object);
135 elements = assembler->CheckAndGrowElementsCapacity(
136 context, elements, FAST_ELEMENTS, key, &runtime);
137 assembler->StoreObjectField(object, JSObject::kElementsOffset, elements);
138 assembler->Return(elements);
139
140 assembler->Bind(&runtime);
141 assembler->TailCallRuntime(Runtime::kGrowArrayElements, context, object, key);
142}
143
144} // namespace internal
145} // namespace v8