Chromium Code Reviews| 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 327 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 338 } | 338 } |
| 339 UNREACHABLE(); | 339 UNREACHABLE(); |
| 340 return os; | 340 return os; |
| 341 } | 341 } |
| 342 | 342 |
| 343 | 343 |
| 344 void StringAddStub::PrintBaseName(std::ostream& os) const { // NOLINT | 344 void StringAddStub::PrintBaseName(std::ostream& os) const { // NOLINT |
| 345 os << "StringAddStub_" << flags() << "_" << pretenure_flag(); | 345 os << "StringAddStub_" << flags() << "_" << pretenure_flag(); |
| 346 } | 346 } |
| 347 | 347 |
| 348 void StringAddStub::GenerateAssembly(CodeStubAssembler* assembler) const { | |
| 349 typedef compiler::Node Node; | |
| 350 Node* left = assembler->Parameter(Descriptor::kLeft); | |
| 351 Node* right = assembler->Parameter(Descriptor::kRight); | |
| 352 Node* context = assembler->Parameter(Descriptor::kContext); | |
| 353 | |
| 354 if ((flags() & STRING_ADD_CHECK_LEFT) != 0) { | |
| 355 DCHECK((flags() & STRING_ADD_CONVERT) != 0); | |
| 356 left = assembler->ToString(context, | |
| 357 assembler->JSReceiverToPrimitive(context, left)); | |
|
Igor Sheludko
2016/10/13 15:41:33
Note: we could generate a better code here if we c
danno
2016/10/17 14:23:26
Yes, but it somewhat breaks the abstraction of hav
| |
| 358 } | |
| 359 if ((flags() & STRING_ADD_CHECK_RIGHT) != 0) { | |
| 360 DCHECK((flags() & STRING_ADD_CONVERT) != 0); | |
| 361 right = assembler->ToString( | |
| 362 context, assembler->JSReceiverToPrimitive(context, right)); | |
| 363 } | |
| 364 | |
| 365 if ((flags() & STRING_ADD_CHECK_BOTH) == 0) { | |
| 366 CodeStubAssembler::AllocationFlag flags = | |
| 367 (pretenure_flag() == TENURED) ? CodeStubAssembler::kPretenured | |
| 368 : CodeStubAssembler::kNone; | |
| 369 assembler->Return(assembler->StringAdd(context, left, right, flags)); | |
| 370 } else { | |
| 371 StringAddStub stub(isolate(), STRING_ADD_CHECK_NONE, pretenure_flag()); | |
| 372 StringAddDescriptor descriptor(isolate()); | |
| 373 assembler->TailCallStub(descriptor, assembler->HeapConstant(stub.GetCode()), | |
|
Igor Sheludko
2016/10/13 15:41:33
I think
Callable callable = CodeFactory::StringA
danno
2016/10/17 14:23:26
Done.
| |
| 374 context, left, right); | |
| 375 } | |
| 376 } | |
| 348 | 377 |
| 349 InlineCacheState CompareICStub::GetICState() const { | 378 InlineCacheState CompareICStub::GetICState() const { |
| 350 CompareICState::State state = Max(left(), right()); | 379 CompareICState::State state = Max(left(), right()); |
| 351 switch (state) { | 380 switch (state) { |
| 352 case CompareICState::UNINITIALIZED: | 381 case CompareICState::UNINITIALIZED: |
| 353 return ::v8::internal::UNINITIALIZED; | 382 return ::v8::internal::UNINITIALIZED; |
| 354 case CompareICState::BOOLEAN: | 383 case CompareICState::BOOLEAN: |
| 355 case CompareICState::SMI: | 384 case CompareICState::SMI: |
| 356 case CompareICState::NUMBER: | 385 case CompareICState::NUMBER: |
| 357 case CompareICState::INTERNALIZED_STRING: | 386 case CompareICState::INTERNALIZED_STRING: |
| (...skipping 1798 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2156 descriptor->SetMissHandler(Runtime::kBinaryOpIC_Miss); | 2185 descriptor->SetMissHandler(Runtime::kBinaryOpIC_Miss); |
| 2157 } | 2186 } |
| 2158 | 2187 |
| 2159 | 2188 |
| 2160 void BinaryOpWithAllocationSiteStub::InitializeDescriptor( | 2189 void BinaryOpWithAllocationSiteStub::InitializeDescriptor( |
| 2161 CodeStubDescriptor* descriptor) { | 2190 CodeStubDescriptor* descriptor) { |
| 2162 descriptor->Initialize( | 2191 descriptor->Initialize( |
| 2163 FUNCTION_ADDR(Runtime_BinaryOpIC_MissWithAllocationSite)); | 2192 FUNCTION_ADDR(Runtime_BinaryOpIC_MissWithAllocationSite)); |
| 2164 } | 2193 } |
| 2165 | 2194 |
| 2166 | |
| 2167 void StringAddStub::InitializeDescriptor(CodeStubDescriptor* descriptor) { | |
| 2168 descriptor->Initialize(Runtime::FunctionForId(Runtime::kStringAdd)->entry); | |
| 2169 descriptor->SetMissHandler(Runtime::kStringAdd); | |
| 2170 } | |
| 2171 | |
| 2172 | |
| 2173 void GetPropertyStub::GenerateAssembly(CodeStubAssembler* assembler) const { | 2195 void GetPropertyStub::GenerateAssembly(CodeStubAssembler* assembler) const { |
| 2174 typedef compiler::Node Node; | 2196 typedef compiler::Node Node; |
| 2175 typedef CodeStubAssembler::Label Label; | 2197 typedef CodeStubAssembler::Label Label; |
| 2176 typedef CodeStubAssembler::Variable Variable; | 2198 typedef CodeStubAssembler::Variable Variable; |
| 2177 | 2199 |
| 2178 Label call_runtime(assembler, Label::kDeferred), return_undefined(assembler), | 2200 Label call_runtime(assembler, Label::kDeferred), return_undefined(assembler), |
| 2179 end(assembler); | 2201 end(assembler); |
| 2180 | 2202 |
| 2181 Node* object = assembler->Parameter(0); | 2203 Node* object = assembler->Parameter(0); |
| 2182 Node* key = assembler->Parameter(1); | 2204 Node* key = assembler->Parameter(1); |
| (...skipping 850 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3033 | 3055 |
| 3034 if (type == MachineType::Pointer()) { | 3056 if (type == MachineType::Pointer()) { |
| 3035 return Representation::External(); | 3057 return Representation::External(); |
| 3036 } | 3058 } |
| 3037 | 3059 |
| 3038 return Representation::Tagged(); | 3060 return Representation::Tagged(); |
| 3039 } | 3061 } |
| 3040 | 3062 |
| 3041 } // namespace internal | 3063 } // namespace internal |
| 3042 } // namespace v8 | 3064 } // namespace v8 |
| OLD | NEW |