📄 nodes.h
字号:
: ExpressionNode(globalData) , m_expr1(expr1) , m_expr2(expr2) , m_rightHasAssignments(rightHasAssignments) { } BinaryOpNode(JSGlobalData* globalData, ResultType type, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) : ExpressionNode(globalData, type) , m_expr1(expr1) , m_expr2(expr2) , m_rightHasAssignments(rightHasAssignments) { } virtual ~BinaryOpNode(); virtual void releaseNodes(NodeReleaser&); virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; virtual OpcodeID opcodeID() const JSC_FAST_CALL = 0; protected: RefPtr<ExpressionNode> m_expr1; RefPtr<ExpressionNode> m_expr2; bool m_rightHasAssignments; }; class ReverseBinaryOpNode : public BinaryOpNode { public: ReverseBinaryOpNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) : BinaryOpNode(globalData, expr1, expr2, rightHasAssignments) { } ReverseBinaryOpNode(JSGlobalData* globalData, ResultType type, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) : BinaryOpNode(globalData, type, expr1, expr2, rightHasAssignments) { } virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; }; class MultNode : public BinaryOpNode { public: MultNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL : BinaryOpNode(globalData, ResultType::numberTypeCanReuse(), expr1, expr2, rightHasAssignments) { } virtual OpcodeID opcodeID() const JSC_FAST_CALL { return op_mul; } }; class DivNode : public BinaryOpNode { public: DivNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL : BinaryOpNode(globalData, ResultType::numberTypeCanReuse(), expr1, expr2, rightHasAssignments) { } virtual OpcodeID opcodeID() const JSC_FAST_CALL { return op_div; } }; class ModNode : public BinaryOpNode { public: ModNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL : BinaryOpNode(globalData, ResultType::numberTypeCanReuse(), expr1, expr2, rightHasAssignments) { } virtual OpcodeID opcodeID() const JSC_FAST_CALL { return op_mod; } }; class AddNode : public BinaryOpNode { public: AddNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL : BinaryOpNode(globalData, ResultType::forAdd(expr1->resultDescriptor(), expr2->resultDescriptor()), expr1, expr2, rightHasAssignments) { } virtual OpcodeID opcodeID() const JSC_FAST_CALL { return op_add; } }; class SubNode : public BinaryOpNode { public: SubNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL : BinaryOpNode(globalData, ResultType::numberTypeCanReuse(), expr1, expr2, rightHasAssignments) { } virtual OpcodeID opcodeID() const JSC_FAST_CALL { return op_sub; } }; class LeftShiftNode : public BinaryOpNode { public: LeftShiftNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL : BinaryOpNode(globalData, ResultType::forBitOp(), expr1, expr2, rightHasAssignments) { } virtual OpcodeID opcodeID() const JSC_FAST_CALL { return op_lshift; } }; class RightShiftNode : public BinaryOpNode { public: RightShiftNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL : BinaryOpNode(globalData, ResultType::forBitOp(), expr1, expr2, rightHasAssignments) { } virtual OpcodeID opcodeID() const JSC_FAST_CALL { return op_rshift; } }; class UnsignedRightShiftNode : public BinaryOpNode { public: UnsignedRightShiftNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL : BinaryOpNode(globalData, ResultType::numberTypeCanReuse(), expr1, expr2, rightHasAssignments) { } virtual OpcodeID opcodeID() const JSC_FAST_CALL { return op_urshift; } }; class LessNode : public BinaryOpNode { public: LessNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL : BinaryOpNode(globalData, ResultType::booleanType(), expr1, expr2, rightHasAssignments) { } virtual OpcodeID opcodeID() const JSC_FAST_CALL { return op_less; } }; class GreaterNode : public ReverseBinaryOpNode { public: GreaterNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL : ReverseBinaryOpNode(globalData, ResultType::booleanType(), expr1, expr2, rightHasAssignments) { } virtual OpcodeID opcodeID() const JSC_FAST_CALL { return op_less; } }; class LessEqNode : public BinaryOpNode { public: LessEqNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL : BinaryOpNode(globalData, ResultType::booleanType(), expr1, expr2, rightHasAssignments) { } virtual OpcodeID opcodeID() const JSC_FAST_CALL { return op_lesseq; } }; class GreaterEqNode : public ReverseBinaryOpNode { public: GreaterEqNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL : ReverseBinaryOpNode(globalData, ResultType::booleanType(), expr1, expr2, rightHasAssignments) { } virtual OpcodeID opcodeID() const JSC_FAST_CALL { return op_lesseq; } }; class ThrowableBinaryOpNode : public BinaryOpNode, public ThrowableExpressionData { public: ThrowableBinaryOpNode(JSGlobalData* globalData, ResultType type, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL : BinaryOpNode(globalData, type, expr1, expr2, rightHasAssignments) { } ThrowableBinaryOpNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL : BinaryOpNode(globalData, expr1, expr2, rightHasAssignments) { } virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; }; class InstanceOfNode : public ThrowableBinaryOpNode { public: InstanceOfNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL : ThrowableBinaryOpNode(globalData, ResultType::booleanType(), expr1, expr2, rightHasAssignments) { } virtual OpcodeID opcodeID() const JSC_FAST_CALL { return op_instanceof; } virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; }; class InNode : public ThrowableBinaryOpNode { public: InNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL : ThrowableBinaryOpNode(globalData, expr1, expr2, rightHasAssignments) { } virtual OpcodeID opcodeID() const JSC_FAST_CALL { return op_in; } }; class EqualNode : public BinaryOpNode { public: EqualNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL : BinaryOpNode(globalData, ResultType::booleanType(), expr1, expr2, rightHasAssignments) { } virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; virtual OpcodeID opcodeID() const JSC_FAST_CALL { return op_eq; } }; class NotEqualNode : public BinaryOpNode { public: NotEqualNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL : BinaryOpNode(globalData, ResultType::booleanType(), expr1, expr2, rightHasAssignments) { } virtual OpcodeID opcodeID() const JSC_FAST_CALL { return op_neq; } }; class StrictEqualNode : public BinaryOpNode { public: StrictEqualNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL : BinaryOpNode(globalData, ResultType::booleanType(), expr1, expr2, rightHasAssignments) { } virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; virtual OpcodeID opcodeID() const JSC_FAST_CALL { return op_stricteq; } }; class NotStrictEqualNode : public BinaryOpNode { public: NotStrictEqualNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL : BinaryOpNode(globalData, ResultType::booleanType(), expr1, expr2, rightHasAssignments) { } virtual OpcodeID opcodeID() const JSC_FAST_CALL { return op_nstricteq; } }; class BitAndNode : public BinaryOpNode { public: BitAndNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL : BinaryOpNode(globalData, ResultType::forBitOp(), expr1, expr2, rightHasAssignments) { } virtual OpcodeID opcodeID() const JSC_FAST_CALL { return op_bitand; } }; class BitOrNode : public BinaryOpNode { public: BitOrNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL : BinaryOpNode(globalData, ResultType::forBitOp(), expr1, expr2, rightHasAssignments) { } virtual OpcodeID opcodeID() const JSC_FAST_CALL { return op_bitor; } }; class BitXOrNode : public BinaryOpNode { public: BitXOrNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, bool rightHasAssignments) JSC_FAST_CALL : BinaryOpNode(globalData, ResultType::forBitOp(), expr1, expr2, rightHasAssignments) { } virtual OpcodeID opcodeID() const JSC_FAST_CALL { return op_bitxor; } }; /** * m_expr1 && m_expr2, m_expr1 || m_expr2 */ class LogicalOpNode : public ExpressionNode { public: LogicalOpNode(JSGlobalData* globalData, ExpressionNode* expr1, ExpressionNode* expr2, LogicalOperator oper) JSC_FAST_CALL : ExpressionNode(globalData, ResultType::booleanType()) , m_expr1(expr1) , m_expr2(expr2) , m_operator(oper) { } virtual ~LogicalOpNode(); virtual void releaseNodes(NodeReleaser&); virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; private: RefPtr<ExpressionNode> m_expr1; RefPtr<ExpressionNode> m_expr2; LogicalOperator m_operator; }; /** * The ternary operator, "m_logical ? m_expr1 : m_expr2" */ class ConditionalNode : public ExpressionNode { public: ConditionalNode(JSGlobalData* globalData, ExpressionNode* logical, ExpressionNode* expr1, ExpressionNode* expr2) JSC_FAST_CALL : ExpressionNode(globalData) , m_logical(logical) , m_expr1(expr1) , m_expr2(expr2) { } virtual ~ConditionalNode(); virtual void releaseNodes(NodeReleaser&); virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; private: RefPtr<ExpressionNode> m_logical; RefPtr<ExpressionNode> m_expr1; RefPtr<ExpressionNode> m_expr2; }; class ReadModifyResolveNode : public ExpressionNode, public ThrowableExpressionData { public: ReadModifyResolveNode(JSGlobalData* globalData, const Identifier& ident, Operator oper, ExpressionNode* right, bool rightHasAssignments, unsigned divot, unsigned startOffset, unsigned endOffset) JSC_FAST_CALL : ExpressionNode(globalData) , ThrowableExpressionData(divot, startOffset, endOffset) , m_ident(ident) , m_right(right) , m_operator(oper) , m_rightHasAssignments(rightHasAssignments) { } virtual ~ReadModifyResolveNode(); virtual void releaseNodes(NodeReleaser&); virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; private: Identifier m_ident; RefPtr<ExpressionNode> m_right; size_t m_index; // Used by ReadModifyLocalVarNode. Operator m_operator : 31; bool m_rightHasAssignments : 1; }; class AssignResolveNode : public ExpressionNode, public ThrowableExpressionData { public: AssignResolveNode(JSGlobalData* globalData, const Identifier& ident, ExpressionNode* right, bool rightHasAssignments) JSC_FAST_CALL : ExpressionNode(globalData) , m_ident(ident) , m_right(right) , m_rightHasAssignments(rightHasAssignments) { } virtual ~AssignResolveNode(); virtual void releaseNodes(NodeReleaser&); virtual RegisterID* emitBytecode(BytecodeGenerator&, RegisterID* = 0) JSC_FAST_CALL; private: Identifier m_ident; RefPtr<ExpressionNode> m_right; size_t m_index; // Used by ReadModifyLocalVarNode. bool m_rightHasAssignments; }; class ReadModifyBracketNode : public ExpressionNode, public ThrowableSubExpressionData { public: ReadModifyBracketNode(JSGlobalData* globalData, ExpressionNode* base, ExpressionNode* subscript, Operator oper, ExpressionNode* right, bool subscriptHasAssignments, bool rightHasAssignments, unsigned divot, unsigned startOffset, unsigned endOffset) JSC_FAST_CALL : ExpressionNode(globalData) , ThrowableSubExpressionData(divot, startOffset, endOffset) , m_base(base) , m_subscript(subscript) , m_right(right) , m_operator(oper) , m_subscriptHasAssignments(subscriptHasAssignments) , m_rightHasAssignments(rightHasAssignments) { }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -