📄 nodes.cpp
字号:
} Object thisObj = Object::dynamicCast(thisVal); Value result = func.call(exec,thisObj, argList); return result;}// ------------------------------ PostfixNode ----------------------------------void PostfixNode::ref(){ Node::ref(); if ( expr ) expr->ref();}bool PostfixNode::deref(){ if ( expr && expr->deref() ) delete expr; return Node::deref();}// ECMA 11.3Value PostfixNode::evaluate(ExecState *exec){ Reference ref = expr->evaluateReference(exec); KJS_CHECKEXCEPTIONVALUE Value v = ref.getValue(exec); Number n = v.toNumber(exec); double newValue = (oper == OpPlusPlus) ? n.value() + 1 : n.value() - 1; Value n2 = Number(newValue); ref.putValue(exec,n2); return n;}// ------------------------------ DeleteNode -----------------------------------void DeleteNode::ref(){ Node::ref(); if ( expr ) expr->ref();}bool DeleteNode::deref(){ if ( expr && expr->deref() ) delete expr; return Node::deref();}// ECMA 11.4.1Value DeleteNode::evaluate(ExecState *exec){ Reference ref = expr->evaluateReference(exec); KJS_CHECKEXCEPTIONVALUE return Boolean(ref.deleteValue(exec));}// ------------------------------ VoidNode -------------------------------------void VoidNode::ref(){ Node::ref(); if ( expr ) expr->ref();}bool VoidNode::deref(){ if ( expr && expr->deref() ) delete expr; return Node::deref();}// ECMA 11.4.2Value VoidNode::evaluate(ExecState *exec){ Value dummy1 = expr->evaluate(exec); KJS_CHECKEXCEPTIONVALUE return Undefined();}// ------------------------------ TypeOfNode -----------------------------------void TypeOfNode::ref(){ Node::ref(); if ( expr ) expr->ref();}bool TypeOfNode::deref(){ if ( expr && expr->deref() ) delete expr; return Node::deref();}// ECMA 11.4.3Value TypeOfNode::evaluate(ExecState *exec){ const char *s = 0L; Reference ref = expr->evaluateReference(exec); KJS_CHECKEXCEPTIONVALUE if (ref.isMutable()) { Value b = ref.getBase(exec); if (b.type() == NullType) return String("undefined"); } Value v = ref.getValue(exec); switch (v.type()) { case UndefinedType: s = "undefined"; break; case NullType: s = "object"; break; case BooleanType: s = "boolean"; break; case NumberType: s = "number"; break; case StringType: s = "string"; break; default: if (v.type() == ObjectType && static_cast<ObjectImp*>(v.imp())->implementsCall()) s = "function"; else s = "object"; break; } return String(s);}// ------------------------------ PrefixNode -----------------------------------void PrefixNode::ref(){ Node::ref(); if ( expr ) expr->ref();}bool PrefixNode::deref(){ if ( expr && expr->deref() ) delete expr; return Node::deref();}// ECMA 11.4.4 and 11.4.5Value PrefixNode::evaluate(ExecState *exec){ Reference ref = expr->evaluateReference(exec); KJS_CHECKEXCEPTIONVALUE Value v = ref.getValue(exec); Number n = v.toNumber(exec); double newValue = (oper == OpPlusPlus) ? n.value() + 1 : n.value() - 1; Value n2 = Number(newValue); ref.putValue(exec,n2); return n2;}// ------------------------------ UnaryPlusNode --------------------------------void UnaryPlusNode::ref(){ Node::ref(); if ( expr ) expr->ref();}bool UnaryPlusNode::deref(){ if ( expr && expr->deref() ) delete expr; return Node::deref();}// ECMA 11.4.6Value UnaryPlusNode::evaluate(ExecState *exec){ Value v = expr->evaluate(exec); KJS_CHECKEXCEPTIONVALUE return Number(v.toNumber(exec)); /* TODO: optimize */}// ------------------------------ NegateNode -----------------------------------void NegateNode::ref(){ Node::ref(); if ( expr ) expr->ref();}bool NegateNode::deref(){ if ( expr && expr->deref() ) delete expr; return Node::deref();}// ECMA 11.4.7Value NegateNode::evaluate(ExecState *exec){ Value v = expr->evaluate(exec); KJS_CHECKEXCEPTIONVALUE Number n = v.toNumber(exec); double d = -n.value(); return Number(d);}// ------------------------------ BitwiseNotNode -------------------------------void BitwiseNotNode::ref(){ Node::ref(); if ( expr ) expr->ref();}bool BitwiseNotNode::deref(){ if ( expr && expr->deref() ) delete expr; return Node::deref();}// ECMA 11.4.8Value BitwiseNotNode::evaluate(ExecState *exec){ Value v = expr->evaluate(exec); KJS_CHECKEXCEPTIONVALUE int i32 = v.toInt32(exec); return Number(~i32);}// ------------------------------ LogicalNotNode -------------------------------void LogicalNotNode::ref(){ Node::ref(); if ( expr ) expr->ref();}bool LogicalNotNode::deref(){ if ( expr && expr->deref() ) delete expr; return Node::deref();}// ECMA 11.4.9Value LogicalNotNode::evaluate(ExecState *exec){ Value v = expr->evaluate(exec); KJS_CHECKEXCEPTIONVALUE bool b = v.toBoolean(exec); return Boolean(!b);}// ------------------------------ MultNode -------------------------------------void MultNode::ref(){ Node::ref(); if ( term1 ) term1->ref(); if ( term2 ) term2->ref();}bool MultNode::deref(){ if ( term1 && term1->deref() ) delete term1; if ( term2 && term2->deref() ) delete term2; return Node::deref();}// ECMA 11.5Value MultNode::evaluate(ExecState *exec){ Value v1 = term1->evaluate(exec); KJS_CHECKEXCEPTIONVALUE Value v2 = term2->evaluate(exec); KJS_CHECKEXCEPTIONVALUE return mult(exec,v1, v2, oper);}// ------------------------------ AddNode --------------------------------------void AddNode::ref(){ Node::ref(); if ( term1 ) term1->ref(); if ( term2 ) term2->ref();}bool AddNode::deref(){ if ( term1 && term1->deref() ) delete term1; if ( term2 && term2->deref() ) delete term2; return Node::deref();}// ECMA 11.6Value AddNode::evaluate(ExecState *exec){ Value v1 = term1->evaluate(exec); KJS_CHECKEXCEPTIONVALUE Value v2 = term2->evaluate(exec); KJS_CHECKEXCEPTIONVALUE return add(exec,v1, v2, oper);}// ------------------------------ ShiftNode ------------------------------------void ShiftNode::ref(){ Node::ref(); if ( term1 ) term1->ref(); if ( term2 ) term2->ref();}bool ShiftNode::deref(){ if ( term1 && term1->deref() ) delete term1; if ( term2 && term2->deref() ) delete term2; return Node::deref();}// ECMA 11.7Value ShiftNode::evaluate(ExecState *exec){ Value v1 = term1->evaluate(exec); KJS_CHECKEXCEPTIONVALUE Value v2 = term2->evaluate(exec); KJS_CHECKEXCEPTIONVALUE unsigned int i2 = v2.toUInt32(exec); i2 &= 0x1f; long result; switch (oper) { case OpLShift: result = v1.toInt32(exec) << i2; break; case OpRShift: result = v1.toInt32(exec) >> i2; break; case OpURShift: result = v1.toUInt32(exec) >> i2; break; default: assert(!"ShiftNode: unhandled switch case"); result = 0L; } return Number(static_cast<double>(result));}// ------------------------------ RelationalNode -------------------------------void RelationalNode::ref(){ Node::ref(); if ( expr1 ) expr1->ref(); if ( expr2 ) expr2->ref();}bool RelationalNode::deref(){ if ( expr1 && expr1->deref() ) delete expr1; if ( expr2 && expr2->deref() ) delete expr2; return Node::deref();}// ECMA 11.8Value RelationalNode::evaluate(ExecState *exec){ Value v1 = expr1->evaluate(exec); KJS_CHECKEXCEPTIONVALUE Value v2 = expr2->evaluate(exec); KJS_CHECKEXCEPTIONVALUE bool b; if (oper == OpLess || oper == OpGreaterEq) { int r = relation(exec, v1, v2); if (r < 0) b = false; else b = (oper == OpLess) ? (r == 1) : (r == 0); } else if (oper == OpGreater || oper == OpLessEq) { int r = relation(exec, v2, v1); if (r < 0) b = false; else b = (oper == OpGreater) ? (r == 1) : (r == 0); } else if (oper == OpIn) { // Is all of this OK for host objects? if (v2.type() != ObjectType) return throwError(exec, TypeError, "Value %s (result of expression %s) is not an object. Cannot be used with IN expression.", v2, expr2); Object o2(static_cast<ObjectImp*>(v2.imp())); b = o2.hasProperty(exec, Identifier(v1.toString(exec))); } else { if (v2.type() != ObjectType) return throwError(exec, TypeError, "Value %s (result of expression %s) is not an object. Cannot be used with instanceof operator.", v2, expr2); Object o2(static_cast<ObjectImp*>(v2.imp())); if (!o2.implementsHasInstance()) { // According to the spec, only some types of objects "imlement" the [[HasInstance]] property. // But we are supposed to throw an exception where the object does not "have" the [[HasInstance]] // property. It seems that all object have the property, but not all implement it, so in this // case we return false (consistent with mozilla) return Boolean(false); // return throwError(exec, TypeError, // "Object does not implement the [[HasInstance]] method." ); } return o2.hasInstance(exec, v1); } return Boolean(b);}// ------------------------------ EqualNode ------------------------------------void EqualNode::ref(){ Node::ref(); if ( expr1 ) expr1->ref(); if ( expr2 ) expr2->ref();}bool EqualNode::deref(){ if ( expr1 && expr1->deref() ) delete expr1; if ( expr2 && expr2->deref() ) delete expr2; return Node::deref();}// ECMA 11.9Value EqualNode::evaluate(ExecState *exec){ Value v1 = expr1->evaluate(exec); KJS_CHECKEXCEPTIONVALUE Value v2 = expr2->evaluate(exec); KJS_CHECKEXCEPTIONVALUE bool result; if (oper == OpEqEq || oper == OpNotEq) { // == and != bool eq = equal(exec,v1, v2); result = oper == OpEqEq ? eq : !eq; } else { // === and !== bool eq = strictEqual(exec,v1, v2); result = oper == OpStrEq ? eq : !eq; } return Boolean(result);}// ------------------------------ BitOperNode ----------------------------------void BitOperNode::ref(){ Node::ref(); if ( expr1 ) expr1->ref(); if ( expr2 ) expr2->ref();}bool BitOperNode::deref(){ if ( expr1 && expr1->deref() ) delete expr1; if ( expr2 && expr2->deref() ) delete expr2; return Node::deref();}// ECMA 11.10Value BitOperNode::evaluate(ExecState *exec){ Value v1 = expr1->evaluate(exec); KJS_CHECKEXCEPTIONVALUE Value v2 = expr2->evaluate(exec); KJS_CHECKEXCEPTIONVALUE int i1 = v1.toInt32(exec); int i2 = v2.toInt32(exec); int result; if (oper == OpBitAnd) result = i1 & i2; else if (oper == OpBitXOr) result = i1 ^ i2; else result = i1 | i2; return Number(result);}// ------------------------------ BinaryLogicalNode ----------------------------void BinaryLogicalNode::ref(){ Node::ref(); if ( expr1 ) expr1->ref(); if ( expr2 ) expr2->ref();}bool BinaryLogicalNode::deref(){ if ( expr1 && expr1->deref() ) delete expr1; if ( expr2 && expr2->deref() ) delete expr2; return Node::deref();}// ECMA 11.11Value BinaryLogicalNode::evaluate(ExecState *exec){ Value v1 = expr1->evaluate(exec); KJS_CHECKEXCEPTIONVALUE bool b1 = v1.toBoolean(exec); if ((!b1 && oper == OpAnd) || (b1 && oper == OpOr)) return v1; Value v2 = expr2->evaluate(exec); KJS_CHECKEXCEPTIONVALUE return v2;}// ------------------------------ ConditionalNode ------------------------------void ConditionalNode::ref(){ Node::ref(); if ( expr1 ) expr1->ref(); if ( expr2 ) expr2->ref(); if ( logical ) logical->ref();}bool ConditionalNode::deref(){ if ( expr1 && expr1->deref() ) delete expr1; if ( expr2 && expr2->deref() ) delete expr2; if ( logical && logical->deref() ) delete logical; return Node::deref();}// ECMA 11.12Value ConditionalNode::evaluate(ExecState *exec){ Value v = logical->evaluate(exec); KJS_CHECKEXCEPTIONVALUE bool b = v.toBoolean(exec); if (b) v = expr1->evaluate(exec); else v = expr2->evaluate(exec); KJS_CHECKEXCEPTIONVALUE return v;}// ------------------------------ AssignNode -----------------------------------void AssignNode::ref(){ Node::ref(); if ( left ) left->ref(); if ( expr ) expr->ref();}bool AssignNode::deref(){ if ( left && left->deref() ) delete left; if ( expr && expr->deref() ) delete expr; return Node::deref();}// ECMA 11.13Value AssignNode::evaluate(ExecState *exec){ Reference l = left->evaluateReference(exec); KJS_CHECKEXCEPTIONVALUE Value e, v; if (oper == OpEqual) { v = expr->evaluate(exec); KJS_CHECKEXCEPTIONVALUE } else { Value v1 = l.getValue(exec); Value v2 = expr->evaluate(exec); KJS_CHECKEXCEPTIONVALUE int i1; int i2; unsigned int ui; switch (oper) { case OpMultEq: v = mult(exec, v1, v2, '*'); break; case OpDivEq: v = mult(exec, v1, v2, '/'); break; case OpPlusEq: v = add(exec, v1, v2, '+'); break; case OpMinusEq: v = add(exec, v1, v2, '-'); break; case OpLShift: i1 = v1.toInt32(exec); i2 = v2.toInt32(exec); v = Number(i1 <<= i2); break; case OpRShift: i1 = v1.toInt32(exec); i2 = v2.toInt32(exec); v = Number(i1 >>= i2); break; case OpURShift: ui = v1.toUInt32(exec); i2 = v2.toInt32(exec); v = Number(ui >>= i2); break; case OpAndEq: i1 = v1.toInt32(exec); i2 = v2.toInt32(exec); v = Number(i1 &= i2); break; case OpXOrEq: i1 = v1.toInt32(exec); i2 = v2.toInt32(exec); v = Number(i1 ^= i2); break; case OpOrEq: i1 = v1.toInt32(exec); i2 = v2.toInt32(exec); v = Number(i1 |= i2); break; case OpModEq: { double d1 = v1.toNumber(exec); double d2 = v2.toNumber(exec); v = Number(fmod(d1,d2)); } break; default: v = Undefined(); } }; l.putValue(exec,v); KJS_CHECKEXCEPTIONVALUE return v;}// ------------------------------ CommaNode ------------------------------------void CommaNode::ref(){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -