| OLD | NEW |
| 1 #!/usr/bin/env node | 1 #!/usr/bin/env node |
| 2 // ********** Library dart:core ************** | 2 // ********** Library dart:core ************** |
| 3 // ********** Natives dart:core ************** | 3 // ********** Natives dart:core ************** |
| 4 /** | 4 /** |
| 5 * Generates a dynamic call stub for a function. | 5 * Generates a dynamic call stub for a function. |
| 6 * Our goal is to create a stub method like this on-the-fly: | 6 * Our goal is to create a stub method like this on-the-fly: |
| 7 * function($0, $1, capture) { this($0, $1, true, capture); } | 7 * function($0, $1, capture) { this($0, $1, true, capture); } |
| 8 * | 8 * |
| 9 * This stub then replaces the dynamic one on Function, with one that is | 9 * This stub then replaces the dynamic one on Function, with one that is |
| 10 * specialized for that particular function, taking into account its default | 10 * specialized for that particular function, taking into account its default |
| (...skipping 11817 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 11828 var op = TokenKind.rawOperatorFromMethod(name); | 11828 var op = TokenKind.rawOperatorFromMethod(name); |
| 11829 code = ("function " + name + "(x, y) {\n return (typeof(x) == 'number' &&
typeof(y) == 'number')\n ? x " + op + " y : x." + name + "(y);\n}"); | 11829 code = ("function " + name + "(x, y) {\n return (typeof(x) == 'number' &&
typeof(y) == 'number')\n ? x " + op + " y : x." + name + "(y);\n}"); |
| 11830 break; | 11830 break; |
| 11831 | 11831 |
| 11832 } | 11832 } |
| 11833 this._usedOperators.$setindex(name, code); | 11833 this._usedOperators.$setindex(name, code); |
| 11834 } | 11834 } |
| 11835 CoreJs.prototype.generate = function(w) { | 11835 CoreJs.prototype.generate = function(w) { |
| 11836 if ($notnull_bool(this.useVarMethod)) { | 11836 if ($notnull_bool(this.useVarMethod)) { |
| 11837 this.useTypeNameOf = true; | 11837 this.useTypeNameOf = true; |
| 11838 w.writeln("function $varMethod(name, methods) {\n Object.prototype[name] =
function() {\n $patchMethod(this, name, methods);\n this[name].apply(this,
Array.prototype.slice.call(arguments));\n };\n}\nfunction $patchMethod(obj, na
me, methods) {\n // Get the prototype to patch.\n // Don't overwrite an existi
ng stub, like the one on Object.prototype\n var proto = Object.getPrototypeOf(o
bj);\n if (!proto || proto.hasOwnProperty(name)) proto = obj;\n var method;\n
while (obj && !(method = methods[obj.$typeNameOf()])) {\n obj = Object.getPr
ototypeOf(obj);\n }\n obj[name] = method || methods['Object'];\n}"); | 11838 w.writeln("function $varMethod(name, methods) {\n Object.prototype[name] =
function() {\n $patchMethod(this, name, methods);\n return this[name].appl
y(this, Array.prototype.slice.call(arguments));\n };\n}\nfunction $patchMethod(
obj, name, methods) {\n // Get the prototype to patch.\n // Don't overwrite an
existing stub, like the one on Object.prototype\n var proto = Object.getProtot
ypeOf(obj);\n if (!proto || proto.hasOwnProperty(name)) proto = obj;\n var met
hod;\n while (obj && !(method = methods[obj.$typeNameOf()])) {\n obj = Objec
t.getPrototypeOf(obj);\n }\n obj[name] = method || methods['Object'];\n}"); |
| 11839 } | 11839 } |
| 11840 if ($notnull_bool(this.useGenStub)) { | 11840 if ($notnull_bool(this.useGenStub)) { |
| 11841 this.useThrow = true; | 11841 this.useThrow = true; |
| 11842 w.writeln("/**\n * Generates a dynamic call stub for a function.\n * Our goa
l is to create a stub method like this on-the-fly:\n * function($0, $1, captur
e) { this($0, $1, true, capture); }\n *\n * This stub then replaces the dynamic
one on Function, with one that is\n * specialized for that particular function,
taking into account its default\n * arguments.\n */\nFunction.prototype.$genStub
= function(argsLength, names) {\n // TODO(jmesserly): only emit $genStub if ac
tually needed\n\n // Fast path: if no named arguments and arg count matches\n
if (this.length == argsLength && !names) {\n return this;\n }\n\n function
$throwArgMismatch() {\n // TODO(jmesserly): better error message\n $throw(
new ClosureArgumentMismatchException());\n }\n\n var paramsNamed = this.$optio
nal ? (this.$optional.length / 2) : 0;\n var paramsBare = this.length - paramsN
amed;\n var argsNamed = names ? names.length : 0;\n var argsBare = argsLength
- argsNamed;\n\n // Check we got the right number of arguments\n if (argsBare
< paramsBare || argsLength > this.length ||\n argsNamed > paramsNamed) {\n
return $throwArgMismatch;\n }\n\n // First, fill in all of the default valu
es\n var p = new Array(paramsBare);\n if (paramsNamed) {\n p = p.concat(thi
s.$optional.slice(paramsNamed));\n }\n // Fill in positional args\n var a = n
ew Array(argsLength);\n for (var i = 0; i < argsBare; i++) {\n p[i] = a[i] =
'$' + i;\n }\n // Then overwrite with supplied values for optional args\n va
r lastParameterIndex;\n var namesInOrder = true;\n for (var i = 0; i < argsNam
ed; i++) {\n var name = names[i];\n a[i + argsBare] = name;\n var j = t
his.$optional.indexOf(name, 0);\n if (j < 0 || j >= paramsNamed) {\n ret
urn $throwArgMismatch;\n } else if (lastParameterIndex && lastParameterIndex
> j) {\n namesInOrder = false;\n }\n p[j + paramsBare] = name;\n l
astParameterIndex = j;\n }\n\n if (this.length == argsLength && namesInOrder)
{\n // Fast path #2: named arguments, but they're in order.\n return this;
\n }\n\n // Note: using Function instead of 'eval' to get a clean scope.\n //
TODO(jmesserly): evaluate the performance of these stubs.\n var f = 'function(
' + a.join(',') + '){return $f(' + p.join(',') + ');}';\n return new Function('
$f', 'return ' + f + '').call(null, this);\n}"); | 11842 w.writeln("/**\n * Generates a dynamic call stub for a function.\n * Our goa
l is to create a stub method like this on-the-fly:\n * function($0, $1, captur
e) { this($0, $1, true, capture); }\n *\n * This stub then replaces the dynamic
one on Function, with one that is\n * specialized for that particular function,
taking into account its default\n * arguments.\n */\nFunction.prototype.$genStub
= function(argsLength, names) {\n // TODO(jmesserly): only emit $genStub if ac
tually needed\n\n // Fast path: if no named arguments and arg count matches\n
if (this.length == argsLength && !names) {\n return this;\n }\n\n function
$throwArgMismatch() {\n // TODO(jmesserly): better error message\n $throw(
new ClosureArgumentMismatchException());\n }\n\n var paramsNamed = this.$optio
nal ? (this.$optional.length / 2) : 0;\n var paramsBare = this.length - paramsN
amed;\n var argsNamed = names ? names.length : 0;\n var argsBare = argsLength
- argsNamed;\n\n // Check we got the right number of arguments\n if (argsBare
< paramsBare || argsLength > this.length ||\n argsNamed > paramsNamed) {\n
return $throwArgMismatch;\n }\n\n // First, fill in all of the default valu
es\n var p = new Array(paramsBare);\n if (paramsNamed) {\n p = p.concat(thi
s.$optional.slice(paramsNamed));\n }\n // Fill in positional args\n var a = n
ew Array(argsLength);\n for (var i = 0; i < argsBare; i++) {\n p[i] = a[i] =
'$' + i;\n }\n // Then overwrite with supplied values for optional args\n va
r lastParameterIndex;\n var namesInOrder = true;\n for (var i = 0; i < argsNam
ed; i++) {\n var name = names[i];\n a[i + argsBare] = name;\n var j = t
his.$optional.indexOf(name, 0);\n if (j < 0 || j >= paramsNamed) {\n ret
urn $throwArgMismatch;\n } else if (lastParameterIndex && lastParameterIndex
> j) {\n namesInOrder = false;\n }\n p[j + paramsBare] = name;\n l
astParameterIndex = j;\n }\n\n if (this.length == argsLength && namesInOrder)
{\n // Fast path #2: named arguments, but they're in order.\n return this;
\n }\n\n // Note: using Function instead of 'eval' to get a clean scope.\n //
TODO(jmesserly): evaluate the performance of these stubs.\n var f = 'function(
' + a.join(',') + '){return $f(' + p.join(',') + ');}';\n return new Function('
$f', 'return ' + f + '').call(null, this);\n}"); |
| 11843 } | 11843 } |
| 11844 if ($notnull_bool(this.useStackTraceOf)) { | 11844 if ($notnull_bool(this.useStackTraceOf)) { |
| 11845 w.writeln("function $stackTraceOf(e) {\n // TODO(jmesserly): we shouldn't b
e relying on the e.stack property.\n // Need to mangle it.\n return e.stack ?
e.stack : null;\n}"); | 11845 w.writeln("function $stackTraceOf(e) {\n // TODO(jmesserly): we shouldn't b
e relying on the e.stack property.\n // Need to mangle it.\n return e.stack ?
e.stack : null;\n}"); |
| 11846 } | 11846 } |
| 11847 if ($notnull_bool(this.useToDartException)) { | 11847 if ($notnull_bool(this.useToDartException)) { |
| 11848 w.writeln("// Translate a JavaScript exception to a Dart exception\n// TODO(
jmesserly): cross browser support. This is Chrome specific.\nfunction $toDartExc
eption(e) {\n var res = e;\n if (e instanceof TypeError) {\n switch(e.type)
{\n case 'property_not_function':\n case 'called_non_callable':\n
if (e.arguments[0] == null) {\n res = new NullPointerException();\n
} else {\n res = new ObjectNotClosureException();\n }\n
break;\n case 'non_object_property_call':\n case 'non_object_pr
operty_load':\n res = new NullPointerException();\n break;\n
case 'undefined_method':\n if (e.arguments[0] == 'call' || e.arguments[0]
== 'apply') {\n res = new ObjectNotClosureException();\n } else
{\n // TODO(jmesserly): can this ever happen?\n res = new NoS
uchMethodException('', e.arguments[0], []);\n }\n break;\n }\n
} else if (e instanceof RangeError) {\n if (e.message.indexOf('call stack')
>= 0) {\n res = new StackOverflowException();\n }\n }\n // TODO(jmesse
rly): setting the stack property is not a long term solution.\n // Also it caus
es the exception to print as if it were a TypeError or\n // RangeError, instead
of using the proper toString.\n res.stack = e.stack;\n return res;\n}"); | 11848 w.writeln("// Translate a JavaScript exception to a Dart exception\n// TODO(
jmesserly): cross browser support. This is Chrome specific.\nfunction $toDartExc
eption(e) {\n var res = e;\n if (e instanceof TypeError) {\n switch(e.type)
{\n case 'property_not_function':\n case 'called_non_callable':\n
if (e.arguments[0] == null) {\n res = new NullPointerException();\n
} else {\n res = new ObjectNotClosureException();\n }\n
break;\n case 'non_object_property_call':\n case 'non_object_pr
operty_load':\n res = new NullPointerException();\n break;\n
case 'undefined_method':\n if (e.arguments[0] == 'call' || e.arguments[0]
== 'apply') {\n res = new ObjectNotClosureException();\n } else
{\n // TODO(jmesserly): can this ever happen?\n res = new NoS
uchMethodException('', e.arguments[0], []);\n }\n break;\n }\n
} else if (e instanceof RangeError) {\n if (e.message.indexOf('call stack')
>= 0) {\n res = new StackOverflowException();\n }\n }\n // TODO(jmesse
rly): setting the stack property is not a long term solution.\n // Also it caus
es the exception to print as if it were a TypeError or\n // RangeError, instead
of using the proper toString.\n res.stack = e.stack;\n return res;\n}"); |
| (...skipping 10928 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 22777 INTERFACE, | 22777 INTERFACE, |
| 22778 LIBRARY, | 22778 LIBRARY, |
| 22779 NATIVE, | 22779 NATIVE, |
| 22780 NEGATE, | 22780 NEGATE, |
| 22781 OPERATOR, | 22781 OPERATOR, |
| 22782 SET, | 22782 SET, |
| 22783 SOURCE, | 22783 SOURCE, |
| 22784 STATIC, | 22784 STATIC, |
| 22785 TYPEDEF ]*/; | 22785 TYPEDEF ]*/; |
| 22786 RunEntry(function () {main();}, []); | 22786 RunEntry(function () {main();}, []); |
| OLD | NEW |