On Wed, Sep 15, 2010 at 5:24 PM, James Burke <span dir="ltr">&lt;<a href="mailto:jrburke@gmail.com">jrburke@gmail.com</a>&gt;</span> wrote:<br><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
First time posting to the es-discuss list:<br>
<br>
Over on the CommonJS list, there is a thread about how to provide a<br>
module format that works in today&#39;s browsers. The traditional CommonJS<br>
module format cannot run in the browser via script tags without a<br>
transform, and some of us want a format that will work without<br>
transforms but can be easily hand-coded.<br>
<br>
Tom Robinson made the following suggestion, is this an acceptable use<br>
of Function.prototype.toString:<br>
<br>
require.def(function (require, exports, module) {<br>
    var foo = require(&#39;foo&#39;),<br>
        bar = require(&#39;bar&#39;);<br>
});<br>
<br>
Where require.def would call .toString() on the function passed to it,<br>
regexp for the require() calls, then make sure to load those<br>
dependencies before executing the function that defines the module.<br>
<br>
So the toString() does not have to be an exact copy of the function,<br>
just enough that allows the require() calls to be found.<br></blockquote><div><br></div><div>Hi James, at &lt;<a href="http://wiki.ecmascript.org/doku.php?id=strawman:function_to_string">http://wiki.ecmascript.org/doku.php?id=strawman:function_to_string</a>&gt; I&#39;ve been trying to state a usefully stronger but not impractically stronger spec. I like your usage pattern of &quot;require&quot; above, especially that it can be reliably recognized without a full lexing or parsing by regexp tricks, without getting misled by comments or quotes. (I try a similar but different pattern at &lt;<a href="http://code.google.com/p/es-lab/source/browse/trunk/src/ses/initSES.js#276">http://code.google.com/p/es-lab/source/browse/trunk/src/ses/initSES.js#276</a>&gt;. I like your&#39;s better.)</div>
<div><br></div><div>Given source code, of course, either recognition trick works. Given only meaning preserving source code, which is the most I was willing to propose on that strawman page, these recognition tricks fail &lt;<a href="http://wiki.ecmascript.org/doku.php?id=strawman:function_to_string#discussion">http://wiki.ecmascript.org/doku.php?id=strawman:function_to_string#discussion</a>&gt;. Would we be willing to specify enough fidelity with the original source code that your trick would work? I don&#39;t know. Perhaps AST preserving? Perhaps preserving of some abstraction over equivalent ASTs? I would like to clean up Function.prototype.toString for ES-Harmony. Opinions?</div>
<div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
<br>
I am leaving out a bunch of other stuff about the browser-friendly<br>
module format (for instance there is a transform for this format to<br>
allow grouping more than one module in a file for optimized browser<br>
delivery and that form does not use .toString() and this approach<br>
*would not* be used on minified code), but the main question for the<br>
es-discuss list is:<br>
<br>
Is this an acceptable use of Function.prototype.toString? What<br>
problems would there be now or in the future?<br>
<br>
What I have found so far:<br>
<br>
The ECMAScript 3rd and 5th edition specs say the following:<br>
------<br>
15.3.4.2 Function.prototype.toString ( )<br>
<br>
An implementation-dependent representation of the function is<br>
returned. This representation has the syntax of a FunctionDeclaration.<br>
Note in particular that the use and placement of white space, line<br>
terminators, and semicolons within the representation string is<br>
implementation-dependent.<br>
<br>
The toString function is not generic; it throws a TypeError exception<br>
if its this value is not a Function object. Therefore, it cannot be<br>
transferred to other kinds of objects for use as a method.<br>
------<br>
<br>
In a 2008 es-discuss thread[1], Erik Arvidsson thought the<br>
&quot;implementation-dependent&quot; part allowed for low-memory devices to not<br>
keep a reversible implementation in memory.<br>
<br>
A test was run in a few browsers to test the approach[2]: modern<br>
desktop browsers (including IE 6+) give a usable toString() value, and<br>
there are many mobile browsers that also work well: Android, iOS,<br>
Windows Mobile, webOS and latest BlackBerry. So far BlackBerry 4.6 and<br>
some version of Opera Mobile may not, and there are some like Symbian<br>
and Bada that have not been tested yet.<br>
<br>
So one issue is not universal browser support, but enough of today&#39;s<br>
browsers both on desktop and mobile that it may make sense using it<br>
going forward. While the spec technically allows an implementation to<br>
produce something that might cause the above mentioned Function<br>
toString() approach to fail, it seems in practice it may be workable.<br>
<br>
I am a bit wary of the approach, but initial testing seems to indicate<br>
it may work, so I am looking to have an expert review done before<br>
proceeding with the approach. If any of you have other other<br>
information or concerns it would be good to know.<br>
<br>
James<br>
<br>
[1 ]Thread starts with this post:<br>
<a href="https://mail.mozilla.org/pipermail/es-discuss/2008-September/007632.html" target="_blank">https://mail.mozilla.org/pipermail/es-discuss/2008-September/007632.html</a><br>
<br>
[2] Browser test page:<br>
<a href="http://requirejs.org/temp/fts.html" target="_blank">http://requirejs.org/temp/fts.html</a><br>
_______________________________________________<br>
es-discuss mailing list<br>
<a href="mailto:es-discuss@mozilla.org">es-discuss@mozilla.org</a><br>
<a href="https://mail.mozilla.org/listinfo/es-discuss" target="_blank">https://mail.mozilla.org/listinfo/es-discuss</a><br>
</blockquote></div><br><br clear="all"><br>-- <br>    Cheers,<br>    --MarkM<br>