Index: frog/minfrog |
diff --git a/frog/minfrog b/frog/minfrog |
index 2c1d3bbe75b79fd46bd00d7301d83707a8862366..e72dc95bb5efb11e8255055b39f8ab0573ab7939 100755 |
--- a/frog/minfrog |
+++ b/frog/minfrog |
@@ -32,11 +32,7 @@ function $throw(e) { |
throw e; |
} |
$defProp(Object.prototype, '$index', function(i) { |
- var proto = Object.getPrototypeOf(this); |
- if (proto !== Object) { |
- proto.$index = function(i) { return this[i]; } |
- } |
- return this[i]; |
+ $throw(new NoSuchMethodException(this, "operator []", [i])); |
}); |
$defProp(Array.prototype, '$index', function(index) { |
var i = index | 0; |
@@ -51,11 +47,7 @@ $defProp(String.prototype, '$index', function(i) { |
return this[i]; |
}); |
$defProp(Object.prototype, '$setindex', function(i, value) { |
- var proto = Object.getPrototypeOf(this); |
- if (proto !== Object) { |
- proto.$setindex = function(i, value) { return this[i] = value; } |
- } |
- return this[i] = value; |
+ $throw(new NoSuchMethodException(this, "operator []=", [i, value])); |
}); |
$defProp(Array.prototype, '$setindex', function(index, value) { |
var i = index | 0; |
@@ -66,85 +58,179 @@ $defProp(Array.prototype, '$setindex', function(index, value) { |
} |
return this[i] = value; |
}); |
+function $add$complex(x, y) { |
+ if (typeof(x) == 'number') { |
+ $throw(new IllegalArgumentException(y)); |
+ } else if (typeof(x) == 'string') { |
+ var str = (y == null) ? 'null' : y.toString(); |
+ if (typeof(str) != 'string') { |
+ throw new Error("calling toString() on right hand operand of operator " + |
+ "+ did not return a String"); |
+ } |
+ return x + str; |
+ } else if (typeof(x) == 'object') { |
+ return x.$add(y); |
+ } else { |
+ $throw(new NoSuchMethodException(x, "operator +", [y])); |
+ } |
+} |
+ |
function $add(x, y) { |
- return ((typeof(x) == 'number' && typeof(y) == 'number') || |
- (typeof(x) == 'string')) |
- ? x + y : x.$add(y); |
+ if (typeof(x) == 'number' && typeof(y) == 'number') return x + y; |
+ return $add$complex(x, y); |
+} |
+function $bit_xor$complex(x, y) { |
+ if (typeof(x) == 'number') { |
+ $throw(new IllegalArgumentException(y)); |
+ } else if (typeof(x) == 'object') { |
+ return x.$bit_xor(y); |
+ } else { |
+ $throw(new NoSuchMethodException(x, "operator ^", [y])); |
+ } |
} |
function $bit_xor(x, y) { |
- return (typeof(x) == 'number' && typeof(y) == 'number') |
- ? x ^ y : x.$bit_xor(y); |
+ if (typeof(x) == 'number' && typeof(y) == 'number') return x ^ y; |
+ return $bit_xor$complex(x, y); |
} |
function $eq(x, y) { |
if (x == null) return y == null; |
- return (typeof(x) == 'number' && typeof(y) == 'number') || |
- (typeof(x) == 'boolean' && typeof(y) == 'boolean') || |
- (typeof(x) == 'string' && typeof(y) == 'string') |
- ? x == y : x.$eq(y); |
+ return (typeof(x) != 'object') ? x === y : x.$eq(y); |
} |
// TODO(jimhug): Should this or should it not match equals? |
$defProp(Object.prototype, '$eq', function(other) { |
return this === other; |
}); |
+function $gt$complex(x, y) { |
+ if (typeof(x) == 'number') { |
+ $throw(new IllegalArgumentException(y)); |
+ } else if (typeof(x) == 'object') { |
+ return x.$gt(y); |
+ } else { |
+ $throw(new NoSuchMethodException(x, "operator >", [y])); |
+ } |
+} |
function $gt(x, y) { |
- return (typeof(x) == 'number' && typeof(y) == 'number') |
- ? x > y : x.$gt(y); |
+ if (typeof(x) == 'number' && typeof(y) == 'number') return x > y; |
+ return $gt$complex(x, y); |
+} |
+function $gte$complex(x, y) { |
+ if (typeof(x) == 'number') { |
+ $throw(new IllegalArgumentException(y)); |
+ } else if (typeof(x) == 'object') { |
+ return x.$gte(y); |
+ } else { |
+ $throw(new NoSuchMethodException(x, "operator >=", [y])); |
+ } |
} |
function $gte(x, y) { |
- return (typeof(x) == 'number' && typeof(y) == 'number') |
- ? x >= y : x.$gte(y); |
+ if (typeof(x) == 'number' && typeof(y) == 'number') return x >= y; |
+ return $gte$complex(x, y); |
+} |
+function $lt$complex(x, y) { |
+ if (typeof(x) == 'number') { |
+ $throw(new IllegalArgumentException(y)); |
+ } else if (typeof(x) == 'object') { |
+ return x.$lt(y); |
+ } else { |
+ $throw(new NoSuchMethodException(x, "operator <", [y])); |
+ } |
} |
function $lt(x, y) { |
- return (typeof(x) == 'number' && typeof(y) == 'number') |
- ? x < y : x.$lt(y); |
+ if (typeof(x) == 'number' && typeof(y) == 'number') return x < y; |
+ return $lt$complex(x, y); |
+} |
+function $lte$complex(x, y) { |
+ if (typeof(x) == 'number') { |
+ $throw(new IllegalArgumentException(y)); |
+ } else if (typeof(x) == 'object') { |
+ return x.$lte(y); |
+ } else { |
+ $throw(new NoSuchMethodException(x, "operator <=", [y])); |
+ } |
} |
function $lte(x, y) { |
- return (typeof(x) == 'number' && typeof(y) == 'number') |
- ? x <= y : x.$lte(y); |
+ if (typeof(x) == 'number' && typeof(y) == 'number') return x <= y; |
+ return $lte$complex(x, y); |
} |
function $mod(x, y) { |
- if (typeof(x) == 'number' && typeof(y) == 'number') { |
- var result = x % y; |
- if (result == 0) { |
- return 0; // Make sure we don't return -0.0. |
- } else if (result < 0) { |
- if (y < 0) { |
- return result - y; |
- } else { |
- return result + y; |
- } |
- } |
- return result; |
- } else { |
+ if (typeof(x) == 'number') { |
+ if (typeof(y) == 'number') { |
+ var result = x % y; |
+ if (result == 0) { |
+ return 0; // Make sure we don't return -0.0. |
+ } else if (result < 0) { |
+ if (y < 0) { |
+ return result - y; |
+ } else { |
+ return result + y; |
+ } |
+ } |
+ return result; |
+ } else { |
+ $throw(new IllegalArgumentException(y)); |
+ } |
+ } else if (typeof(x) == 'object') { |
return x.$mod(y); |
+ } else { |
+ $throw(new NoSuchMethodException(x, "operator %", [y])); |
+ } |
+} |
+function $mul$complex(x, y) { |
+ if (typeof(x) == 'number') { |
+ $throw(new IllegalArgumentException(y)); |
+ } else if (typeof(x) == 'object') { |
+ return x.$mul(y); |
+ } else { |
+ $throw(new NoSuchMethodException(x, "operator *", [y])); |
} |
} |
function $mul(x, y) { |
- return (typeof(x) == 'number' && typeof(y) == 'number') |
- ? x * y : x.$mul(y); |
+ if (typeof(x) == 'number' && typeof(y) == 'number') return x * y; |
+ return $mul$complex(x, y); |
} |
function $ne(x, y) { |
if (x == null) return y != null; |
- return (typeof(x) == 'number' && typeof(y) == 'number') || |
- (typeof(x) == 'boolean' && typeof(y) == 'boolean') || |
- (typeof(x) == 'string' && typeof(y) == 'string') |
- ? x != y : !x.$eq(y); |
+ return (typeof(x) != 'object') ? x !== y : !x.$eq(y); |
+} |
+function $shl$complex(x, y) { |
+ if (typeof(x) == 'number') { |
+ $throw(new IllegalArgumentException(y)); |
+ } else if (typeof(x) == 'object') { |
+ return x.$shl(y); |
+ } else { |
+ $throw(new NoSuchMethodException(x, "operator <<", [y])); |
+ } |
} |
function $shl(x, y) { |
- return (typeof(x) == 'number' && typeof(y) == 'number') |
- ? x << y : x.$shl(y); |
+ if (typeof(x) == 'number' && typeof(y) == 'number') return x << y; |
+ return $shl$complex(x, y); |
+} |
+function $sub$complex(x, y) { |
+ if (typeof(x) == 'number') { |
+ $throw(new IllegalArgumentException(y)); |
+ } else if (typeof(x) == 'object') { |
+ return x.$sub(y); |
+ } else { |
+ $throw(new NoSuchMethodException(x, "operator -", [y])); |
+ } |
} |
function $sub(x, y) { |
- return (typeof(x) == 'number' && typeof(y) == 'number') |
- ? x - y : x.$sub(y); |
+ if (typeof(x) == 'number' && typeof(y) == 'number') return x - y; |
+ return $sub$complex(x, y); |
} |
function $truncdiv(x, y) { |
- if (typeof(x) == 'number' && typeof(y) == 'number') { |
- if (y == 0) $throw(new IntegerDivisionByZeroException()); |
- var tmp = x / y; |
- return (tmp < 0) ? Math.ceil(tmp) : Math.floor(tmp); |
- } else { |
+ if (typeof(x) == 'number') { |
+ if (typeof(y) == 'number') { |
+ if (y == 0) $throw(new IntegerDivisionByZeroException()); |
+ var tmp = x / y; |
+ return (tmp < 0) ? Math.ceil(tmp) : Math.floor(tmp); |
+ } else { |
+ $throw(new IllegalArgumentException(y)); |
+ } |
+ } else if (typeof(x) == 'object') { |
return x.$truncdiv(y); |
+ } else { |
+ $throw(new NoSuchMethodException(x, "operator ~/", [y])); |
} |
} |
// ********** Code for Object ************** |
@@ -255,6 +341,7 @@ function NoSuchMethodException(_receiver, _functionName, _arguments, _existingAr |
this._functionName = _functionName; |
this._arguments = _arguments; |
} |
+NoSuchMethodException.prototype.is$NoSuchMethodException = function(){return true}; |
NoSuchMethodException.prototype.toString = function() { |
var sb = new StringBufferImpl(""); |
for (var i = (0); |
@@ -1517,7 +1604,6 @@ StringImplementation.prototype.compareTo = function(other) { |
StringImplementation.prototype.contains$1 = StringImplementation.prototype.contains; |
StringImplementation.prototype.indexOf$1 = StringImplementation.prototype.indexOf; |
StringImplementation.prototype.substring$1 = StringImplementation.prototype.substring; |
-// ********** Code for _Worker ************** |
// ********** Code for _ArgumentMismatchException ************** |
$inherits(_ArgumentMismatchException, ClosureArgumentMismatchException); |
function _ArgumentMismatchException(_message) { |
@@ -2791,46 +2877,55 @@ function CoreJs() { |
} |
CoreJs.prototype.get$writer = function() { return this.writer; }; |
CoreJs.prototype.set$writer = function(value) { return this.writer = value; }; |
+CoreJs.prototype.markCorelibTypeUsed = function(typeName) { |
+ $globals.world.gen.markTypeUsed($globals.world.corelib.types.$index(typeName)); |
+} |
CoreJs.prototype.useOperator = function(name) { |
if ($ne(this._usedOperators.$index(name))) return; |
+ if (name != ":ne" && name != ":eq") { |
+ this.markCorelibTypeUsed("NoSuchMethodException"); |
+ } |
+ if (name != ":bit_not" && name != ":negate") { |
+ this.markCorelibTypeUsed("IllegalArgumentException"); |
+ } |
var code; |
switch (name) { |
case ":ne": |
- code = "function $ne(x, y) {\n if (x == null) return y != null;\n return (typeof(x) == 'number' && typeof(y) == 'number') ||\n (typeof(x) == 'boolean' && typeof(y) == 'boolean') ||\n (typeof(x) == 'string' && typeof(y) == 'string')\n ? x != y : !x.$eq(y);\n}"; |
+ code = "function $ne(x, y) {\n if (x == null) return y != null;\n return (typeof(x) != 'object') ? x !== y : !x.$eq(y);\n}"; |
break; |
case ":eq": |
this.ensureDefProp(); |
- code = "function $eq(x, y) {\n if (x == null) return y == null;\n return (typeof(x) == 'number' && typeof(y) == 'number') ||\n (typeof(x) == 'boolean' && typeof(y) == 'boolean') ||\n (typeof(x) == 'string' && typeof(y) == 'string')\n ? x == y : x.$eq(y);\n}\n// TODO(jimhug): Should this or should it not match equals?\n$defProp(Object.prototype, '$eq', function(other) {\n return this === other;\n});"; |
+ code = "function $eq(x, y) {\n if (x == null) return y == null;\n return (typeof(x) != 'object') ? x === y : x.$eq(y);\n}\n// TODO(jimhug): Should this or should it not match equals?\n$defProp(Object.prototype, '$eq', function(other) {\n return this === other;\n});"; |
break; |
case ":bit_not": |
- code = "function $bit_not(x) {\n return (typeof(x) == 'number') ? ~x : x.$bit_not();\n}"; |
+ code = "function $bit_not(x) {\n if (typeof(x) == 'number') return ~x;\n if (typeof(x) == 'object') return x.$bit_not();\n $throw(new NoSuchMethodException(x, \"operator ~\", []));\n}"; |
break; |
case ":negate": |
- code = "function $negate(x) {\n return (typeof(x) == 'number') ? -x : x.$negate();\n}"; |
+ code = "function $negate(x) {\n if (typeof(x) == 'number') return -x;\n if (typeof(x) == 'object') return x.$negate();\n $throw(new NoSuchMethodException(x, \"operator negate\", []));\n}"; |
break; |
case ":add": |
- code = "function $add(x, y) {\n return ((typeof(x) == 'number' && typeof(y) == 'number') ||\n (typeof(x) == 'string'))\n ? x + y : x.$add(y);\n}"; |
+ code = "function $add$complex(x, y) {\n if (typeof(x) == 'number') {\n $throw(new IllegalArgumentException(y));\n } else if (typeof(x) == 'string') {\n var str = (y == null) ? 'null' : y.toString();\n if (typeof(str) != 'string') {\n throw new Error(\"calling toString() on right hand operand of operator \" +\n \"+ did not return a String\");\n }\n return x + str;\n } else if (typeof(x) == 'object') {\n return x.$add(y);\n } else {\n $throw(new NoSuchMethodException(x, \"operator +\", [y]));\n }\n}\n\nfunction $add(x, y) {\n if (typeof(x) == 'number' && typeof(y) == 'number') return x + y;\n return $add$complex(x, y);\n}"; |
break; |
case ":truncdiv": |
this.useThrow = true; |
- $globals.world.gen.markTypeUsed($globals.world.corelib.types.$index("IntegerDivisionByZeroException")); |
- code = "function $truncdiv(x, y) {\n if (typeof(x) == 'number' && typeof(y) == 'number') {\n if (y == 0) $throw(new IntegerDivisionByZeroException());\n var tmp = x / y;\n return (tmp < 0) ? Math.ceil(tmp) : Math.floor(tmp);\n } else {\n return x.$truncdiv(y);\n }\n}"; |
+ this.markCorelibTypeUsed("IntegerDivisionByZeroException"); |
+ code = "function $truncdiv(x, y) {\n if (typeof(x) == 'number') {\n if (typeof(y) == 'number') {\n if (y == 0) $throw(new IntegerDivisionByZeroException());\n var tmp = x / y;\n return (tmp < 0) ? Math.ceil(tmp) : Math.floor(tmp);\n } else {\n $throw(new IllegalArgumentException(y));\n }\n } else if (typeof(x) == 'object') {\n return x.$truncdiv(y);\n } else {\n $throw(new NoSuchMethodException(x, \"operator ~/\", [y]));\n }\n}"; |
break; |
case ":mod": |
- code = "function $mod(x, y) {\n if (typeof(x) == 'number' && typeof(y) == 'number') {\n var result = x % y;\n if (result == 0) {\n return 0; // Make sure we don't return -0.0.\n } else if (result < 0) {\n if (y < 0) {\n return result - y;\n } else {\n return result + y;\n }\n }\n return result;\n } else {\n return x.$mod(y);\n }\n}"; |
+ code = "function $mod(x, y) {\n if (typeof(x) == 'number') {\n if (typeof(y) == 'number') {\n var result = x % y;\n if (result == 0) {\n return 0; // Make sure we don't return -0.0.\n } else if (result < 0) {\n if (y < 0) {\n return result - y;\n } else {\n return result + y;\n }\n }\n return result;\n } else {\n $throw(new IllegalArgumentException(y));\n }\n } else if (typeof(x) == 'object') {\n return x.$mod(y);\n } else {\n $throw(new NoSuchMethodException(x, \"operator %\", [y]));\n }\n}"; |
break; |
default: |
@@ -2887,23 +2982,16 @@ CoreJs.prototype.generate = function(w) { |
w.writeln("function $throw(e) {\n // If e is not a value, we can use V8's captureStackTrace utility method.\n // TODO(jmesserly): capture the stack trace on other JS engines.\n if (e && (typeof e == 'object') && Error.captureStackTrace) {\n // TODO(jmesserly): this will clobber the e.stack property\n Error.captureStackTrace(e, $throw);\n }\n throw e;\n}"); |
} |
if (this.useIndex) { |
+ this.markCorelibTypeUsed("NoSuchMethodException"); |
this.ensureDefProp(); |
- w.writeln($globals.options.disableBoundsChecks ? "$defProp(Object.prototype, '$index', function(i) {\n var proto = Object.getPrototypeOf(this);\n if (proto !== Object) {\n proto.$index = function(i) { return this[i]; }\n }\n return this[i];\n});\n$defProp(Array.prototype, '$index', function(i) {\n return this[i];\n});\n$defProp(String.prototype, '$index', function(i) {\n return this[i];\n});" : "$defProp(Object.prototype, '$index', function(i) {\n var proto = Object.getPrototypeOf(this);\n if (proto !== Object) {\n proto.$index = function(i) { return this[i]; }\n }\n return this[i];\n});\n$defProp(Array.prototype, '$index', function(index) {\n var i = index | 0;\n if (i !== index) {\n throw new IllegalArgumentException('index is not int');\n } else if (i < 0 || i >= this.length) {\n throw new IndexOutOfRangeException(index);\n }\n return this[i];\n});\n$defProp(String.prototype, '$index', function(i) {\n return this[i];\n});"); |
+ w.writeln($globals.options.disableBoundsChecks ? "$defProp(Object.prototype, '$index', function(i) {\n $throw(new NoSuchMethodException(this, \"operator []\", [i]));\n});\n$defProp(Array.prototype, '$index', function(i) {\n return this[i];\n});\n$defProp(String.prototype, '$index', function(i) {\n return this[i];\n});" : "$defProp(Object.prototype, '$index', function(i) {\n $throw(new NoSuchMethodException(this, \"operator []\", [i]));\n});\n$defProp(Array.prototype, '$index', function(index) {\n var i = index | 0;\n if (i !== index) {\n throw new IllegalArgumentException('index is not int');\n } else if (i < 0 || i >= this.length) {\n throw new IndexOutOfRangeException(index);\n }\n return this[i];\n});\n$defProp(String.prototype, '$index', function(i) {\n return this[i];\n});"); |
} |
if (this.useSetIndex) { |
+ this.markCorelibTypeUsed("NoSuchMethodException"); |
this.ensureDefProp(); |
- w.writeln($globals.options.disableBoundsChecks ? "$defProp(Object.prototype, '$setindex', function(i, value) {\n var proto = Object.getPrototypeOf(this);\n if (proto !== Object) {\n proto.$setindex = function(i, value) { return this[i] = value; }\n }\n return this[i] = value;\n});\n$defProp(Array.prototype, '$setindex',\n function(i, value) { return this[i] = value; });" : "$defProp(Object.prototype, '$setindex', function(i, value) {\n var proto = Object.getPrototypeOf(this);\n if (proto !== Object) {\n proto.$setindex = function(i, value) { return this[i] = value; }\n }\n return this[i] = value;\n});\n$defProp(Array.prototype, '$setindex', function(index, value) {\n var i = index | 0;\n if (i !== index) {\n throw new IllegalArgumentException('index is not int');\n } else if (i < 0 || i >= this.length) {\n throw new IndexOutOfRangeException(index);\n }\n return this[i] = value;\n});"); |
- } |
- if (this.useIsolates) { |
- if (this.useWrap0) { |
- w.writeln("// Wrap a 0-arg dom-callback to bind it with the current isolate:\nfunction $wrap_call$0(fn) { return fn && fn.wrap$call$0(); }\nFunction.prototype.wrap$call$0 = function() {\n var isolateContext = $globalState.currentContext;\n var self = this;\n this.wrap$0 = function() {\n isolateContext.eval(self);\n $globalState.topEventLoop.run();\n };\n this.wrap$call$0 = function() { return this.wrap$0; };\n return this.wrap$0;\n}"); |
- } |
- if (this.useWrap1) { |
- w.writeln("// Wrap a 1-arg dom-callback to bind it with the current isolate:\nfunction $wrap_call$1(fn) { return fn && fn.wrap$call$1(); }\nFunction.prototype.wrap$call$1 = function() {\n var isolateContext = $globalState.currentContext;\n var self = this;\n this.wrap$1 = function(arg) {\n isolateContext.eval(function() { self(arg); });\n $globalState.topEventLoop.run();\n };\n this.wrap$call$1 = function() { return this.wrap$1; };\n return this.wrap$1;\n}"); |
- } |
- w.writeln("var $globalThis = this;\nvar $globals = null;\nvar $globalState = null;"); |
+ w.writeln($globals.options.disableBoundsChecks ? "$defProp(Object.prototype, '$setindex', function(i, value) {\n $throw(new NoSuchMethodException(this, \"operator []=\", [i, value]));\n});\n$defProp(Array.prototype, '$setindex',\n function(i, value) { return this[i] = value; });" : "$defProp(Object.prototype, '$setindex', function(i, value) {\n $throw(new NoSuchMethodException(this, \"operator []=\", [i, value]));\n});\n$defProp(Array.prototype, '$setindex', function(index, value) {\n var i = index | 0;\n if (i !== index) {\n throw new IllegalArgumentException('index is not int');\n } else if (i < 0 || i >= this.length) {\n throw new IndexOutOfRangeException(index);\n }\n return this[i] = value;\n});"); |
} |
- else { |
+ if (!this.useIsolates) { |
if (this.useWrap0) { |
w.writeln("function $wrap_call$0(fn) { return fn; }"); |
} |
@@ -3109,15 +3197,10 @@ WorldGenerator.prototype.run = function() { |
this.markTypeUsed($globals.world.corelib.types.$index("IllegalArgumentException")); |
} |
} |
- if ($globals.world.corelib.types.$index("Isolate").get$isUsed() || $globals.world.coreimpl.types.$index("ReceivePortImpl").get$isUsed()) { |
- if (this.corejs.useWrap0 || this.corejs.useWrap1) { |
- this.genMethod($globals.world.coreimpl.types.$index("IsolateContext").getMember("eval")); |
- this.genMethod($globals.world.coreimpl.types.$index("EventLoop").getMember("run")); |
- } |
+ if ($globals.world.isolatelib != null) { |
this.corejs.useIsolates = true; |
- var isolateMain = $globals.world.coreimpl.lookup("startRootIsolate", this.main.get$span()); |
- var isolateMainTarget = new TypeValue($globals.world.coreimpl.topType, this.main.get$span()); |
- mainCall = isolateMain.invoke(this.mainContext, null, isolateMainTarget, new Arguments(null, [this.main._get(this.mainContext, this.main.definition, null)])); |
+ var isolateMain = $globals.world.isolatelib.lookup("startRootIsolate", this.main.get$span()); |
+ mainCall = isolateMain.invoke(this.mainContext, null, new TypeValue($globals.world.isolatelib.topType, this.main.get$span()), new Arguments(null, [this.main._get(this.mainContext, this.main.definition, null)])); |
} |
this.writeTypes($globals.world.coreimpl); |
this.writeTypes($globals.world.corelib); |
@@ -8968,7 +9051,7 @@ Parser.prototype.isPrematureEndOfFile = function() { |
$throw(new IncompleteSourceException(this._previousToken)); |
} |
else if (this._maybeEat((1))) { |
- this._lang_error("unexpected end of file", this._peekToken.get$span()); |
+ this._error("unexpected end of file", this._peekToken.get$span()); |
return true; |
} |
else { |
@@ -9026,13 +9109,13 @@ Parser.prototype._errorExpected = function(expected) { |
if (this.throwOnIncomplete) this.isPrematureEndOfFile(); |
var tok = this._lang_next(); |
if ((tok instanceof ErrorToken) && tok.get$message() != null) { |
- this._lang_error(tok.get$message(), tok.get$span()); |
+ this._error(tok.get$message(), tok.get$span()); |
} |
else { |
- this._lang_error(("expected " + expected + ", but found " + tok), tok.get$span()); |
+ this._error(("expected " + expected + ", but found " + tok), tok.get$span()); |
} |
} |
-Parser.prototype._lang_error = function(message, location) { |
+Parser.prototype._error = function(message, location) { |
if (this._recover) return; |
if (location == null) { |
location = this._peekToken.get$span(); |
@@ -9053,7 +9136,7 @@ Parser.prototype._skipBlock = function() { |
if (depth == (0)) return; |
} |
else if (tok.get$kind() == (1)) { |
- this._lang_error("unexpected end of file during diet parse", tok.get$span()); |
+ this._error("unexpected end of file during diet parse", tok.get$span()); |
return; |
} |
} |
@@ -9200,7 +9283,7 @@ Parser.prototype.functionBody = function(inExpression) { |
return null; |
} |
} |
- this._lang_error("Expected function body (neither { nor => found)"); |
+ this._error("Expected function body (neither { nor => found)"); |
} |
Parser.prototype.finishField = function(start, modifiers, type, name, value) { |
var names = [name]; |
@@ -9287,7 +9370,7 @@ Parser.prototype.factoryConstructorDeclaration = function() { |
} |
} |
if (names.get$length() > (1)) { |
- this._lang_error("unsupported qualified name for factory", names.$index((0)).get$span()); |
+ this._error("unsupported qualified name for factory", names.$index((0)).get$span()); |
} |
type = new NameTypeReference(false, names.$index((0)), null, names.$index((0)).get$span()); |
var di = new DeclaredIdentifier(type, name, this._makeSpan(start)); |
@@ -9566,7 +9649,7 @@ Parser.prototype.caseNode = function() { |
} |
} |
if (cases.get$length() == (0)) { |
- this._lang_error("case or default"); |
+ this._error("case or default"); |
} |
var stmts = []; |
while (!this._peekCaseEnd()) { |
@@ -9651,7 +9734,7 @@ Parser.prototype._makeType = function(expr) { |
return type; |
} |
else { |
- this._lang_error("expected type reference"); |
+ this._error("expected type reference"); |
return null; |
} |
} |
@@ -9829,7 +9912,7 @@ Parser.prototype.finishCallOrLambdaExpression = function(expr) { |
} |
else { |
if ((expr instanceof DeclaredIdentifier)) { |
- this._lang_error("illegal target for call, did you mean to declare a function?", expr.get$span()); |
+ this._error("illegal target for call, did you mean to declare a function?", expr.get$span()); |
} |
var args = this.arguments(); |
return this.finishPostfixExpression(new CallExpression(expr, args, this._makeSpan(expr.get$span().start))); |
@@ -10055,7 +10138,7 @@ Parser.prototype._specialIdentifier = function(includeOperators) { |
case (15): |
this._eat((15)); |
- this._lang_error("rest no longer supported", this._previousToken.get$span()); |
+ this._error("rest no longer supported", this._previousToken.get$span()); |
name = this.identifier().get$name(); |
break; |
@@ -10364,12 +10447,12 @@ Parser.prototype.formalParameter = function(inOptionalBlock) { |
var type = di.get$type(); |
var name = di.get$name(); |
if ($eq(name)) { |
- this._lang_error("Formal parameter invalid", this._makeSpan(start)); |
+ this._error("Formal parameter invalid", this._makeSpan(start)); |
} |
var value = null; |
if (this._maybeEat((20))) { |
if (!inOptionalBlock) { |
- this._lang_error("default values only allowed inside [optional] section"); |
+ this._error("default values only allowed inside [optional] section"); |
} |
value = this.expression(); |
} |
@@ -10395,7 +10478,7 @@ Parser.prototype.formalParameterList = function() { |
while (this._maybeEat((11))) { |
if (this._maybeEat((4))) { |
if (inOptionalBlock) { |
- this._lang_error("already inside an optional block", this._previousToken.get$span()); |
+ this._error("already inside an optional block", this._previousToken.get$span()); |
} |
inOptionalBlock = true; |
} |
@@ -10412,17 +10495,17 @@ Parser.prototype.identifierForType = function() { |
var $0; |
var tok = this._lang_next(); |
if (!this._isIdentifier(tok.get$kind())) { |
- this._lang_error(("expected identifier, but found " + tok), tok.get$span()); |
+ this._error(("expected identifier, but found " + tok), tok.get$span()); |
} |
if ((($0 = tok.get$kind()) == null ? null != ((70)) : $0 !== (70)) && tok.get$kind() != (80)) { |
- this._lang_error(("" + tok + " may not be used as a type name"), tok.get$span()); |
+ this._error(("" + tok + " may not be used as a type name"), tok.get$span()); |
} |
return new Identifier(tok.get$text(), this._makeSpan(tok.get$start())); |
} |
Parser.prototype.identifier = function() { |
var tok = this._lang_next(); |
if (!this._isIdentifier(tok.get$kind())) { |
- this._lang_error(("expected identifier, but found " + tok), tok.get$span()); |
+ this._error(("expected identifier, but found " + tok), tok.get$span()); |
} |
return new Identifier(tok.get$text(), this._makeSpan(tok.get$start())); |
} |
@@ -10436,11 +10519,11 @@ Parser.prototype._makeFunction = function(expr, formals, body) { |
name = expr.get$name(); |
type = expr.get$type(); |
if ($eq(name)) { |
- this._lang_error("expected name and type", expr.get$span()); |
+ this._error("expected name and type", expr.get$span()); |
} |
} |
else { |
- this._lang_error("bad function body", expr.get$span()); |
+ this._error("bad function body", expr.get$span()); |
} |
var span = new SourceSpan(expr.get$span().file, expr.get$span().start, body.get$span().end); |
var func = new FunctionDefinition(null, type, name, formals, null, null, body, span); |
@@ -10454,7 +10537,7 @@ Parser.prototype._makeDeclaredIdentifier = function(e) { |
return e; |
} |
else { |
- this._lang_error("expected declared identifier"); |
+ this._error("expected declared identifier"); |
return new DeclaredIdentifier(null, null, e.get$span()); |
} |
} |
@@ -13959,6 +14042,9 @@ World.prototype.getOrAddLibrary = function(filename) { |
if (filename == "dart:dom") { |
this.dom = library; |
} |
+ else if (filename == "dart:isolate") { |
+ this.isolatelib = library; |
+ } |
} |
return library; |
} |
@@ -14274,10 +14360,10 @@ function FrogOptions(homedir, args, files) { |
// ********** Code for LibraryReader ************** |
function LibraryReader() { |
if ($eq($globals.options.config, "dev")) { |
- this._specialLibs = _map(["dart:core", joinPaths($globals.options.libDir, "corelib.dart"), "dart:coreimpl", joinPaths($globals.options.libDir, "corelib_impl.dart"), "dart:html", joinPaths($globals.options.libDir, "../../client/html/release/html.dart"), "dart:htmlimpl", joinPaths($globals.options.libDir, "../../client/html/release/htmlimpl.dart"), "dart:dom", joinPaths($globals.options.libDir, "../../client/dom/frog/dom_frog.dart"), "dart:json", joinPaths($globals.options.libDir, "../../lib/json/json_frog.dart")]); |
+ this._specialLibs = _map(["dart:core", joinPaths($globals.options.libDir, "corelib.dart"), "dart:coreimpl", joinPaths($globals.options.libDir, "corelib_impl.dart"), "dart:html", joinPaths($globals.options.libDir, "../../client/html/release/html.dart"), "dart:htmlimpl", joinPaths($globals.options.libDir, "../../client/html/release/htmlimpl.dart"), "dart:dom", joinPaths($globals.options.libDir, "../../client/dom/frog/dom_frog.dart"), "dart:json", joinPaths($globals.options.libDir, "../../lib/json/json_frog.dart"), "dart:isolate", joinPaths($globals.options.libDir, "../../lib/isolate/isolate_frog.dart")]); |
} |
else if ($eq($globals.options.config, "sdk")) { |
- this._specialLibs = _map(["dart:core", joinPaths($globals.options.libDir, "core/core_frog.dart"), "dart:coreimpl", joinPaths($globals.options.libDir, "coreimpl/coreimpl_frog.dart"), "dart:html", joinPaths($globals.options.libDir, "html/html.dart"), "dart:htmlimpl", joinPaths($globals.options.libDir, "htmlimpl/htmlimpl.dart"), "dart:dom", joinPaths($globals.options.libDir, "dom/frog/dom_frog.dart"), "dart:json", joinPaths($globals.options.libDir, "json/json_frog.dart")]); |
+ this._specialLibs = _map(["dart:core", joinPaths($globals.options.libDir, "core/core_frog.dart"), "dart:coreimpl", joinPaths($globals.options.libDir, "coreimpl/coreimpl_frog.dart"), "dart:html", joinPaths($globals.options.libDir, "html/html.dart"), "dart:htmlimpl", joinPaths($globals.options.libDir, "htmlimpl/htmlimpl.dart"), "dart:dom", joinPaths($globals.options.libDir, "dom/frog/dom_frog.dart"), "dart:json", joinPaths($globals.options.libDir, "json/json_frog.dart"), "dart:isolate", joinPaths($globals.options.libDir, "isolate/isolate_frog.dart")]); |
} |
else { |
$globals.world.error(("Invalid configuration " + $globals.options.config)); |
@@ -14465,7 +14551,7 @@ VarMethodSet.prototype.generate = function(code) { |
} |
// ********** Code for top level ************** |
function _otherOperator(jsname, op) { |
- return ("function " + jsname + "(x, y) {\n return (typeof(x) == 'number' && typeof(y) == 'number')\n ? x " + op + " y : x." + jsname + "(y);\n}"); |
+ return ("function " + jsname + "$complex(x, y) {\n if (typeof(x) == 'number') {\n $throw(new IllegalArgumentException(y));\n } else if (typeof(x) == 'object') {\n return x." + jsname + "(y);\n } else {\n $throw(new NoSuchMethodException(x, \"operator " + op + "\", [y]));\n }\n}\nfunction " + jsname + "(x, y) {\n if (typeof(x) == 'number' && typeof(y) == 'number') return x " + op + " y;\n return " + jsname + "$complex(x, y);\n}"); |
} |
function map(source, mapper) { |
var result = new Array(); |