+31
-25
@@ -17,3 +17,3 @@ (function() { | ||
| /* | ||
| * Scopejs v0.8.0 | ||
| * Scopejs v0.9.0 | ||
| * http://scopejs.org | ||
@@ -52,2 +52,5 @@ * | ||
| EVAL_LITERAL = "(function(__expr){return eval(__expr)})"; | ||
| Scope.prototype.literal = function() { | ||
| return EVAL_LITERAL; | ||
| }; | ||
| Scope.eval = (1, eval)(EVAL_LITERAL); | ||
@@ -62,3 +65,3 @@ Scope.literalize = literalize = function(x) { | ||
| } else { | ||
| return x.literalize(); | ||
| return x.literal(); | ||
| } | ||
@@ -127,3 +130,3 @@ }; | ||
| function Scope(options) { | ||
| var C, exports, k, literals, n, name, names, val, varTypes, x, _base, _i, _j, _k, _l, _len, _len2, _len3, _len4, _len5, _len6, _m, _n, _ref, _ref2; | ||
| var C, exports, k, n, name, names, varTypes, x, _base, _i, _j, _k, _l, _len, _len2, _len3, _len4, _len5, _len6, _m, _n, _ref, _ref2, _ref3; | ||
| this.options = options != null ? options : {}; | ||
@@ -137,3 +140,3 @@ varTypes = ['locals', 'literals']; | ||
| } | ||
| this.options.locals.__scope = this; | ||
| this.options.locals.__this = this; | ||
| this.parent = this.options.parent; | ||
@@ -154,18 +157,9 @@ names = []; | ||
| this.names = names.concat(((_ref2 = this.parent) != null ? _ref2.names : void 0) || []); | ||
| this._eval = this.parent == null ? Scope.eval : (literals = ((function() { | ||
| var _ref3, _results; | ||
| _ref3 = this.options.literals; | ||
| _results = []; | ||
| for (name in _ref3) { | ||
| val = _ref3[name]; | ||
| _results.push("var " + name + " = " + (literalize(val)) + ";\n"); | ||
| } | ||
| return _results; | ||
| }).call(this)).join(''), this.parent.eval(this.options, literals + EVAL_LITERAL)); | ||
| this._eval = ((_ref3 = this.parent) != null ? _ref3.eval(this.options, this) : void 0) || Scope.eval; | ||
| exports = (function() { | ||
| var _l, _len4, _ref3, _results; | ||
| _ref3 = this.names; | ||
| var _l, _len4, _ref4, _results; | ||
| _ref4 = this.names; | ||
| _results = []; | ||
| for (_l = 0, _len4 = _ref3.length; _l < _len4; _l++) { | ||
| x = _ref3[_l]; | ||
| for (_l = 0, _len4 = _ref4.length; _l < _len4; _l++) { | ||
| x = _ref4[_l]; | ||
| if (!x.match(/^_/)) { | ||
@@ -197,16 +191,28 @@ _results.push(x); | ||
| } | ||
| Scope.prototype.eval = function(ctx, expr) { | ||
| var locals, name, _ref; | ||
| Scope.prototype.context = null; | ||
| Scope.prototype.eval = function(context, expr) { | ||
| var literals, locals, name, val, _ref; | ||
| this.context = context; | ||
| if (!expr) { | ||
| _ref = [{}, ctx], ctx = _ref[0], expr = _ref[1]; | ||
| _ref = [{}, this.context], this.context = _ref[0], expr = _ref[1]; | ||
| } | ||
| locals = ctx.locals ? ((function() { | ||
| locals = this.context.locals ? ((function() { | ||
| var _results; | ||
| _results = []; | ||
| for (name in ctx.locals) { | ||
| for (name in this.context.locals) { | ||
| _results.push("var " + name + " = this.locals." + name + ";\n"); | ||
| } | ||
| return _results; | ||
| })()).join('') : ""; | ||
| return this._eval.call(ctx, locals + literalize(expr)); | ||
| }).call(this)).join('') : ""; | ||
| literals = this.context.literals ? ((function() { | ||
| var _ref2, _results; | ||
| _ref2 = this.context.literals; | ||
| _results = []; | ||
| for (name in _ref2) { | ||
| val = _ref2[name]; | ||
| _results.push("var " + name + " = " + (literalize(val)) + ";\n"); | ||
| } | ||
| return _results; | ||
| }).call(this)).join('') : ""; | ||
| return this._eval.call(this.context, locals + literals + literalize(expr)); | ||
| }; | ||
@@ -213,0 +219,0 @@ Scope.prototype.run = function(ctx, fn) { |
| <!DOCTYPE html> <html> <head> <title>scope.coffee</title> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <link rel="stylesheet" media="all" href="docco.css" /> </head> <body> <div id="container"> <div id="background"></div> <table cellpadding="0" cellspacing="0"> <thead> <tr> <th class="docs"> <h1> scope.coffee </h1> </th> <th class="code"> </th> </tr> </thead> <tbody> <tr id="section-1"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-1">¶</a> </div> <p>File header.</p> | ||
| <h1>#</h1> </td> <td class="code"> <div class="highlight"><pre> <span class="o">*</span> <span class="nx">Scopejs</span> <span class="nx">v0</span><span class="p">.</span><span class="mf">8.0</span> | ||
| <h1>#</h1> </td> <td class="code"> <div class="highlight"><pre> <span class="o">*</span> <span class="nx">Scopejs</span> <span class="nx">v0</span><span class="p">.</span><span class="mf">9.0</span> | ||
| <span class="o">*</span> <span class="nx">http</span><span class="o">:</span><span class="err">//scopejs.org</span> | ||
@@ -12,3 +12,4 @@ <span class="o">*</span> | ||
| <p>This class represents a lexical scope.</p> </td> <td class="code"> <div class="highlight"><pre><span class="nv">exports.Scope = </span><span class="k">class</span> <span class="nx">Scope</span> | ||
| </pre></div> </td> </tr> <tr id="section-8"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-8">¶</a> </div> <p>The 'scoped eval' literal.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">EVAL_LITERAL = </span><span class="s2">"(function(__expr){return eval(__expr)})"</span></pre></div> </td> </tr> <tr id="section-9"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-9">¶</a> </div> <h3>Class methods</h3> </td> <td class="code"> <div class="highlight"><pre> </pre></div> </td> </tr> <tr id="section-10"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-10">¶</a> </div> <h4>Scope.eval(expr)</h4> | ||
| </pre></div> </td> </tr> <tr id="section-8"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-8">¶</a> </div> <p>The 'scoped eval' literal.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">EVAL_LITERAL = </span><span class="s2">"(function(__expr){return eval(__expr)})"</span> | ||
| <span class="nv">literal: </span><span class="o">-></span> <span class="nx">EVAL_LITERAL</span></pre></div> </td> </tr> <tr id="section-9"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-9">¶</a> </div> <h3>Class methods</h3> </td> <td class="code"> <div class="highlight"><pre> </pre></div> </td> </tr> <tr id="section-10"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-10">¶</a> </div> <h4>Scope.eval(expr)</h4> | ||
@@ -31,3 +32,3 @@ <p>A function to eval a given expression safely wrapped in a function | ||
| <span class="k">else</span> <span class="k">if</span> <span class="nx">isFn</span> <span class="nx">x</span> </pre></div> </td> </tr> <tr id="section-13"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-13">¶</a> </div> <p>'Decompile' a function using <code>Function::toString</code> (where supported)</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">x = </span><span class="nx">x</span><span class="p">.</span><span class="nx">toString</span><span class="p">()</span></pre></div> </td> </tr> <tr id="section-14"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-14">¶</a> </div> <p>Remove name from named function</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">x = </span><span class="nx">x</span><span class="p">.</span><span class="nx">replace</span> <span class="sr">/function[^\(]*\(/</span><span class="p">,</span> <span class="s2">"function ("</span> | ||
| <span class="s2">"(#{x})"</span></pre></div> </td> </tr> <tr id="section-15"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-15">¶</a> </div> <p>Otherwise, <code>x</code> must literalize itself.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="k">else</span> <span class="nx">x</span><span class="p">.</span><span class="nx">literalize</span><span class="p">()</span></pre></div> </td> </tr> <tr id="section-16"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-16">¶</a> </div> <h4>Class properties intended to be overridden.</h4> </td> <td class="code"> <div class="highlight"><pre> </pre></div> </td> </tr> <tr id="section-17"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-17">¶</a> </div> <p>These locals are defined in the root scope.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="vi">@rootLocals =</span></pre></div> </td> </tr> <tr id="section-18"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-18">¶</a> </div> <p>CoffeeScript runtime helpers</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">__slice: </span><span class="nb">Array</span><span class="o">::</span><span class="nx">slice</span> | ||
| <span class="s2">"(#{x})"</span></pre></div> </td> </tr> <tr id="section-15"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-15">¶</a> </div> <p>Otherwise, <code>x</code> must literalize itself.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="k">else</span> <span class="nx">x</span><span class="p">.</span><span class="nx">literal</span><span class="p">()</span></pre></div> </td> </tr> <tr id="section-16"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-16">¶</a> </div> <h4>Class properties intended to be overridden.</h4> </td> <td class="code"> <div class="highlight"><pre> </pre></div> </td> </tr> <tr id="section-17"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-17">¶</a> </div> <p>These locals are defined in the root scope.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="vi">@rootLocals =</span></pre></div> </td> </tr> <tr id="section-18"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-18">¶</a> </div> <p>CoffeeScript runtime helpers</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">__slice: </span><span class="nb">Array</span><span class="o">::</span><span class="nx">slice</span> | ||
| <span class="nv">__bind: </span><span class="nf">(fn, me) -></span> <span class="o">-></span> <span class="nx">fn</span><span class="p">.</span><span class="nx">apply</span> <span class="nx">me</span><span class="p">,</span> <span class="nx">arguments</span> | ||
@@ -96,13 +97,10 @@ <span class="nv">__indexOf: </span><span class="nb">Array</span><span class="o">::</span><span class="nx">indexOf</span> <span class="o">or</span> <span class="nf">(item) -></span> | ||
| log(scope.eval('foo')); // 3 | ||
| </code></pre> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">constructor: </span><span class="nf">(@options = {}) -></span></pre></div> </td> </tr> <tr id="section-26"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-26">¶</a> </div> <p>The types of variables in options.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">varTypes = </span><span class="p">[</span><span class="s1">'locals'</span><span class="p">,</span> <span class="s1">'literals'</span><span class="p">]</span></pre></div> </td> </tr> <tr id="section-27"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-27">¶</a> </div> <p>Normalize options.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">@options</span><span class="p">[</span><span class="nx">k</span><span class="p">]</span> <span class="o">?=</span> <span class="p">{}</span> <span class="k">for</span> <span class="nx">k</span> <span class="k">in</span> <span class="nx">varTypes</span></pre></div> </td> </tr> <tr id="section-28"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-28">¶</a> </div> <h5>The <code>__scope</code> local variable</h5> | ||
| </code></pre> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">constructor: </span><span class="nf">(@options = {}) -></span></pre></div> </td> </tr> <tr id="section-26"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-26">¶</a> </div> <p>The types of variables in options.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">varTypes = </span><span class="p">[</span><span class="s1">'locals'</span><span class="p">,</span> <span class="s1">'literals'</span><span class="p">]</span></pre></div> </td> </tr> <tr id="section-27"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-27">¶</a> </div> <p>Normalize options.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">@options</span><span class="p">[</span><span class="nx">k</span><span class="p">]</span> <span class="o">?=</span> <span class="p">{}</span> <span class="k">for</span> <span class="nx">k</span> <span class="k">in</span> <span class="nx">varTypes</span></pre></div> </td> </tr> <tr id="section-28"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-28">¶</a> </div> <h5>The <code>__this</code> local variable</h5> | ||
| <p>Within the target scope, <code>__scope</code> refers to the Scope object for that | ||
| target scope.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="vi">@options.locals.__scope = </span><span class="err">@</span> | ||
| <p>Within the target scope, <code>__this</code> refers to the Scope object for that | ||
| target scope.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="vi">@options.locals.__this = </span><span class="err">@</span> | ||
| <span class="p">{</span><span class="nx">@parent</span><span class="p">}</span> <span class="o">=</span> <span class="nx">@options</span></pre></div> </td> </tr> <tr id="section-29"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-29">¶</a> </div> <p>Register variable names declared in options.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">names = </span><span class="p">[]</span> | ||
| <span class="nx">names</span><span class="p">.</span><span class="nx">push</span> <span class="nx">name</span> <span class="k">for</span> <span class="nx">name</span> <span class="k">of</span> <span class="nx">@options</span><span class="p">[</span><span class="nx">k</span><span class="p">]</span> <span class="k">for</span> <span class="nx">k</span> <span class="k">in</span> <span class="nx">varTypes</span> | ||
| <span class="k">throw</span> <span class="s1">'Reserved'</span> <span class="k">for</span> <span class="nx">n</span> <span class="k">in</span> <span class="nx">names</span> <span class="k">when</span> <span class="nx">n</span> <span class="k">in</span> <span class="nx">@constructor</span><span class="p">.</span><span class="nx">reserved</span> | ||
| <span class="vi">@names = </span><span class="nx">names</span><span class="p">.</span><span class="nx">concat</span> <span class="nx">@parent</span><span class="o">?</span><span class="p">.</span><span class="nx">names</span> <span class="o">or</span> <span class="p">[]</span></pre></div> </td> </tr> <tr id="section-30"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-30">¶</a> </div> <p>Compile the 'scoped eval'</p> </td> <td class="code"> <div class="highlight"><pre> <span class="vi">@_eval = </span> | ||
| <span class="nx">unless</span> <span class="nx">@parent</span><span class="o">?</span> <span class="k">then</span> <span class="nx">Scope</span><span class="p">.</span><span class="nb">eval</span> | ||
| <span class="k">else</span></pre></div> </td> </tr> <tr id="section-31"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-31">¶</a> </div> <p>Concatenate and assign all local literals</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">literals = </span><span class="p">(</span><span class="k">for</span> <span class="nx">name</span><span class="p">,</span> <span class="nx">val</span> <span class="k">of</span> <span class="nx">@options</span><span class="p">.</span><span class="nx">literals</span> | ||
| <span class="s2">"var #{name} = #{literalize val};\n"</span><span class="p">).</span><span class="nx">join</span><span class="p">(</span><span class="s1">''</span><span class="p">)</span></pre></div> </td> </tr> <tr id="section-32"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-32">¶</a> </div> <p>Eval <code>literals</code> in the parent scope with <code>@options.locals</code>.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">@parent</span><span class="p">.</span><span class="nb">eval</span> <span class="nx">@options</span><span class="p">,</span> <span class="nx">literals</span> <span class="o">+</span> <span class="nx">EVAL_LITERAL</span></pre></div> </td> </tr> <tr id="section-33"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-33">¶</a> </div> <h5>Exports</h5> | ||
| <span class="vi">@names = </span><span class="nx">names</span><span class="p">.</span><span class="nx">concat</span> <span class="nx">@parent</span><span class="o">?</span><span class="p">.</span><span class="nx">names</span> <span class="o">or</span> <span class="p">[]</span></pre></div> </td> </tr> <tr id="section-30"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-30">¶</a> </div> <p>Compile the 'scoped eval'</p> </td> <td class="code"> <div class="highlight"><pre> <span class="vi">@_eval = </span><span class="nx">@parent</span><span class="o">?</span><span class="p">.</span><span class="nb">eval</span><span class="p">(</span><span class="nx">@options</span><span class="p">,</span> <span class="err">@</span><span class="p">)</span> <span class="o">or</span> <span class="nx">Scope</span><span class="p">.</span><span class="nb">eval</span> </pre></div> </td> </tr> <tr id="section-31"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-31">¶</a> </div> <h5>Exports</h5> | ||
@@ -130,13 +128,14 @@ <p>Exports allow direct access to locals inside the scope via | ||
| <span class="nx">@__defineSetter__</span> <span class="nx">x</span><span class="p">,</span> <span class="nx">C</span><span class="p">.</span><span class="nx">makeSetter</span> <span class="nx">x</span> | ||
| <span class="k">else</span> </pre></div> </td> </tr> <tr id="section-34"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-34">¶</a> </div> <p>In environments where <code>__defineGetter__</code> and <code>__defineSetter__</code> | ||
| <span class="k">else</span> </pre></div> </td> </tr> <tr id="section-32"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-32">¶</a> </div> <p>In environments where <code>__defineGetter__</code> and <code>__defineSetter__</code> | ||
| are not supported, <code>@[name]</code> is set once when the scope is created.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="err">@</span><span class="p">[</span><span class="nx">x</span><span class="p">]</span> <span class="o">=</span> <span class="nx">C</span><span class="p">.</span><span class="nx">makeGetter</span><span class="p">(</span><span class="nx">x</span><span class="p">)()</span> <span class="k">for</span> <span class="nx">x</span> <span class="k">in</span> <span class="nx">exports</span> | ||
| </pre></div> </td> </tr> <tr id="section-35"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-35">¶</a> </div> <h4>Scope::eval(ctx, expr)</h4> | ||
| </pre></div> </td> </tr> <tr id="section-33"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-33">¶</a> </div> <p>The current value of <code>this</code> inside the eval.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">context: </span><span class="kc">null</span> | ||
| </pre></div> </td> </tr> <tr id="section-34"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-34">¶</a> </div> <h4>Scope::eval(context, expr)</h4> | ||
| <p>Evaluate an expression in this scope.</p> | ||
| <p>The optional <code>ctx</code> parameter serves as the value of <code>this</code> | ||
| <p>The optional <code>context</code> parameter serves as the value of <code>this</code> | ||
| for the eval of <code>expr</code>.</p> | ||
| <p><code>ctx.locals</code> may define additional locals visible only to <code>expr</code>.</p> | ||
| <p><code>context.locals</code> may define additional locals visible only to <code>expr</code>.</p> | ||
@@ -151,11 +150,15 @@ <h5>Argument Decompilation</h5> | ||
| log(getXFromScope()); // Prints the current value of x in the scope. | ||
| </code></pre> </td> <td class="code"> <div class="highlight"><pre> <span class="nb">eval</span><span class="o">:</span> <span class="nf">(ctx, expr) -></span> | ||
| <span class="p">[</span><span class="nx">ctx</span><span class="p">,</span> <span class="nx">expr</span><span class="p">]</span> <span class="o">=</span> <span class="p">[{},</span> <span class="nx">ctx</span><span class="p">]</span> <span class="nx">unless</span> <span class="nx">expr</span> | ||
| </code></pre> </td> <td class="code"> <div class="highlight"><pre> <span class="nb">eval</span><span class="o">:</span> <span class="nf">(@context, expr) -></span> | ||
| <span class="p">[</span><span class="nx">@context</span><span class="p">,</span> <span class="nx">expr</span><span class="p">]</span> <span class="o">=</span> <span class="p">[{},</span> <span class="nx">@context</span><span class="p">]</span> <span class="nx">unless</span> <span class="nx">expr</span> | ||
| <span class="nv">locals = </span> | ||
| <span class="k">if</span> <span class="nx">ctx</span><span class="p">.</span><span class="nx">locals</span> <span class="k">then</span> <span class="p">(</span><span class="k">for</span> <span class="nx">name</span> <span class="k">of</span> <span class="nx">ctx</span><span class="p">.</span><span class="nx">locals</span> | ||
| <span class="k">if</span> <span class="nx">@context</span><span class="p">.</span><span class="nx">locals</span> <span class="k">then</span> <span class="p">(</span><span class="k">for</span> <span class="nx">name</span> <span class="k">of</span> <span class="nx">@context</span><span class="p">.</span><span class="nx">locals</span> | ||
| <span class="s2">"var #{name} = this.locals.#{name};\n"</span><span class="p">).</span><span class="nx">join</span> <span class="s1">''</span> | ||
| <span class="k">else</span> <span class="s2">""</span> | ||
| <span class="nx">@_eval</span><span class="p">.</span><span class="nx">call</span> <span class="nx">ctx</span><span class="p">,</span> <span class="nx">locals</span> <span class="o">+</span> <span class="nx">literalize</span> <span class="nx">expr</span> | ||
| </pre></div> </td> </tr> <tr id="section-36"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-36">¶</a> </div> <h4>Scope::run(ctx, fn)</h4> | ||
| <span class="nv">literals = </span> | ||
| <span class="k">if</span> <span class="nx">@context</span><span class="p">.</span><span class="nx">literals</span> <span class="k">then</span> <span class="p">(</span><span class="k">for</span> <span class="nx">name</span><span class="p">,</span> <span class="nx">val</span> <span class="k">of</span> <span class="nx">@context</span><span class="p">.</span><span class="nx">literals</span> | ||
| <span class="s2">"var #{name} = #{literalize val};\n"</span><span class="p">).</span><span class="nx">join</span> <span class="s1">''</span> | ||
| <span class="k">else</span> <span class="s2">""</span> | ||
| <span class="nx">@_eval</span><span class="p">.</span><span class="nx">call</span> <span class="nx">@context</span><span class="p">,</span> <span class="nx">locals</span> <span class="o">+</span> <span class="nx">literals</span> <span class="o">+</span> <span class="nx">literalize</span> <span class="nx">expr</span> | ||
| </pre></div> </td> </tr> <tr id="section-35"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-35">¶</a> </div> <h4>Scope::run(ctx, fn)</h4> | ||
@@ -168,3 +171,3 @@ <p>'Run' a function in this scope. i.e., <code>literalize</code>, <code>eval</code> and <code>call</code> | ||
| <span class="p">[</span><span class="nx">ctx</span><span class="p">,</span> <span class="nx">fn</span><span class="p">]</span> <span class="o">=</span> <span class="p">[{},</span> <span class="nx">ctx</span><span class="p">]</span> <span class="nx">unless</span> <span class="nx">fn</span> | ||
| <span class="nx">@eval</span> <span class="nx">ctx</span><span class="p">,</span> <span class="s2">"#{literalize fn}.call(this)"</span></pre></div> </td> </tr> <tr id="section-37"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-37">¶</a> </div> <h4>Scope::set(name, val, isLiteral)</h4> | ||
| <span class="nx">@eval</span> <span class="nx">ctx</span><span class="p">,</span> <span class="s2">"#{literalize fn}.call(this)"</span></pre></div> </td> </tr> <tr id="section-36"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-36">¶</a> </div> <h4>Scope::set(name, val, isLiteral)</h4> | ||
@@ -180,11 +183,11 @@ <p>Set local variable to value. | ||
| <span class="nx">@set</span> <span class="nx">name</span><span class="p">,</span> <span class="nx">val</span><span class="p">,</span> <span class="nx">isLiteral</span> <span class="k">for</span> <span class="nx">name</span><span class="p">,</span> <span class="nx">val</span> <span class="k">in</span> <span class="nx">obj</span> | ||
| </pre></div> </td> </tr> <tr id="section-38"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-38">¶</a> </div> <h4>Scope::get(name)</h4> | ||
| </pre></div> </td> </tr> <tr id="section-37"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-37">¶</a> </div> <h4>Scope::get(name)</h4> | ||
| <p>Get a local value from this scope.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">get: </span><span class="nf">(name) -></span> <span class="nx">@_eval</span> <span class="nx">name</span></pre></div> </td> </tr> <tr id="section-39"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-39">¶</a> </div> <h4>Scope::extend(options)</h4> | ||
| <p>Get a local value from this scope.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">get: </span><span class="nf">(name) -></span> <span class="nx">@_eval</span> <span class="nx">name</span></pre></div> </td> </tr> <tr id="section-38"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-38">¶</a> </div> <h4>Scope::extend(options)</h4> | ||
| <p>Create a new scope that extends this one, with the given options. | ||
| See <code>constructor</code> for a list of options.</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nv">extend: </span><span class="nf">(options = {}) -></span> <span class="k">new</span> <span class="nx">@constructor</span> <span class="nx">extend</span> <span class="nx">options</span><span class="p">,</span> <span class="nv">parent: </span><span class="err">@</span> | ||
| </pre></div> </td> </tr> <tr id="section-40"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-40">¶</a> </div> <p>Initialize this class</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">@initialize</span><span class="p">()</span> | ||
| </pre></div> </td> </tr> <tr id="section-39"> <td class="docs"> <div class="pilwrap"> <a class="pilcrow" href="#section-39">¶</a> </div> <p>Initialize this class</p> </td> <td class="code"> <div class="highlight"><pre> <span class="nx">@initialize</span><span class="p">()</span> | ||
| </pre></div> </td> </tr> </tbody> </table> </div> </body> </html> |
+31
-25
| (function() { | ||
| /* | ||
| * Scopejs v0.8.0 | ||
| * Scopejs v0.9.0 | ||
| * http://scopejs.org | ||
@@ -37,2 +37,5 @@ * | ||
| EVAL_LITERAL = "(function(__expr){return eval(__expr)})"; | ||
| Scope.prototype.literal = function() { | ||
| return EVAL_LITERAL; | ||
| }; | ||
| Scope.eval = (1, eval)(EVAL_LITERAL); | ||
@@ -47,3 +50,3 @@ Scope.literalize = literalize = function(x) { | ||
| } else { | ||
| return x.literalize(); | ||
| return x.literal(); | ||
| } | ||
@@ -112,3 +115,3 @@ }; | ||
| function Scope(options) { | ||
| var C, exports, k, literals, n, name, names, val, varTypes, x, _base, _i, _j, _k, _l, _len, _len2, _len3, _len4, _len5, _len6, _m, _n, _ref, _ref2; | ||
| var C, exports, k, n, name, names, varTypes, x, _base, _i, _j, _k, _l, _len, _len2, _len3, _len4, _len5, _len6, _m, _n, _ref, _ref2, _ref3; | ||
| this.options = options != null ? options : {}; | ||
@@ -122,3 +125,3 @@ varTypes = ['locals', 'literals']; | ||
| } | ||
| this.options.locals.__scope = this; | ||
| this.options.locals.__this = this; | ||
| this.parent = this.options.parent; | ||
@@ -139,18 +142,9 @@ names = []; | ||
| this.names = names.concat(((_ref2 = this.parent) != null ? _ref2.names : void 0) || []); | ||
| this._eval = this.parent == null ? Scope.eval : (literals = ((function() { | ||
| var _ref3, _results; | ||
| _ref3 = this.options.literals; | ||
| _results = []; | ||
| for (name in _ref3) { | ||
| val = _ref3[name]; | ||
| _results.push("var " + name + " = " + (literalize(val)) + ";\n"); | ||
| } | ||
| return _results; | ||
| }).call(this)).join(''), this.parent.eval(this.options, literals + EVAL_LITERAL)); | ||
| this._eval = ((_ref3 = this.parent) != null ? _ref3.eval(this.options, this) : void 0) || Scope.eval; | ||
| exports = (function() { | ||
| var _l, _len4, _ref3, _results; | ||
| _ref3 = this.names; | ||
| var _l, _len4, _ref4, _results; | ||
| _ref4 = this.names; | ||
| _results = []; | ||
| for (_l = 0, _len4 = _ref3.length; _l < _len4; _l++) { | ||
| x = _ref3[_l]; | ||
| for (_l = 0, _len4 = _ref4.length; _l < _len4; _l++) { | ||
| x = _ref4[_l]; | ||
| if (!x.match(/^_/)) { | ||
@@ -182,16 +176,28 @@ _results.push(x); | ||
| } | ||
| Scope.prototype.eval = function(ctx, expr) { | ||
| var locals, name, _ref; | ||
| Scope.prototype.context = null; | ||
| Scope.prototype.eval = function(context, expr) { | ||
| var literals, locals, name, val, _ref; | ||
| this.context = context; | ||
| if (!expr) { | ||
| _ref = [{}, ctx], ctx = _ref[0], expr = _ref[1]; | ||
| _ref = [{}, this.context], this.context = _ref[0], expr = _ref[1]; | ||
| } | ||
| locals = ctx.locals ? ((function() { | ||
| locals = this.context.locals ? ((function() { | ||
| var _results; | ||
| _results = []; | ||
| for (name in ctx.locals) { | ||
| for (name in this.context.locals) { | ||
| _results.push("var " + name + " = this.locals." + name + ";\n"); | ||
| } | ||
| return _results; | ||
| })()).join('') : ""; | ||
| return this._eval.call(ctx, locals + literalize(expr)); | ||
| }).call(this)).join('') : ""; | ||
| literals = this.context.literals ? ((function() { | ||
| var _ref2, _results; | ||
| _ref2 = this.context.literals; | ||
| _results = []; | ||
| for (name in _ref2) { | ||
| val = _ref2[name]; | ||
| _results.push("var " + name + " = " + (literalize(val)) + ";\n"); | ||
| } | ||
| return _results; | ||
| }).call(this)).join('') : ""; | ||
| return this._eval.call(this.context, locals + literals + literalize(expr)); | ||
| }; | ||
@@ -198,0 +204,0 @@ Scope.prototype.run = function(ctx, fn) { |
+1
-1
@@ -6,3 +6,3 @@ { | ||
| "author": "Derek Brans <dbrans@gmail.com>", | ||
| "version": "0.8.2", | ||
| "version": "0.9.0", | ||
| "homepage": "http://scopejs.org", | ||
@@ -9,0 +9,0 @@ "bugs": { "web" : "github.com/dbrans/scope/issues"}, |
+22
-21
| # File header. | ||
| ### | ||
| * Scopejs v0.8.2 | ||
| * Scopejs v0.9.0 | ||
| * http://scopejs.org | ||
@@ -28,2 +28,3 @@ * | ||
| EVAL_LITERAL = "(function(__expr){return eval(__expr)})" | ||
| literal: -> EVAL_LITERAL | ||
@@ -58,3 +59,3 @@ # ### Class methods | ||
| # Otherwise, `x` must literalize itself. | ||
| else x.literalize() | ||
| else x.literal() | ||
@@ -143,6 +144,6 @@ # #### Class properties intended to be overridden. | ||
| @options[k] ?= {} for k in varTypes | ||
| # #####The `__scope` local variable | ||
| # Within the target scope, `__scope` refers to the Scope object for that | ||
| # #####The `__this` local variable | ||
| # Within the target scope, `__this` refers to the Scope object for that | ||
| # target scope. | ||
| @options.locals.__scope = @ | ||
| @options.locals.__this = @ | ||
| {@parent} = @options | ||
@@ -155,10 +156,3 @@ # Register variable names declared in options. | ||
| # Compile the 'scoped eval' | ||
| @_eval = | ||
| unless @parent? then Scope.eval | ||
| else | ||
| # Concatenate and assign all local literals | ||
| literals = (for name, val of @options.literals | ||
| "var #{name} = #{literalize val};\n").join('') | ||
| # Eval `literals` in the parent scope with `@options.locals`. | ||
| @parent.eval @options, literals + EVAL_LITERAL | ||
| @_eval = @parent?.eval(@options, @) or Scope.eval | ||
| # #####Exports | ||
@@ -192,9 +186,12 @@ # Exports allow direct access to locals inside the scope via | ||
| # #### Scope::eval(ctx, expr) | ||
| # The current value of `this` inside the eval. | ||
| context: null | ||
| # #### Scope::eval(context, expr) | ||
| # Evaluate an expression in this scope. | ||
| # | ||
| # The optional `ctx` parameter serves as the value of `this` | ||
| # The optional `context` parameter serves as the value of `this` | ||
| # for the eval of `expr`. | ||
| # | ||
| # `ctx.locals` may define additional locals visible only to `expr`. | ||
| # `context.locals` may define additional locals visible only to `expr`. | ||
| # | ||
@@ -209,10 +206,14 @@ # ##### Argument Decompilation | ||
| # | ||
| eval: (ctx, expr) -> | ||
| [ctx, expr] = [{}, ctx] unless expr | ||
| eval: (@context, expr) -> | ||
| [@context, expr] = [{}, @context] unless expr | ||
| locals = | ||
| if ctx.locals then (for name of ctx.locals | ||
| if @context.locals then (for name of @context.locals | ||
| "var #{name} = this.locals.#{name};\n").join '' | ||
| else "" | ||
| @_eval.call ctx, locals + literalize expr | ||
| literals = | ||
| if @context.literals then (for name, val of @context.literals | ||
| "var #{name} = #{literalize val};\n").join '' | ||
| else "" | ||
| @_eval.call @context, locals + literals + literalize expr | ||
@@ -219,0 +220,0 @@ # #### Scope::run(ctx, fn) |
130309
0.27%1761
0.69%