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 "src/bailout-reason.h" | 7 #include "src/bailout-reason.h" |
8 #include "src/field-index.h" | 8 #include "src/field-index.h" |
9 #include "src/hydrogen.h" | 9 #include "src/hydrogen.h" |
10 #include "src/ic/ic.h" | 10 #include "src/ic/ic.h" |
(...skipping 349 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
360 } | 360 } |
361 is_oddball.Else(); | 361 is_oddball.Else(); |
362 { | 362 { |
363 IfBuilder is_symbol(this); | 363 IfBuilder is_symbol(this); |
364 is_symbol.If<HCompareNumericAndBranch>( | 364 is_symbol.If<HCompareNumericAndBranch>( |
365 instance_type, Add<HConstant>(SYMBOL_TYPE), Token::EQ); | 365 instance_type, Add<HConstant>(SYMBOL_TYPE), Token::EQ); |
366 is_symbol.Then(); | 366 is_symbol.Then(); |
367 { Push(Add<HConstant>(factory->symbol_string())); } | 367 { Push(Add<HConstant>(factory->symbol_string())); } |
368 is_symbol.Else(); | 368 is_symbol.Else(); |
369 { | 369 { |
| 370 HValue* bit_field = Add<HLoadNamedField>( |
| 371 map, nullptr, HObjectAccess::ForMapBitField()); |
| 372 HValue* bit_field_masked = AddUncasted<HBitwise>( |
| 373 Token::BIT_AND, bit_field, |
| 374 Add<HConstant>((1 << Map::kIsCallable) | |
| 375 (1 << Map::kIsUndetectable))); |
370 IfBuilder is_function(this); | 376 IfBuilder is_function(this); |
371 HConstant* js_function = Add<HConstant>(JS_FUNCTION_TYPE); | 377 is_function.If<HCompareNumericAndBranch>( |
372 HConstant* js_function_proxy = | 378 bit_field_masked, Add<HConstant>(1 << Map::kIsCallable), |
373 Add<HConstant>(JS_FUNCTION_PROXY_TYPE); | 379 Token::EQ); |
374 is_function.If<HCompareNumericAndBranch>(instance_type, js_function, | |
375 Token::EQ); | |
376 is_function.OrIf<HCompareNumericAndBranch>( | |
377 instance_type, js_function_proxy, Token::EQ); | |
378 is_function.Then(); | 380 is_function.Then(); |
379 { Push(Add<HConstant>(factory->function_string())); } | 381 { Push(Add<HConstant>(factory->function_string())); } |
380 is_function.Else(); | 382 is_function.Else(); |
381 { | 383 { |
382 #define SIMD128_BUILDER_OPEN(TYPE, Type, type, lane_count, lane_type) \ | 384 #define SIMD128_BUILDER_OPEN(TYPE, Type, type, lane_count, lane_type) \ |
383 IfBuilder is_##type(this); \ | 385 IfBuilder is_##type(this); \ |
384 is_##type.If<HCompareObjectEqAndBranch>( \ | 386 is_##type.If<HCompareObjectEqAndBranch>( \ |
385 map, Add<HConstant>(factory->type##_map())); \ | 387 map, Add<HConstant>(factory->type##_map())); \ |
386 is_##type.Then(); \ | 388 is_##type.Then(); \ |
387 { Push(Add<HConstant>(factory->type##_string())); } \ | 389 { Push(Add<HConstant>(factory->type##_string())); } \ |
388 is_##type.Else(); { | 390 is_##type.Else(); { |
389 SIMD128_TYPES(SIMD128_BUILDER_OPEN) | 391 SIMD128_TYPES(SIMD128_BUILDER_OPEN) |
390 #undef SIMD128_BUILDER_OPEN | 392 #undef SIMD128_BUILDER_OPEN |
391 // Is it an undetectable object? | 393 // Is it an undetectable object? |
392 IfBuilder is_undetectable(this); | 394 IfBuilder is_undetectable(this); |
393 is_undetectable.If<HIsUndetectableAndBranch>(object); | 395 is_undetectable.If<HCompareNumericAndBranch>( |
| 396 bit_field_masked, Add<HConstant>(1 << Map::kIsUndetectable), |
| 397 Token::EQ); |
394 is_undetectable.Then(); | 398 is_undetectable.Then(); |
395 { | 399 { |
396 // typeof an undetectable object is 'undefined'. | 400 // typeof an undetectable object is 'undefined'. |
397 Push(Add<HConstant>(factory->undefined_string())); | 401 Push(Add<HConstant>(factory->undefined_string())); |
398 } | 402 } |
399 is_undetectable.Else(); | 403 is_undetectable.Else(); |
400 { | 404 { |
401 // For any kind of object not handled above, the spec rule for | 405 // For any kind of object not handled above, the spec rule for |
402 // host objects gives that it is okay to return "object". | 406 // host objects gives that it is okay to return "object". |
403 Push(object_string); | 407 Push(object_string); |
(...skipping 1801 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2205 return Pop(); | 2209 return Pop(); |
2206 } | 2210 } |
2207 | 2211 |
2208 | 2212 |
2209 Handle<Code> KeyedLoadGenericStub::GenerateCode() { | 2213 Handle<Code> KeyedLoadGenericStub::GenerateCode() { |
2210 return DoGenerateCode(this); | 2214 return DoGenerateCode(this); |
2211 } | 2215 } |
2212 | 2216 |
2213 } // namespace internal | 2217 } // namespace internal |
2214 } // namespace v8 | 2218 } // namespace v8 |
OLD | NEW |