OLD | NEW |
1 // Copyright 2012 the V8 project authors. All rights reserved. | 1 // Copyright 2012 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/code-stubs.h" | 5 #include "src/code-stubs.h" |
6 | 6 |
7 #include <sstream> | 7 #include <sstream> |
8 | 8 |
9 #include "src/ast/ast.h" | 9 #include "src/ast/ast.h" |
10 #include "src/bootstrapper.h" | 10 #include "src/bootstrapper.h" |
(...skipping 2312 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2323 { | 2323 { |
2324 var_result.Bind( | 2324 var_result.Bind( |
2325 assembler.CallRuntime(Runtime::kGetProperty, context, object, key)); | 2325 assembler.CallRuntime(Runtime::kGetProperty, context, object, key)); |
2326 assembler.Goto(&end); | 2326 assembler.Goto(&end); |
2327 } | 2327 } |
2328 | 2328 |
2329 assembler.Bind(&end); | 2329 assembler.Bind(&end); |
2330 assembler.Return(var_result.value()); | 2330 assembler.Return(var_result.value()); |
2331 } | 2331 } |
2332 | 2332 |
2333 | |
2334 // static | |
2335 int FastNewFunctionContextStub::MaximumSlots() { | |
2336 return FLAG_test_small_max_function_context_stub_size ? kSmallMaximumSlots | |
2337 : kMaximumSlots; | |
2338 } | |
2339 | |
2340 // static | |
2341 compiler::Node* FastNewFunctionContextStub::Generate( | |
2342 CodeStubAssembler* assembler, compiler::Node* function, | |
2343 compiler::Node* slots, compiler::Node* context, ScopeType scope_type) { | |
2344 typedef compiler::Node Node; | |
2345 | |
2346 slots = assembler->ChangeUint32ToWord(slots); | |
2347 | |
2348 // TODO(ishell): Use CSA::OptimalParameterMode() here. | |
2349 CodeStubAssembler::ParameterMode mode = CodeStubAssembler::INTPTR_PARAMETERS; | |
2350 Node* min_context_slots = | |
2351 assembler->IntPtrConstant(Context::MIN_CONTEXT_SLOTS); | |
2352 Node* length = assembler->IntPtrAdd(slots, min_context_slots); | |
2353 Node* size = | |
2354 assembler->GetFixedArrayAllocationSize(length, FAST_ELEMENTS, mode); | |
2355 | |
2356 // Create a new closure from the given function info in new space | |
2357 Node* function_context = assembler->Allocate(size); | |
2358 | |
2359 Heap::RootListIndex context_type; | |
2360 switch (scope_type) { | |
2361 case EVAL_SCOPE: | |
2362 context_type = Heap::kEvalContextMapRootIndex; | |
2363 break; | |
2364 case FUNCTION_SCOPE: | |
2365 context_type = Heap::kFunctionContextMapRootIndex; | |
2366 break; | |
2367 default: | |
2368 UNREACHABLE(); | |
2369 } | |
2370 assembler->StoreMapNoWriteBarrier(function_context, context_type); | |
2371 assembler->StoreObjectFieldNoWriteBarrier( | |
2372 function_context, Context::kLengthOffset, assembler->SmiTag(length)); | |
2373 | |
2374 // Set up the fixed slots. | |
2375 assembler->StoreFixedArrayElement(function_context, Context::CLOSURE_INDEX, | |
2376 function, SKIP_WRITE_BARRIER); | |
2377 assembler->StoreFixedArrayElement(function_context, Context::PREVIOUS_INDEX, | |
2378 context, SKIP_WRITE_BARRIER); | |
2379 assembler->StoreFixedArrayElement(function_context, Context::EXTENSION_INDEX, | |
2380 assembler->TheHoleConstant(), | |
2381 SKIP_WRITE_BARRIER); | |
2382 | |
2383 // Copy the native context from the previous context. | |
2384 Node* native_context = assembler->LoadNativeContext(context); | |
2385 assembler->StoreFixedArrayElement(function_context, | |
2386 Context::NATIVE_CONTEXT_INDEX, | |
2387 native_context, SKIP_WRITE_BARRIER); | |
2388 | |
2389 // Initialize the rest of the slots to undefined. | |
2390 Node* undefined = assembler->UndefinedConstant(); | |
2391 assembler->BuildFastFixedArrayForEach( | |
2392 function_context, FAST_ELEMENTS, min_context_slots, length, | |
2393 [assembler, undefined](Node* context, Node* offset) { | |
2394 assembler->StoreNoWriteBarrier(MachineRepresentation::kTagged, context, | |
2395 offset, undefined); | |
2396 }, | |
2397 mode); | |
2398 | |
2399 return function_context; | |
2400 } | |
2401 | |
2402 void FastNewFunctionContextStub::GenerateAssembly( | |
2403 compiler::CodeAssemblerState* state) const { | |
2404 typedef compiler::Node Node; | |
2405 CodeStubAssembler assembler(state); | |
2406 Node* function = assembler.Parameter(Descriptor::kFunction); | |
2407 Node* slots = assembler.Parameter(Descriptor::kSlots); | |
2408 Node* context = assembler.Parameter(Descriptor::kContext); | |
2409 | |
2410 assembler.Return( | |
2411 Generate(&assembler, function, slots, context, scope_type())); | |
2412 } | |
2413 | |
2414 // static | 2333 // static |
2415 compiler::Node* FastCloneRegExpStub::Generate(CodeStubAssembler* assembler, | 2334 compiler::Node* FastCloneRegExpStub::Generate(CodeStubAssembler* assembler, |
2416 compiler::Node* closure, | 2335 compiler::Node* closure, |
2417 compiler::Node* literal_index, | 2336 compiler::Node* literal_index, |
2418 compiler::Node* pattern, | 2337 compiler::Node* pattern, |
2419 compiler::Node* flags, | 2338 compiler::Node* flags, |
2420 compiler::Node* context) { | 2339 compiler::Node* context) { |
2421 typedef CodeStubAssembler::Label Label; | 2340 typedef CodeStubAssembler::Label Label; |
2422 typedef CodeStubAssembler::Variable Variable; | 2341 typedef CodeStubAssembler::Variable Variable; |
2423 typedef compiler::Node Node; | 2342 typedef compiler::Node Node; |
(...skipping 539 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2963 } | 2882 } |
2964 | 2883 |
2965 ArrayConstructorStub::ArrayConstructorStub(Isolate* isolate) | 2884 ArrayConstructorStub::ArrayConstructorStub(Isolate* isolate) |
2966 : PlatformCodeStub(isolate) {} | 2885 : PlatformCodeStub(isolate) {} |
2967 | 2886 |
2968 InternalArrayConstructorStub::InternalArrayConstructorStub(Isolate* isolate) | 2887 InternalArrayConstructorStub::InternalArrayConstructorStub(Isolate* isolate) |
2969 : PlatformCodeStub(isolate) {} | 2888 : PlatformCodeStub(isolate) {} |
2970 | 2889 |
2971 } // namespace internal | 2890 } // namespace internal |
2972 } // namespace v8 | 2891 } // namespace v8 |
OLD | NEW |