Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(259)

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: fixing mips Created 4 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
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...) Expand 10 before | Expand all | Expand 10 after
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698