Chromium Code Reviews| Index: frog/leg/lib/core.dart |
| =================================================================== |
| --- frog/leg/lib/core.dart (revision 3592) |
| +++ frog/leg/lib/core.dart (working copy) |
| @@ -56,28 +56,28 @@ |
| // operator, since that's what we are defining here. |
| throw "calling toString() on right hand operand of operator + did not return a String"; |
| } |
| - throw "Unimplemented user-defined +."; |
| + return UNINTERCEPTED(a + b); |
| } |
| div(var a, var b) { |
| if (checkNumbers(a, b, "num/ expects a number as second operand.")) { |
| return JS("num", @"$0 / $1", a, b); |
| } |
| - throw "Unimplemented user-defined /."; |
| + return UNINTERCEPTED(a / b); |
| } |
| mul(var a, var b) { |
| if (checkNumbers(a, b, "num* expects a number as second operand.")) { |
| return JS("num", @"$0 * $1", a, b); |
| } |
| - throw "Unimplemented user-defined *."; |
| + return UNINTERCEPTED(a * b); |
| } |
| sub(var a, var b) { |
| if (checkNumbers(a, b, "num- expects a number as second operand.")) { |
| return JS("num", @"$0 - $1", a, b); |
| } |
| - throw "Unimplemented user-defined binary -."; |
| + return UNINTERCEPTED(a - b); |
| } |
| mod(var a, var b) { |
| @@ -92,7 +92,7 @@ |
| return result + b; |
| } |
| } |
| - throw "Unimplemented user-defined %."; |
| + return UNINTERCEPTED(a % b); |
| } |
| tdiv(var a, var b) { |
| @@ -106,13 +106,15 @@ |
| return JS("num", @"Math.floor($0)", tmp); |
| } |
| } |
| - throw "Unimplemented user-defined ~/."; |
| + return UNINTERCEPTED(a ~/ b); |
| } |
| eq(var a, var b) { |
| if (JS("bool", @"typeof $0 === 'object'", a)) { |
| - if (JS("bool", @"$0.$equals", a)) { |
| - return JS("bool", @"$0.$equals($1) === true", a, b); |
| + // TODO(ngeoffray): If we start using more property checks like |
| + // this, add a foreign PROPERTY_CHECK element. |
| + if (JS("bool", @"$0.operator$eq$1", a)) { |
|
Lasse Reichstein Nielsen
2012/01/27 09:42:34
I recommend doing the foreign PREOPRTY_CHECK macro
ngeoffray
2012/01/27 10:50:04
As discussed, added a JS_HAS_EQUALS to avoid the m
|
| + return UNINTERCEPTED(a == b) === true; |
| } else { |
| return JS("bool", @"$0 === $1", a, b); |
| } |
| @@ -127,8 +129,8 @@ |
| eqNull(var a) { |
| if (JS("bool", @"typeof $0 === 'object'", a)) { |
| - if (JS("bool", @"$0.$equals", a)) { |
| - return JS("bool", @"$0.$equals(void 0) === true", a); |
| + if (JS("bool", @"$0.operator$eq$1", a)) { |
|
Lasse Reichstein Nielsen
2012/01/27 09:42:34
Ditto here.
ngeoffray
2012/01/27 10:50:04
Done.
|
| + return UNINTERCEPTED(a == null) === true; |
| } else { |
| return false; |
| } |
| @@ -141,28 +143,28 @@ |
| if (checkNumbers(a, b, "num> expects a number as second operand.")) { |
| return JS("bool", @"$0 > $1", a, b); |
| } |
| - throw "Unimplemented user-defined binary >."; |
| + return UNINTERCEPTED(a > b); |
| } |
| ge(var a, var b) { |
| if (checkNumbers(a, b, "num>= expects a number as second operand.")) { |
| return JS("bool", @"$0 >= $1", a, b); |
| } |
| - throw "Unimplemented user-defined binary >=."; |
| + return UNINTERCEPTED(a >= b); |
| } |
| lt(var a, var b) { |
| if (checkNumbers(a, b, "num< expects a number as second operand.")) { |
| return JS("bool", @"$0 < $1", a, b); |
| } |
| - throw "Unimplemented user-defined binary <."; |
| + return UNINTERCEPTED(a < b); |
| } |
| le(var a, var b) { |
| if (checkNumbers(a, b, "num<= expects a number as second operand.")) { |
| return JS("bool", @"$0 <= $1", a, b); |
| } |
| - throw "Unimplemented user-defined binary <=."; |
| + return UNINTERCEPTED(a <= b); |
| } |
| shl(var a, var b) { |
| @@ -170,7 +172,7 @@ |
| if (checkNumbers(a, b, "int<< expects an int as second operand.")) { |
| return JS("num", @"$0 << $1", a, b); |
| } |
| - throw "Unimplemented user-defined binary <<."; |
| + return UNINTERCEPTED(a << b); |
| } |
| shr(var a, var b) { |
| @@ -178,7 +180,7 @@ |
| if (checkNumbers(a, b, "int>> expects an int as second operand.")) { |
| return JS("num", @"$0 >> $1", a, b); |
| } |
| - throw "Unimplemented user-defined binary >>."; |
| + return UNINTERCEPTED(a >> b); |
| } |
| and(var a, var b) { |
| @@ -186,7 +188,7 @@ |
| if (checkNumbers(a, b, "int& expects an int as second operand.")) { |
| return JS("num", @"$0 & $1", a, b); |
| } |
| - throw "Unimplemented user-defined binary &."; |
| + return UNINTERCEPTED(a & b); |
| } |
| or(var a, var b) { |
| @@ -194,7 +196,7 @@ |
| if (checkNumbers(a, b, "int| expects an int as second operand.")) { |
| return JS("num", @"$0 | $1", a, b); |
| } |
| - throw "Unimplemented user-defined binary |."; |
| + return UNINTERCEPTED(a | b); |
| } |
| xor(var a, var b) { |
| @@ -202,17 +204,17 @@ |
| if (checkNumbers(a, b, "int^ expects an int as second operand.")) { |
| return JS("num", @"$0 ^ $1", a, b); |
| } |
| - throw "Unimplemented user-defined binary ^."; |
| + return UNINTERCEPTED(a ^ b); |
| } |
| not(var a) { |
| if (JS("bool", @"typeof $0 === 'number'", a)) return JS("num", @"~$0", a); |
| - throw "Unimplemented user-defined ~."; |
| + return UNINTERCEPTED(~a); |
| } |
| neg(var a) { |
| if (JS("bool", @"typeof $0 === 'number'", a)) return JS("num", @"-$0", a); |
| - throw "Unimplemented user-defined unary-."; |
| + return UNINTERCEPTED(-a); |
| } |
| index(var a, var index) { |
| @@ -221,7 +223,7 @@ |
| if (index < 0 || index >= a.length) $throw('Out of bounds'); |
| return JS("Object", @"$0[$1]", a, index); |
| } |
| - throw "Unimplemented user-defined []."; |
| + return UNINTERCEPTED(a[index]); |
| } |
| indexSet(var a, var index, var value) { |
| @@ -230,7 +232,7 @@ |
| if (index < 0 || index >= a.length) $throw('Out of bounds'); |
| return JS("Object", @"$0[$1] = $2", a, index, value); |
| } |
| - throw "Unimplemented user-defined []=."; |
| + return UNINTERCEPTED(a[index] = value); |
| } |
| builtin$add$1(var receiver, var value) { |
| @@ -238,14 +240,14 @@ |
| JS("Object", @"$0.push($1)", receiver, value); |
| return; |
| } |
| - throw "Unimplemented user-defined add()."; |
| + return UNINTERCEPTED(receiver.add(value)); |
| } |
| builtin$removeLast$0(var receiver) { |
| if (isJSArray(receiver)) { |
| return JS("Object", @"$0.pop()", receiver); |
| } |
| - throw "Unimplemented user-defined removeLast()."; |
| + return UNINTERCEPTED(receiver.removeLast()); |
| } |
| builtin$filter$1(var receiver, var predicate) { |
| @@ -253,7 +255,7 @@ |
| return JS("Object", @"$0.filter(function(v) { return $1(v) === true; })", |
| receiver, predicate); |
| } |
| - throw "Unimplemented user-defined filter()."; |
| + return UNINTERCEPTED(receiver.filter(predicate)); |
| } |
| @@ -261,7 +263,7 @@ |
| if (JS("bool", @"typeof $0 === 'string'", receiver) || isJSArray(receiver)) { |
| return JS("num", @"$0.length", receiver); |
| } |
| - throw "Unimplemented user-defined length."; |
| + return UNINTERCEPTED(receiver.length); |
| } |
| @@ -387,13 +389,18 @@ |
| } |
| static void _fail(String message) { |
| - throw message; |
| + $throw(message); |
| } |
| static void isTrue(var actual) { |
|
Lasse Reichstein Nielsen
2012/01/27 09:42:34
Add a TODO to add the optional message parameter w
ngeoffray
2012/01/27 10:50:04
Done.
|
| if (actual === true) return; |
| _fail("Expect.isTrue($actual) fails."); |
| } |
| + |
| + static void isFalse(var actual) { |
| + if (actual === false) return; |
| + _fail("Expect.isFalse($actual) fails."); |
| + } |
| } |
| class Stopwatch { |