OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "src/runtime/runtime-utils.h" | 5 #include "src/runtime/runtime-utils.h" |
6 | 6 |
7 #include "src/allocation-site-scopes.h" | 7 #include "src/allocation-site-scopes.h" |
8 #include "src/arguments.h" | 8 #include "src/arguments.h" |
9 #include "src/ast/ast.h" | 9 #include "src/ast/ast.h" |
10 #include "src/ast/compile-time-value.h" | 10 #include "src/ast/compile-time-value.h" |
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
106 if (should_transform) { | 106 if (should_transform) { |
107 JSObject::MigrateSlowToFast(boilerplate, | 107 JSObject::MigrateSlowToFast(boilerplate, |
108 boilerplate->map()->unused_property_fields(), | 108 boilerplate->map()->unused_property_fields(), |
109 "FastLiteral"); | 109 "FastLiteral"); |
110 } | 110 } |
111 return boilerplate; | 111 return boilerplate; |
112 } | 112 } |
113 | 113 |
114 static MaybeHandle<Object> CreateArrayLiteralBoilerplate( | 114 static MaybeHandle<Object> CreateArrayLiteralBoilerplate( |
115 Isolate* isolate, Handle<LiteralsArray> literals, | 115 Isolate* isolate, Handle<LiteralsArray> literals, |
116 Handle<FixedArray> elements) { | 116 Handle<ConstantElementsPair> elements) { |
117 // Create the JSArray. | 117 // Create the JSArray. |
118 Handle<JSFunction> constructor = isolate->array_function(); | 118 Handle<JSFunction> constructor = isolate->array_function(); |
119 | 119 |
120 PretenureFlag pretenure_flag = | 120 PretenureFlag pretenure_flag = |
121 isolate->heap()->InNewSpace(*literals) ? NOT_TENURED : TENURED; | 121 isolate->heap()->InNewSpace(*literals) ? NOT_TENURED : TENURED; |
122 | 122 |
123 Handle<JSArray> object = Handle<JSArray>::cast( | 123 Handle<JSArray> object = Handle<JSArray>::cast( |
124 isolate->factory()->NewJSObject(constructor, pretenure_flag)); | 124 isolate->factory()->NewJSObject(constructor, pretenure_flag)); |
125 | 125 |
126 ElementsKind constant_elements_kind = | 126 ElementsKind constant_elements_kind = |
127 static_cast<ElementsKind>(Smi::cast(elements->get(0))->value()); | 127 static_cast<ElementsKind>(elements->elements_kind()); |
128 Handle<FixedArrayBase> constant_elements_values( | 128 Handle<FixedArrayBase> constant_elements_values(elements->constant_values()); |
129 FixedArrayBase::cast(elements->get(1))); | |
130 | 129 |
131 { | 130 { |
132 DisallowHeapAllocation no_gc; | 131 DisallowHeapAllocation no_gc; |
133 DCHECK(IsFastElementsKind(constant_elements_kind)); | 132 DCHECK(IsFastElementsKind(constant_elements_kind)); |
134 Context* native_context = isolate->context()->native_context(); | 133 Context* native_context = isolate->context()->native_context(); |
135 Object* map = | 134 Object* map = |
136 native_context->get(Context::ArrayMapIndex(constant_elements_kind)); | 135 native_context->get(Context::ArrayMapIndex(constant_elements_kind)); |
137 object->set_map(Map::cast(map)); | 136 object->set_map(Map::cast(map)); |
138 } | 137 } |
139 | 138 |
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
179 object->set_elements(*copied_elements_values); | 178 object->set_elements(*copied_elements_values); |
180 object->set_length(Smi::FromInt(copied_elements_values->length())); | 179 object->set_length(Smi::FromInt(copied_elements_values->length())); |
181 | 180 |
182 JSObject::ValidateElements(object); | 181 JSObject::ValidateElements(object); |
183 return object; | 182 return object; |
184 } | 183 } |
185 | 184 |
186 MUST_USE_RESULT static MaybeHandle<Object> CreateLiteralBoilerplate( | 185 MUST_USE_RESULT static MaybeHandle<Object> CreateLiteralBoilerplate( |
187 Isolate* isolate, Handle<LiteralsArray> literals, | 186 Isolate* isolate, Handle<LiteralsArray> literals, |
188 Handle<FixedArray> array) { | 187 Handle<FixedArray> array) { |
189 Handle<FixedArray> elements = CompileTimeValue::GetElements(array); | 188 Handle<HeapObject> elements = CompileTimeValue::GetElements(array); |
190 switch (CompileTimeValue::GetLiteralType(array)) { | 189 switch (CompileTimeValue::GetLiteralType(array)) { |
191 case CompileTimeValue::OBJECT_LITERAL_FAST_ELEMENTS: | 190 case CompileTimeValue::OBJECT_LITERAL_FAST_ELEMENTS: { |
192 return CreateObjectLiteralBoilerplate(isolate, literals, elements, true); | 191 Handle<FixedArray> props = Handle<FixedArray>::cast(elements); |
193 case CompileTimeValue::OBJECT_LITERAL_SLOW_ELEMENTS: | 192 return CreateObjectLiteralBoilerplate(isolate, literals, props, true); |
194 return CreateObjectLiteralBoilerplate(isolate, literals, elements, false); | 193 } |
195 case CompileTimeValue::ARRAY_LITERAL: | 194 case CompileTimeValue::OBJECT_LITERAL_SLOW_ELEMENTS: { |
196 return CreateArrayLiteralBoilerplate(isolate, literals, elements); | 195 Handle<FixedArray> props = Handle<FixedArray>::cast(elements); |
| 196 return CreateObjectLiteralBoilerplate(isolate, literals, props, false); |
| 197 } |
| 198 case CompileTimeValue::ARRAY_LITERAL: { |
| 199 Handle<ConstantElementsPair> elems = |
| 200 Handle<ConstantElementsPair>::cast(elements); |
| 201 return CreateArrayLiteralBoilerplate(isolate, literals, elems); |
| 202 } |
197 default: | 203 default: |
198 UNREACHABLE(); | 204 UNREACHABLE(); |
199 return MaybeHandle<Object>(); | 205 return MaybeHandle<Object>(); |
200 } | 206 } |
201 } | 207 } |
202 | 208 |
203 | 209 |
204 RUNTIME_FUNCTION(Runtime_CreateRegExpLiteral) { | 210 RUNTIME_FUNCTION(Runtime_CreateRegExpLiteral) { |
205 HandleScope scope(isolate); | 211 HandleScope scope(isolate); |
206 DCHECK_EQ(4, args.length()); | 212 DCHECK_EQ(4, args.length()); |
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
263 AllocationSiteUsageContext usage_context(isolate, site, enable_mementos); | 269 AllocationSiteUsageContext usage_context(isolate, site, enable_mementos); |
264 usage_context.EnterNewScope(); | 270 usage_context.EnterNewScope(); |
265 MaybeHandle<Object> maybe_copy = | 271 MaybeHandle<Object> maybe_copy = |
266 JSObject::DeepCopy(boilerplate, &usage_context); | 272 JSObject::DeepCopy(boilerplate, &usage_context); |
267 usage_context.ExitScope(site, boilerplate); | 273 usage_context.ExitScope(site, boilerplate); |
268 RETURN_RESULT_OR_FAILURE(isolate, maybe_copy); | 274 RETURN_RESULT_OR_FAILURE(isolate, maybe_copy); |
269 } | 275 } |
270 | 276 |
271 MUST_USE_RESULT static MaybeHandle<AllocationSite> GetLiteralAllocationSite( | 277 MUST_USE_RESULT static MaybeHandle<AllocationSite> GetLiteralAllocationSite( |
272 Isolate* isolate, Handle<LiteralsArray> literals, int literals_index, | 278 Isolate* isolate, Handle<LiteralsArray> literals, int literals_index, |
273 Handle<FixedArray> elements) { | 279 Handle<ConstantElementsPair> elements) { |
274 // Check if boilerplate exists. If not, create it first. | 280 // Check if boilerplate exists. If not, create it first. |
275 Handle<Object> literal_site(literals->literal(literals_index), isolate); | 281 Handle<Object> literal_site(literals->literal(literals_index), isolate); |
276 Handle<AllocationSite> site; | 282 Handle<AllocationSite> site; |
277 if (literal_site->IsUndefined(isolate)) { | 283 if (literal_site->IsUndefined(isolate)) { |
278 DCHECK(*elements != isolate->heap()->empty_fixed_array()); | |
279 Handle<Object> boilerplate; | 284 Handle<Object> boilerplate; |
280 ASSIGN_RETURN_ON_EXCEPTION( | 285 ASSIGN_RETURN_ON_EXCEPTION( |
281 isolate, boilerplate, | 286 isolate, boilerplate, |
282 CreateArrayLiteralBoilerplate(isolate, literals, elements), | 287 CreateArrayLiteralBoilerplate(isolate, literals, elements), |
283 AllocationSite); | 288 AllocationSite); |
284 | 289 |
285 AllocationSiteCreationContext creation_context(isolate); | 290 AllocationSiteCreationContext creation_context(isolate); |
286 site = creation_context.EnterNewScope(); | 291 site = creation_context.EnterNewScope(); |
287 if (JSObject::DeepWalk(Handle<JSObject>::cast(boilerplate), | 292 if (JSObject::DeepWalk(Handle<JSObject>::cast(boilerplate), |
288 &creation_context).is_null()) { | 293 &creation_context).is_null()) { |
289 return Handle<AllocationSite>::null(); | 294 return Handle<AllocationSite>::null(); |
290 } | 295 } |
291 creation_context.ExitScope(site, Handle<JSObject>::cast(boilerplate)); | 296 creation_context.ExitScope(site, Handle<JSObject>::cast(boilerplate)); |
292 | 297 |
293 literals->set_literal(literals_index, *site); | 298 literals->set_literal(literals_index, *site); |
294 } else { | 299 } else { |
295 site = Handle<AllocationSite>::cast(literal_site); | 300 site = Handle<AllocationSite>::cast(literal_site); |
296 } | 301 } |
297 | 302 |
298 return site; | 303 return site; |
299 } | 304 } |
300 | 305 |
301 | |
302 static MaybeHandle<JSObject> CreateArrayLiteralImpl( | 306 static MaybeHandle<JSObject> CreateArrayLiteralImpl( |
303 Isolate* isolate, Handle<LiteralsArray> literals, int literals_index, | 307 Isolate* isolate, Handle<LiteralsArray> literals, int literals_index, |
304 Handle<FixedArray> elements, int flags) { | 308 Handle<ConstantElementsPair> elements, int flags) { |
305 CHECK(literals_index >= 0 && literals_index < literals->literals_count()); | 309 CHECK(literals_index >= 0 && literals_index < literals->literals_count()); |
306 Handle<AllocationSite> site; | 310 Handle<AllocationSite> site; |
307 ASSIGN_RETURN_ON_EXCEPTION( | 311 ASSIGN_RETURN_ON_EXCEPTION( |
308 isolate, site, | 312 isolate, site, |
309 GetLiteralAllocationSite(isolate, literals, literals_index, elements), | 313 GetLiteralAllocationSite(isolate, literals, literals_index, elements), |
310 JSObject); | 314 JSObject); |
311 | 315 |
312 bool enable_mementos = (flags & ArrayLiteral::kDisableMementos) == 0; | 316 bool enable_mementos = (flags & ArrayLiteral::kDisableMementos) == 0; |
313 Handle<JSObject> boilerplate(JSObject::cast(site->transition_info())); | 317 Handle<JSObject> boilerplate(JSObject::cast(site->transition_info())); |
314 AllocationSiteUsageContext usage_context(isolate, site, enable_mementos); | 318 AllocationSiteUsageContext usage_context(isolate, site, enable_mementos); |
315 usage_context.EnterNewScope(); | 319 usage_context.EnterNewScope(); |
316 JSObject::DeepCopyHints hints = (flags & ArrayLiteral::kShallowElements) == 0 | 320 JSObject::DeepCopyHints hints = (flags & ArrayLiteral::kShallowElements) == 0 |
317 ? JSObject::kNoHints | 321 ? JSObject::kNoHints |
318 : JSObject::kObjectIsShallow; | 322 : JSObject::kObjectIsShallow; |
319 MaybeHandle<JSObject> copy = | 323 MaybeHandle<JSObject> copy = |
320 JSObject::DeepCopy(boilerplate, &usage_context, hints); | 324 JSObject::DeepCopy(boilerplate, &usage_context, hints); |
321 usage_context.ExitScope(site, boilerplate); | 325 usage_context.ExitScope(site, boilerplate); |
322 return copy; | 326 return copy; |
323 } | 327 } |
324 | 328 |
325 | 329 |
326 RUNTIME_FUNCTION(Runtime_CreateArrayLiteral) { | 330 RUNTIME_FUNCTION(Runtime_CreateArrayLiteral) { |
327 HandleScope scope(isolate); | 331 HandleScope scope(isolate); |
328 DCHECK_EQ(4, args.length()); | 332 DCHECK_EQ(4, args.length()); |
329 CONVERT_ARG_HANDLE_CHECKED(JSFunction, closure, 0); | 333 CONVERT_ARG_HANDLE_CHECKED(JSFunction, closure, 0); |
330 CONVERT_SMI_ARG_CHECKED(literals_index, 1); | 334 CONVERT_SMI_ARG_CHECKED(literals_index, 1); |
331 CONVERT_ARG_HANDLE_CHECKED(FixedArray, elements, 2); | 335 CONVERT_ARG_HANDLE_CHECKED(ConstantElementsPair, elements, 2); |
332 CONVERT_SMI_ARG_CHECKED(flags, 3); | 336 CONVERT_SMI_ARG_CHECKED(flags, 3); |
333 | 337 |
334 Handle<LiteralsArray> literals(closure->literals(), isolate); | 338 Handle<LiteralsArray> literals(closure->literals(), isolate); |
335 RETURN_RESULT_OR_FAILURE( | 339 RETURN_RESULT_OR_FAILURE( |
336 isolate, CreateArrayLiteralImpl(isolate, literals, literals_index, | 340 isolate, CreateArrayLiteralImpl(isolate, literals, literals_index, |
337 elements, flags)); | 341 elements, flags)); |
338 } | 342 } |
339 | 343 |
340 | 344 |
341 RUNTIME_FUNCTION(Runtime_CreateArrayLiteralStubBailout) { | 345 RUNTIME_FUNCTION(Runtime_CreateArrayLiteralStubBailout) { |
342 HandleScope scope(isolate); | 346 HandleScope scope(isolate); |
343 DCHECK_EQ(3, args.length()); | 347 DCHECK_EQ(3, args.length()); |
344 CONVERT_ARG_HANDLE_CHECKED(JSFunction, closure, 0); | 348 CONVERT_ARG_HANDLE_CHECKED(JSFunction, closure, 0); |
345 CONVERT_SMI_ARG_CHECKED(literals_index, 1); | 349 CONVERT_SMI_ARG_CHECKED(literals_index, 1); |
346 CONVERT_ARG_HANDLE_CHECKED(FixedArray, elements, 2); | 350 CONVERT_ARG_HANDLE_CHECKED(ConstantElementsPair, elements, 2); |
347 | 351 |
348 Handle<LiteralsArray> literals(closure->literals(), isolate); | 352 Handle<LiteralsArray> literals(closure->literals(), isolate); |
349 RETURN_RESULT_OR_FAILURE( | 353 RETURN_RESULT_OR_FAILURE( |
350 isolate, | 354 isolate, |
351 CreateArrayLiteralImpl(isolate, literals, literals_index, elements, | 355 CreateArrayLiteralImpl(isolate, literals, literals_index, elements, |
352 ArrayLiteral::kShallowElements)); | 356 ArrayLiteral::kShallowElements)); |
353 } | 357 } |
354 | 358 |
355 } // namespace internal | 359 } // namespace internal |
356 } // namespace v8 | 360 } // namespace v8 |
OLD | NEW |