Changeset 193974 in webkit for trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp
- Timestamp:
- Dec 11, 2015, 1:43:45 PM (10 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/bytecompiler/NodesCodegen.cpp
r193766 r193974 1660 1660 RegisterID* InstanceOfNode::emitBytecode(BytecodeGenerator& generator, RegisterID* dst) 1661 1661 { 1662 RefPtr<RegisterID> src1 = generator.emitNodeForLeftHandSide(m_expr1, m_rightHasAssignments, m_expr2->isPure(generator)); 1663 RefPtr<RegisterID> src2 = generator.emitNode(m_expr2); 1662 RefPtr<RegisterID> hasInstanceValue = generator.newTemporary(); 1663 RefPtr<RegisterID> isObject = generator.newTemporary(); 1664 RefPtr<RegisterID> isCustom = generator.newTemporary(); 1664 1665 RefPtr<RegisterID> prototype = generator.newTemporary(); 1665 RefPtr<RegisterID> dstReg = generator.finalDestination(dst, src1.get()); 1666 RefPtr<Label> target = generator.newLabel(); 1666 RefPtr<RegisterID> value = generator.emitNodeForLeftHandSide(m_expr1, m_rightHasAssignments, m_expr2->isPure(generator)); 1667 RefPtr<RegisterID> constructor = generator.emitNode(m_expr2); 1668 RefPtr<RegisterID> dstReg = generator.finalDestination(dst, value.get()); 1669 RefPtr<Label> custom = generator.newLabel(); 1670 RefPtr<Label> done = generator.newLabel(); 1671 RefPtr<Label> typeError = generator.newLabel(); 1667 1672 1668 1673 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 1669 generator.emitCheckHasInstance(dstReg.get(), src1.get(), src2.get(), target.get()); 1674 generator.emitIsObject(isObject.get(), constructor.get()); 1675 generator.emitJumpIfFalse(isObject.get(), typeError.get()); 1670 1676 1671 1677 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 1672 generator.emitGetById( prototype.get(), src2.get(), generator.vm()->propertyNames->prototype);1678 generator.emitGetById(hasInstanceValue.get(), constructor.get(), generator.vm()->propertyNames->hasInstanceSymbol); 1673 1679 1674 1680 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 1675 RegisterID* result = generator.emitInstanceOf(dstReg.get(), src1.get(), prototype.get()); 1676 generator.emitLabel(target.get()); 1677 return result; 1681 generator.emitOverridesHasInstance(isCustom.get(), constructor.get(), hasInstanceValue.get()); 1682 1683 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 1684 generator.emitJumpIfTrue(isCustom.get(), custom.get()); 1685 1686 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 1687 generator.emitGetById(prototype.get(), constructor.get(), generator.vm()->propertyNames->prototype); 1688 1689 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 1690 generator.emitInstanceOf(dstReg.get(), value.get(), prototype.get()); 1691 1692 generator.emitJump(done.get()); 1693 1694 generator.emitLabel(typeError.get()); 1695 generator.emitThrowTypeError("Right hand side of instanceof is not an object"); 1696 1697 generator.emitLabel(custom.get()); 1698 1699 generator.emitExpressionInfo(divot(), divotStart(), divotEnd()); 1700 generator.emitInstanceOfCustom(dstReg.get(), value.get(), constructor.get(), hasInstanceValue.get()); 1701 1702 generator.emitLabel(done.get()); 1703 1704 return dstReg.get(); 1678 1705 } 1679 1706
Note:
See TracChangeset
for help on using the changeset viewer.