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/bootstrapper.h" | 9 #include "src/bootstrapper.h" |
10 #include "src/code-factory.h" | 10 #include "src/code-factory.h" |
(...skipping 4280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4291 descriptor->Initialize( | 4291 descriptor->Initialize( |
4292 Runtime::FunctionForId(Runtime::kGrowArrayElements)->entry); | 4292 Runtime::FunctionForId(Runtime::kGrowArrayElements)->entry); |
4293 } | 4293 } |
4294 | 4294 |
4295 | 4295 |
4296 void TypeofStub::GenerateAheadOfTime(Isolate* isolate) { | 4296 void TypeofStub::GenerateAheadOfTime(Isolate* isolate) { |
4297 TypeofStub stub(isolate); | 4297 TypeofStub stub(isolate); |
4298 stub.GetCode(); | 4298 stub.GetCode(); |
4299 } | 4299 } |
4300 | 4300 |
4301 // static | 4301 namespace { |
4302 compiler::Node* HasPropertyStub::Generate(CodeStubAssembler* assembler, | 4302 |
4303 compiler::Node* key, | 4303 compiler::Node* GenerateHasProperty( |
4304 compiler::Node* object, | 4304 CodeStubAssembler* assembler, compiler::Node* object, compiler::Node* key, |
4305 compiler::Node* context) { | 4305 compiler::Node* context, Runtime::FunctionId fallback_runtime_function_id) { |
4306 typedef compiler::Node Node; | 4306 typedef compiler::Node Node; |
4307 typedef CodeStubAssembler::Label Label; | 4307 typedef CodeStubAssembler::Label Label; |
4308 typedef CodeStubAssembler::Variable Variable; | 4308 typedef CodeStubAssembler::Variable Variable; |
4309 | 4309 |
4310 Label call_runtime(assembler, Label::kDeferred), return_true(assembler), | 4310 Label call_runtime(assembler, Label::kDeferred), return_true(assembler), |
4311 return_false(assembler), end(assembler); | 4311 return_false(assembler), end(assembler); |
4312 | 4312 |
4313 CodeStubAssembler::LookupInHolder lookup_property_in_holder = | 4313 CodeStubAssembler::LookupInHolder lookup_property_in_holder = |
4314 [assembler, &return_true](Node* receiver, Node* holder, Node* holder_map, | 4314 [assembler, &return_true](Node* receiver, Node* holder, Node* holder_map, |
4315 Node* holder_instance_type, Node* unique_name, | 4315 Node* holder_instance_type, Node* unique_name, |
(...skipping 24 matching lines...) Expand all Loading... |
4340 } | 4340 } |
4341 | 4341 |
4342 assembler->Bind(&return_false); | 4342 assembler->Bind(&return_false); |
4343 { | 4343 { |
4344 result.Bind(assembler->BooleanConstant(false)); | 4344 result.Bind(assembler->BooleanConstant(false)); |
4345 assembler->Goto(&end); | 4345 assembler->Goto(&end); |
4346 } | 4346 } |
4347 | 4347 |
4348 assembler->Bind(&call_runtime); | 4348 assembler->Bind(&call_runtime); |
4349 { | 4349 { |
4350 result.Bind( | 4350 result.Bind(assembler->CallRuntime(fallback_runtime_function_id, context, |
4351 assembler->CallRuntime(Runtime::kHasProperty, context, key, object)); | 4351 object, key)); |
4352 assembler->Goto(&end); | 4352 assembler->Goto(&end); |
4353 } | 4353 } |
4354 | 4354 |
4355 assembler->Bind(&end); | 4355 assembler->Bind(&end); |
4356 return result.value(); | 4356 return result.value(); |
4357 } | 4357 } |
4358 | 4358 |
| 4359 } // namespace |
| 4360 |
| 4361 // static |
| 4362 compiler::Node* HasPropertyStub::Generate(CodeStubAssembler* assembler, |
| 4363 compiler::Node* key, |
| 4364 compiler::Node* object, |
| 4365 compiler::Node* context) { |
| 4366 return GenerateHasProperty(assembler, object, key, context, |
| 4367 Runtime::kHasProperty); |
| 4368 } |
| 4369 |
| 4370 // static |
| 4371 compiler::Node* ForInFilterStub::Generate(CodeStubAssembler* assembler, |
| 4372 compiler::Node* key, |
| 4373 compiler::Node* object, |
| 4374 compiler::Node* context) { |
| 4375 typedef compiler::Node Node; |
| 4376 typedef CodeStubAssembler::Label Label; |
| 4377 typedef CodeStubAssembler::Variable Variable; |
| 4378 |
| 4379 Label return_undefined(assembler, Label::kDeferred), |
| 4380 return_to_name(assembler), end(assembler); |
| 4381 |
| 4382 Variable var_result(assembler, MachineRepresentation::kTagged); |
| 4383 |
| 4384 Node* has_property = GenerateHasProperty(assembler, object, key, context, |
| 4385 Runtime::kForInHasProperty); |
| 4386 |
| 4387 assembler->Branch( |
| 4388 assembler->WordEqual(has_property, assembler->BooleanConstant(true)), |
| 4389 &return_to_name, &return_undefined); |
| 4390 |
| 4391 assembler->Bind(&return_to_name); |
| 4392 { |
| 4393 // TODO(cbruni): inline ToName here. |
| 4394 Callable callable = CodeFactory::ToName(assembler->isolate()); |
| 4395 var_result.Bind(assembler->CallStub(callable, context, key)); |
| 4396 assembler->Goto(&end); |
| 4397 } |
| 4398 |
| 4399 assembler->Bind(&return_undefined); |
| 4400 { |
| 4401 var_result.Bind(assembler->UndefinedConstant()); |
| 4402 assembler->Goto(&end); |
| 4403 } |
| 4404 |
| 4405 assembler->Bind(&end); |
| 4406 return var_result.value(); |
| 4407 } |
| 4408 |
4359 void GetPropertyStub::GenerateAssembly(CodeStubAssembler* assembler) const { | 4409 void GetPropertyStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
4360 typedef compiler::Node Node; | 4410 typedef compiler::Node Node; |
4361 typedef CodeStubAssembler::Label Label; | 4411 typedef CodeStubAssembler::Label Label; |
4362 typedef CodeStubAssembler::Variable Variable; | 4412 typedef CodeStubAssembler::Variable Variable; |
4363 | 4413 |
4364 Label call_runtime(assembler, Label::kDeferred), return_undefined(assembler), | 4414 Label call_runtime(assembler, Label::kDeferred), return_undefined(assembler), |
4365 end(assembler); | 4415 end(assembler); |
4366 | 4416 |
4367 Node* object = assembler->Parameter(0); | 4417 Node* object = assembler->Parameter(0); |
4368 Node* key = assembler->Parameter(1); | 4418 Node* key = assembler->Parameter(1); |
(...skipping 567 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4936 if (type->Is(Type::UntaggedPointer())) { | 4986 if (type->Is(Type::UntaggedPointer())) { |
4937 return Representation::External(); | 4987 return Representation::External(); |
4938 } | 4988 } |
4939 | 4989 |
4940 DCHECK(!type->Is(Type::Untagged())); | 4990 DCHECK(!type->Is(Type::Untagged())); |
4941 return Representation::Tagged(); | 4991 return Representation::Tagged(); |
4942 } | 4992 } |
4943 | 4993 |
4944 } // namespace internal | 4994 } // namespace internal |
4945 } // namespace v8 | 4995 } // namespace v8 |
OLD | NEW |