| Index: src/x64/macro-assembler-x64.cc
|
| diff --git a/src/x64/macro-assembler-x64.cc b/src/x64/macro-assembler-x64.cc
|
| index 7fe6d5821ea665ab722b4efd65eef3420b0fe1f1..249218e1629ba04af6b42e3a73a2722932658418 100644
|
| --- a/src/x64/macro-assembler-x64.cc
|
| +++ b/src/x64/macro-assembler-x64.cc
|
| @@ -2317,6 +2317,13 @@ void MacroAssembler::Test(const Operand& src, Smi* source) {
|
| }
|
|
|
|
|
| +void MacroAssembler::TestBit(const Operand& src, int bits) {
|
| + int byte_offset = bits / kBitsPerByte;
|
| + int bit_in_byte = bits & (kBitsPerByte - 1);
|
| + testb(Operand(src, byte_offset), Immediate(1 << bit_in_byte));
|
| +}
|
| +
|
| +
|
| void MacroAssembler::Jump(ExternalReference ext) {
|
| LoadAddress(kScratchRegister, ext);
|
| jmp(kScratchRegister);
|
| @@ -2866,7 +2873,8 @@ Condition MacroAssembler::IsObjectStringType(Register heap_object,
|
|
|
| void MacroAssembler::TryGetFunctionPrototype(Register function,
|
| Register result,
|
| - Label* miss) {
|
| + Label* miss,
|
| + bool miss_on_bound_function) {
|
| // Check that the receiver isn't a smi.
|
| testl(function, Immediate(kSmiTagMask));
|
| j(zero, miss);
|
| @@ -2875,6 +2883,17 @@ void MacroAssembler::TryGetFunctionPrototype(Register function,
|
| CmpObjectType(function, JS_FUNCTION_TYPE, result);
|
| j(not_equal, miss);
|
|
|
| + if (miss_on_bound_function) {
|
| + movq(kScratchRegister,
|
| + FieldOperand(function, JSFunction::kSharedFunctionInfoOffset));
|
| + // It's not smi-tagged (stored in the top half of a smi-tagged 8-byte
|
| + // field).
|
| + TestBit(FieldOperand(kScratchRegister,
|
| + SharedFunctionInfo::kCompilerHintsOffset),
|
| + SharedFunctionInfo::kBoundFunction);
|
| + j(not_zero, miss);
|
| + }
|
| +
|
| // Make sure that the function has an instance prototype.
|
| Label non_instance;
|
| testb(FieldOperand(result, Map::kBitFieldOffset),
|
|
|