Chromium Code Reviews

Side by Side Diff: src/code-stubs.cc

Issue 2151773002: Avoid jumping to the runtime for ForInFilter (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: use the code stub in turbofan Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments.
Jump to:
View unified diff |
OLDNEW
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...)
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 namespace {
4302
4301 // static 4303 // static
Michael Starzinger 2016/07/19 15:06:01 nit: The "static" comment no longer applies.
4302 compiler::Node* HasPropertyStub::Generate(CodeStubAssembler* assembler, 4304 compiler::Node* GenerateHasProperty(
4303 compiler::Node* key, 4305 CodeStubAssembler* assembler, compiler::Node* object, compiler::Node* key,
4304 compiler::Node* object, 4306 compiler::Node* context, Runtime::FunctionId fallback_runtime_function_id) {
4305 compiler::Node* context) {
4306 typedef compiler::Node Node; 4307 typedef compiler::Node Node;
4307 typedef CodeStubAssembler::Label Label; 4308 typedef CodeStubAssembler::Label Label;
4308 typedef CodeStubAssembler::Variable Variable; 4309 typedef CodeStubAssembler::Variable Variable;
4309 4310
4310 Label call_runtime(assembler, Label::kDeferred), return_true(assembler), 4311 Label call_runtime(assembler, Label::kDeferred), return_true(assembler),
4311 return_false(assembler), end(assembler); 4312 return_false(assembler), end(assembler);
4312 4313
4313 CodeStubAssembler::LookupInHolder lookup_property_in_holder = 4314 CodeStubAssembler::LookupInHolder lookup_property_in_holder =
4314 [assembler, &return_true](Node* receiver, Node* holder, Node* holder_map, 4315 [assembler, &return_true](Node* receiver, Node* holder, Node* holder_map,
4315 Node* holder_instance_type, Node* unique_name, 4316 Node* holder_instance_type, Node* unique_name,
(...skipping 24 matching lines...)
4340 } 4341 }
4341 4342
4342 assembler->Bind(&return_false); 4343 assembler->Bind(&return_false);
4343 { 4344 {
4344 result.Bind(assembler->BooleanConstant(false)); 4345 result.Bind(assembler->BooleanConstant(false));
4345 assembler->Goto(&end); 4346 assembler->Goto(&end);
4346 } 4347 }
4347 4348
4348 assembler->Bind(&call_runtime); 4349 assembler->Bind(&call_runtime);
4349 { 4350 {
4350 result.Bind( 4351 result.Bind(assembler->CallRuntime(fallback_runtime_function_id, context,
4351 assembler->CallRuntime(Runtime::kHasProperty, context, key, object)); 4352 object, key));
4352 assembler->Goto(&end); 4353 assembler->Goto(&end);
4353 } 4354 }
4354 4355
4355 assembler->Bind(&end); 4356 assembler->Bind(&end);
4356 return result.value(); 4357 return result.value();
4357 } 4358 }
4358 4359
4360 } // namespace
4361
4362 // static
4363 compiler::Node* HasPropertyStub::Generate(CodeStubAssembler* assembler,
4364 compiler::Node* key,
4365 compiler::Node* object,
4366 compiler::Node* context) {
4367 return GenerateHasProperty(assembler, object, key, context,
4368 Runtime::kHasProperty);
4369 }
4370
4371 // stati c
Michael Starzinger 2016/07/19 15:06:02 nit: s/stati c/static/
4372 compiler::Node* ForInFilterStub::Generate(CodeStubAssembler* assembler,
4373 compiler::Node* key,
4374 compiler::Node* object,
4375 compiler::Node* context) {
4376 typedef compiler::Node Node;
4377 typedef CodeStubAssembler::Label Label;
4378 typedef CodeStubAssembler::Variable Variable;
4379
4380 Label return_undefined(assembler, Label::kDeferred),
4381 return_to_name(assembler), end(assembler);
4382
4383 Variable var_result(assembler, MachineRepresentation::kTagged);
4384
4385 Node* has_property = GenerateHasProperty(assembler, object, key, context,
4386 Runtime::kForInHasProperty);
4387
4388 assembler->Branch(
4389 assembler->WordEqual(has_property, assembler->BooleanConstant(true)),
4390 &return_to_name, &return_undefined);
4391
4392 assembler->Bind(&return_to_name);
4393 {
4394 // TODO(cbruni): inline ToName here.
4395 Callable callable = CodeFactory::ToName(assembler->isolate());
4396 var_result.Bind(assembler->CallStub(callable, context, key));
4397 assembler->Goto(&end);
4398 }
4399
4400 assembler->Bind(&return_undefined);
4401 {
4402 var_result.Bind(assembler->UndefinedConstant());
4403 assembler->Goto(&end);
4404 }
4405
4406 assembler->Bind(&end);
4407 return var_result.value();
4408 }
4409
4359 void GetPropertyStub::GenerateAssembly(CodeStubAssembler* assembler) const { 4410 void GetPropertyStub::GenerateAssembly(CodeStubAssembler* assembler) const {
4360 typedef compiler::Node Node; 4411 typedef compiler::Node Node;
4361 typedef CodeStubAssembler::Label Label; 4412 typedef CodeStubAssembler::Label Label;
4362 typedef CodeStubAssembler::Variable Variable; 4413 typedef CodeStubAssembler::Variable Variable;
4363 4414
4364 Label call_runtime(assembler, Label::kDeferred), return_undefined(assembler), 4415 Label call_runtime(assembler, Label::kDeferred), return_undefined(assembler),
4365 end(assembler); 4416 end(assembler);
4366 4417
4367 Node* object = assembler->Parameter(0); 4418 Node* object = assembler->Parameter(0);
4368 Node* key = assembler->Parameter(1); 4419 Node* key = assembler->Parameter(1);
(...skipping 567 matching lines...)
4936 if (type->Is(Type::UntaggedPointer())) { 4987 if (type->Is(Type::UntaggedPointer())) {
4937 return Representation::External(); 4988 return Representation::External();
4938 } 4989 }
4939 4990
4940 DCHECK(!type->Is(Type::Untagged())); 4991 DCHECK(!type->Is(Type::Untagged()));
4941 return Representation::Tagged(); 4992 return Representation::Tagged();
4942 } 4993 }
4943 4994
4944 } // namespace internal 4995 } // namespace internal
4945 } // namespace v8 4996 } // namespace v8
OLDNEW

Powered by Google App Engine