Changeset 9033 in webkit for trunk/JavaScriptCore/kjs/nodes.cpp
- Timestamp:
- Apr 20, 2005, 3:14:35 AM (20 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/JavaScriptCore/kjs/nodes.cpp
r7239 r9033 48 48 using namespace KJS; 49 49 50 // Disabled for now because it shows up on benchmark (0.5%). 51 #if DEBUGGER_SUPPORT 52 50 53 #define KJS_BREAKPOINT \ 51 54 if (!hitStatement(exec)) \ … … 56 59 exec->dynamicInterpreter()->imp()->debugger()->imp()->aborted()) \ 57 60 return Completion(Normal); 61 62 #else 63 64 #define KJS_BREAKPOINT 65 #define KJS_ABORTPOINT 66 67 #endif 58 68 59 69 #define KJS_CHECKEXCEPTION \ … … 210 220 Value BooleanNode::evaluate(ExecState */*exec*/) 211 221 { 212 return Boolean(value);222 return Value(value); 213 223 } 214 224 … … 217 227 Value NumberNode::evaluate(ExecState */*exec*/) 218 228 { 219 return Number(value);229 return Value(value); 220 230 } 221 231 … … 224 234 Value StringNode::evaluate(ExecState */*exec*/) 225 235 { 226 return String(value);236 return value; 227 237 } 228 238 … … 379 389 380 390 if (opt) 381 array.put(exec,lengthPropertyName, Number(elision + length), DontEnum | DontDelete);391 array.put(exec,lengthPropertyName, Value(elision + length), DontEnum | DontDelete); 382 392 383 393 return array; … … 699 709 } 700 710 701 Object func = Object(static_cast<ObjectImp*>(v.imp()));702 703 if (!func .implementsCall()) {711 ObjectImp *func = static_cast<ObjectImp*>(v.imp()); 712 713 if (!func->implementsCall()) { 704 714 return throwError(exec, TypeError, "Object %s (result of expression %s) does not allow calls.", v, expr); 705 715 } 706 716 707 Value thisVal; 708 if (ref.isMutable()) 709 thisVal = ref.getBase(exec); 710 else 711 thisVal = Null(); 712 713 if (thisVal.type() == ObjectType && 714 Object::dynamicCast(thisVal).inherits(&ActivationImp::info)) 715 thisVal = Null(); 716 717 if (thisVal.type() != ObjectType) { 717 ObjectImp *thisObjImp = 0; 718 ValueImp *thisValImp = ref.baseIfMutable(); 719 if (thisValImp && thisValImp->type() == ObjectType && !static_cast<ObjectImp *>(thisValImp)->inherits(&ActivationImp::info)) 720 thisObjImp = static_cast<ObjectImp *>(thisValImp); 721 722 if (!thisObjImp) { 718 723 // ECMA 11.2.3 says that in this situation the this value should be null. 719 724 // However, section 10.2.3 says that in the case where the value provided … … 722 727 // of implementation we use the global object anyway here. This guarantees 723 728 // that in host objects you always get a valid object for this. 724 // thisVal = Null(); 725 thisVal = exec->dynamicInterpreter()->globalObject(); 726 } 727 728 Object thisObj = Object::dynamicCast(thisVal); 729 Value result = func.call(exec,thisObj, argList); 730 731 return result; 729 thisObjImp = exec->dynamicInterpreter()->globalObject().imp(); 730 } 731 732 Object thisObj(thisObjImp); 733 return func->call(exec, thisObj, argList); 732 734 } 733 735 … … 754 756 KJS_CHECKEXCEPTIONVALUE 755 757 Value v = ref.getValue(exec); 756 Number n = v.toNumber(exec); 757 758 double n ewValue = (oper == OpPlusPlus) ? n.value() + 1 : n.value() - 1;759 Value n2 = Number(newValue); 760 761 ref.putValue(exec, n2);762 763 return n;758 759 bool knownToBeInteger; 760 double n = v.toNumber(exec, knownToBeInteger); 761 762 double newValue = (oper == OpPlusPlus) ? n + 1 : n - 1; 763 ref.putValue(exec, Value(newValue, knownToBeInteger)); 764 765 return Value(n, knownToBeInteger); 764 766 } 765 767 … … 785 787 Reference ref = expr->evaluateReference(exec); 786 788 KJS_CHECKEXCEPTIONVALUE 787 return Boolean(ref.deleteValue(exec));789 return Value(ref.deleteValue(exec)); 788 790 } 789 791 … … 835 837 Reference ref = expr->evaluateReference(exec); 836 838 KJS_CHECKEXCEPTIONVALUE 837 if (ref.isMutable()) { 838 Value b = ref.getBase(exec); 839 if (b.type() == NullType) 840 return String("undefined"); 841 } 839 ValueImp *b = ref.baseIfMutable(); 840 if (b && b->dispatchType() == NullType) 841 return Value("undefined"); 842 842 Value v = ref.getValue(exec); 843 843 switch (v.type()) … … 866 866 } 867 867 868 return String(s);868 return Value(s); 869 869 } 870 870 … … 891 891 KJS_CHECKEXCEPTIONVALUE 892 892 Value v = ref.getValue(exec); 893 Number n = v.toNumber(exec); 894 895 double newValue = (oper == OpPlusPlus) ? n.value() + 1 : n.value() - 1; 896 Value n2 = Number(newValue); 897 898 ref.putValue(exec,n2); 893 894 bool knownToBeInteger; 895 double n = v.toNumber(exec, knownToBeInteger); 896 897 double newValue = (oper == OpPlusPlus) ? n + 1 : n - 1; 898 Value n2(newValue, knownToBeInteger); 899 900 ref.putValue(exec, n2); 899 901 900 902 return n2; … … 923 925 KJS_CHECKEXCEPTIONVALUE 924 926 925 return Number(v.toNumber(exec)); /* TODO: optimize */927 return Value(v.toNumber(exec)); /* TODO: optimize */ 926 928 } 927 929 … … 947 949 Value v = expr->evaluate(exec); 948 950 KJS_CHECKEXCEPTIONVALUE 949 Number n = v.toNumber(exec); 950 951 double d = -n.value(); 952 953 return Number(d); 951 952 bool knownToBeInteger; 953 double n = v.toNumber(exec, knownToBeInteger); 954 return Value(-n, knownToBeInteger && n != 0); 954 955 } 955 956 … … 975 976 Value v = expr->evaluate(exec); 976 977 KJS_CHECKEXCEPTIONVALUE 977 int i32 = v.toInt32(exec); 978 979 return Number(~i32); 978 return Value(~v.toInt32(exec)); 980 979 } 981 980 … … 1001 1000 Value v = expr->evaluate(exec); 1002 1001 KJS_CHECKEXCEPTIONVALUE 1003 bool b = v.toBoolean(exec); 1004 1005 return Boolean(!b); 1002 return Value(!v.toBoolean(exec)); 1006 1003 } 1007 1004 … … 1035 1032 KJS_CHECKEXCEPTIONVALUE 1036 1033 1037 return mult(exec, v1, v2, oper);1034 return mult(exec, v1, v2, oper); 1038 1035 } 1039 1036 … … 1067 1064 KJS_CHECKEXCEPTIONVALUE 1068 1065 1069 return add(exec, v1, v2, oper);1066 return add(exec, v1, v2, oper); 1070 1067 } 1071 1068 … … 1100 1097 i2 &= 0x1f; 1101 1098 1102 double result;1103 1099 switch (oper) { 1104 1100 case OpLShift: 1105 result = v1.toInt32(exec) << i2; 1106 break; 1101 return Value(v1.toInt32(exec) << i2); 1107 1102 case OpRShift: 1108 result = v1.toInt32(exec) >> i2; 1109 break; 1103 return Value(v1.toInt32(exec) >> i2); 1110 1104 case OpURShift: 1111 result = v1.toUInt32(exec) >> i2; 1112 break; 1105 return Value(v1.toUInt32(exec) >> i2); 1113 1106 default: 1114 1107 assert(!"ShiftNode: unhandled switch case"); 1115 result = 0; 1116 } 1117 1118 return Number(result); 1108 return Undefined(); 1109 } 1119 1110 } 1120 1111 … … 1178 1169 // property. It seems that all object have the property, but not all implement it, so in this 1179 1170 // case we return false (consistent with mozilla) 1180 return Boolean(false);1171 return Value(false); 1181 1172 // return throwError(exec, TypeError, 1182 1173 // "Object does not implement the [[HasInstance]] method." ); … … 1185 1176 } 1186 1177 1187 return Boolean(b);1178 return Value(b); 1188 1179 } 1189 1180 … … 1226 1217 result = oper == OpStrEq ? eq : !eq; 1227 1218 } 1228 return Boolean(result);1219 return Value(result); 1229 1220 } 1230 1221 … … 1266 1257 result = i1 | i2; 1267 1258 1268 return Number(result);1259 return Value(result); 1269 1260 } 1270 1261 … … 1396 1387 i1 = v1.toInt32(exec); 1397 1388 i2 = v2.toInt32(exec); 1398 v = Number(i1 <<=i2);1389 v = Value(i1 << i2); 1399 1390 break; 1400 1391 case OpRShift: 1401 1392 i1 = v1.toInt32(exec); 1402 1393 i2 = v2.toInt32(exec); 1403 v = Number(i1 >>=i2);1394 v = Value(i1 >> i2); 1404 1395 break; 1405 1396 case OpURShift: 1406 1397 ui = v1.toUInt32(exec); 1407 1398 i2 = v2.toInt32(exec); 1408 v = Number(ui >>=i2);1399 v = Value(ui >> i2); 1409 1400 break; 1410 1401 case OpAndEq: 1411 1402 i1 = v1.toInt32(exec); 1412 1403 i2 = v2.toInt32(exec); 1413 v = Number(i1 &=i2);1404 v = Value(i1 & i2); 1414 1405 break; 1415 1406 case OpXOrEq: 1416 1407 i1 = v1.toInt32(exec); 1417 1408 i2 = v2.toInt32(exec); 1418 v = Number(i1 ^=i2);1409 v = Value(i1 ^ i2); 1419 1410 break; 1420 1411 case OpOrEq: 1421 1412 i1 = v1.toInt32(exec); 1422 1413 i2 = v2.toInt32(exec); 1423 v = Number(i1 |=i2);1414 v = Value(i1 | i2); 1424 1415 break; 1425 1416 case OpModEq: { 1426 double d1 = v1.toNumber(exec); 1427 double d2 = v2.toNumber(exec); 1428 v = Number(fmod(d1,d2)); 1417 bool d1KnownToBeInteger; 1418 double d1 = v1.toNumber(exec, d1KnownToBeInteger); 1419 bool d2KnownToBeInteger; 1420 double d2 = v2.toNumber(exec, d2KnownToBeInteger); 1421 v = Value(fmod(d1, d2), d1KnownToBeInteger && d2KnownToBeInteger && d2 != 0); 1429 1422 } 1430 1423 break; … … 1596 1589 Value VarDeclNode::evaluate(ExecState *exec) 1597 1590 { 1598 Object variable = Object::dynamicCast(exec->context().imp()->variableObject());1591 Object variable = exec->context().imp()->variableObject(); 1599 1592 1600 1593 Value val; … … 1617 1610 variable.put(exec, ident, val, DontDelete | Internal); 1618 1611 1619 return String(ident.ustring());1612 return ident.ustring(); 1620 1613 } 1621 1614 … … 1978 1971 Completion ForNode::execute(ExecState *exec) 1979 1972 { 1980 Value e, v, cval; 1981 bool b; 1973 Value v, cval; 1982 1974 1983 1975 if (expr1) { … … 1989 1981 v = expr2->evaluate(exec); 1990 1982 KJS_CHECKEXCEPTION 1991 b = v.toBoolean(exec); 1992 if (b == false) 1983 if (!v.toBoolean(exec)) 1993 1984 return Completion(Normal, cval); 1994 1985 }
Note:
See TracChangeset
for help on using the changeset viewer.