diff --git a/lib/nodes.js b/lib/nodes.js index b48b9904..b7f2ed33 100644 --- a/lib/nodes.js +++ b/lib/nodes.js @@ -11,11 +11,11 @@ (from < 0 ? from + array.length : from || 0), (to < 0 ? to + array.length : to || array.length) + (exclusive ? 0 : 1) ]; - }, __bind = function(func, obj, args) { + }, __slice = Array.prototype.slice, __bind = function(func, obj, args) { return function() { return func.apply(obj || {}, args ? args.concat(__slice.call(arguments, 0)) : arguments); }; - }, __slice = Array.prototype.slice; + }; // `nodes.coffee` contains all of the node classes for the syntax tree. Most // nodes are created as the result of actions in the [grammar](grammar.html), // but some are created by other nodes as a method of code generation. To convert @@ -596,6 +596,7 @@ }; CurryNode.prototype.compile_node = function compile_node(o) { var ref; + o.scope.utility('slice'); ref = new ValueNode(literal(o.scope.utility('bind'))); return (new CallNode(ref, [this.meth, this.context, literal(this.arguments(o))])).compile(o); }; @@ -1083,6 +1084,7 @@ if (!(this.bound)) { return func; } + o.scope.utility('slice'); ref = new ValueNode(literal(o.scope.utility('bind'))); return (new CallNode(ref, [literal(func), literal('this')])).compile(o); }; diff --git a/lib/rewriter.js b/lib/rewriter.js index 2289062b..f44994d6 100644 --- a/lib/rewriter.js +++ b/lib/rewriter.js @@ -1,10 +1,10 @@ (function(){ var BALANCED_PAIRS, EXPRESSION_CLOSE, EXPRESSION_END, EXPRESSION_START, IMPLICIT_BLOCK, IMPLICIT_CALL, IMPLICIT_END, IMPLICIT_FUNC, INVERSES, Rewriter, SINGLE_CLOSERS, SINGLE_LINERS, _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k, helpers, include, pair; - var __bind = function(func, obj, args) { + var __slice = Array.prototype.slice, __bind = function(func, obj, args) { return function() { return func.apply(obj || {}, args ? args.concat(__slice.call(arguments, 0)) : arguments); }; - }, __slice = Array.prototype.slice, __hasProp = Object.prototype.hasOwnProperty; + }, __hasProp = Object.prototype.hasOwnProperty; // The CoffeeScript language has a good deal of optional syntax, implicit syntax, // and shorthand syntax. This can greatly complicate a grammar and bloat // the resulting parse table. Instead of making the parser handle it all, we take diff --git a/lib/scope.js b/lib/scope.js index 54d11266..36249022 100644 --- a/lib/scope.js +++ b/lib/scope.js @@ -94,18 +94,13 @@ // Ensure the CoffeeScript utility object is included in the top level // then return a CallNode curried constructor bound to the utility function Scope.prototype.utility = function utility(name) { - var _a, _b, _c, _d, dep; + var _a; if (this.parent) { return Scope.root.utility(name); } - if ((typeof (_d = utilities.functions[name]) !== "undefined" && _d !== null)) { + if ((typeof (_a = utilities[name]) !== "undefined" && _a !== null)) { this.utilities = this.utilities || {}; - this.utilities[name] = utilities.functions[name]; - _b = (utilities.dependencies[name] || []); - for (_a = 0, _c = _b.length; _a < _c; _a++) { - dep = _b[_a]; - !this.utilities[dep] ? this.utility(dep) : null; - } + this.utilities[name] = utilities[name]; } return "__" + name; }; @@ -115,7 +110,7 @@ var _a, _b, key; _a = []; _b = this.utilities; for (key in _b) { if (__hasProp.call(_b, key)) { - _a.push("__" + key + " = " + (utilities.functions[key])); + _a.push("__" + key + " = " + (utilities[key])); }} return _a; }; diff --git a/lib/utilities.js b/lib/utilities.js index 116fccf5..dacb61d9 100644 --- a/lib/utilities.js +++ b/lib/utilities.js @@ -3,15 +3,10 @@ this.exports = this; } exports.utilities = { - dependencies: { - bind: ['slice'] - }, - functions: { - extend: "function(child, parent) {\n var ctor = function(){ };\n ctor.prototype = parent.prototype;\n child.__superClass__ = parent.prototype;\n child.prototype = new ctor();\n child.prototype.constructor = child;\n }", - bind: "function(func, obj, args) {\n return function() {\n return func.apply(obj || {}, args ? args.concat(__slice.call(arguments, 0)) : arguments);\n };\n }", - range: "function(array, from, to, exclusive) {\n return [\n (from < 0 ? from + array.length : from || 0),\n (to < 0 ? to + array.length : to || array.length) + (exclusive ? 0 : 1)\n ];\n }", - hasProp: 'Object.prototype.hasOwnProperty', - slice: 'Array.prototype.slice' - } + extend: "function(child, parent) {\n var ctor = function(){ };\n ctor.prototype = parent.prototype;\n child.__superClass__ = parent.prototype;\n child.prototype = new ctor();\n child.prototype.constructor = child;\n }", + bind: "function(func, obj, args) {\n return function() {\n return func.apply(obj || {}, args ? args.concat(__slice.call(arguments, 0)) : arguments);\n };\n }", + range: "function(array, from, to, exclusive) {\n return [\n (from < 0 ? from + array.length : from || 0),\n (to < 0 ? to + array.length : to || array.length) + (exclusive ? 0 : 1)\n ];\n }", + hasProp: 'Object.prototype.hasOwnProperty', + slice: 'Array.prototype.slice' }; })(); diff --git a/src/nodes.coffee b/src/nodes.coffee index ca71aa1f..99b6be3f 100644 --- a/src/nodes.coffee +++ b/src/nodes.coffee @@ -430,6 +430,7 @@ exports.CurryNode: class CurryNode extends CallNode (new ArrayNode(@args)).compile o compile_node: (o) -> + o.scope.utility('slice') ref: new ValueNode literal(o.scope.utility('bind')) (new CallNode(ref, [@meth, @context, literal(@arguments(o))])).compile o @@ -801,6 +802,7 @@ exports.CodeNode: class CodeNode extends BaseNode func: "function${ if @bound then '' else name_part }(${ params.join(', ') }) {$code${@idt(if @bound then 1 else 0)}}" func: "($func)" if top and not @bound return func unless @bound + o.scope.utility('slice') ref: new ValueNode literal(o.scope.utility('bind')) (new CallNode ref, [literal(func), literal('this')]).compile o diff --git a/src/scope.coffee b/src/scope.coffee index 0c014399..d9301da4 100644 --- a/src/scope.coffee +++ b/src/scope.coffee @@ -69,16 +69,15 @@ exports.Scope: class Scope # then return a CallNode curried constructor bound to the utility function utility: (name) -> return Scope.root.utility(name) if @parent - if utilities.functions[name]? + if utilities[name]? @utilities: or {} - @utilities[name]: utilities.functions[name] - @utility(dep) for dep in (utilities.dependencies[name] or []) when not @utilities[dep] + @utilities[name]: utilities[name] "__$name" # Formats an javascript object containing the utility methods required # in the scope included_utilities: -> - "__$key = ${utilities.functions[key]}" for key of @utilities + "__$key = ${utilities[key]}" for key of @utilities # Does this scope reference any variables that need to be declared in the # given function body? diff --git a/src/utilities.coffee b/src/utilities.coffee index 7f8b1d27..abd68d6a 100644 --- a/src/utilities.coffee +++ b/src/utilities.coffee @@ -2,42 +2,35 @@ this.exports: this unless process? exports.utilities: { - dependencies: { - bind: ['slice'] - } + extend: """ + function(child, parent) { + var ctor = function(){ }; + ctor.prototype = parent.prototype; + child.__superClass__ = parent.prototype; + child.prototype = new ctor(); + child.prototype.constructor = child; + } + """ - functions: { + bind: """ + function(func, obj, args) { + return function() { + return func.apply(obj || {}, args ? args.concat(__slice.call(arguments, 0)) : arguments); + }; + } + """ - extend: """ - function(child, parent) { - var ctor = function(){ }; - ctor.prototype = parent.prototype; - child.__superClass__ = parent.prototype; - child.prototype = new ctor(); - child.prototype.constructor = child; - } - """ + range: """ + function(array, from, to, exclusive) { + return [ + (from < 0 ? from + array.length : from || 0), + (to < 0 ? to + array.length : to || array.length) + (exclusive ? 0 : 1) + ]; + } + """ - bind: """ - function(func, obj, args) { - return function() { - return func.apply(obj || {}, args ? args.concat(__slice.call(arguments, 0)) : arguments); - }; - } - """ + hasProp: 'Object.prototype.hasOwnProperty' - range: """ - function(array, from, to, exclusive) { - return [ - (from < 0 ? from + array.length : from || 0), - (to < 0 ? to + array.length : to || array.length) + (exclusive ? 0 : 1) - ]; - } - """ - - hasProp: 'Object.prototype.hasOwnProperty' - - slice: 'Array.prototype.slice' - } + slice: 'Array.prototype.slice' } \ No newline at end of file