⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 nodes.cpp

📁 khtml在gtk上的移植版本
💻 CPP
📖 第 1 页 / 共 4 页
字号:
  }  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 + -