(function(){ if ( !this.Math || (typeof this.Math != 'object' && typeof this.Math != 'function') ) this.Math = new Object(); if ( this.Math.ToInteger === undefined ) this.Math.ToInteger = undefined; if ( this.Math.ToInt32 === undefined ) this.Math.ToInt32 = undefined; if ( this.Math.ToUInt32 === undefined ) this.Math.ToUInt32 = undefined; if ( this.Math.ToUInt16 === undefined ) this.Math.ToUInt16 = undefined; with ( function(){ with ( Math ) { return function () { var VERSION = '0.0.0'; var NAMESPACE; /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Math.ToInteger module. * * The Initial Developer of the Original Code is * Daisuke Maki. * Portions created by the Initial Developer are Copyright (C) 2006 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ NAMESPACE = 'Math'; // This module provides functions emulating the integral type // conversions defined in ECMA-262 3rd. function ToInteger ( n ) { return n < 0 ? ceil(n) : floor(n) || 0; } function ToInt32 ( n ) { return n | 0; } function ToUInt32 ( n ) { return n >>> 0; } function ToUInt16 ( n ) { return n & 0xFFFF; } return { ToUInt16: ToUInt16, ToUInt32: ToUInt32, ToInt32: ToInt32, ToInteger: ToInteger }; }(); } }.call(null) ) { this.Math.ToUInt16 = ToUInt16; this.Math.ToUInt32 = ToUInt32; this.Math.ToInt32 = ToInt32; this.Math.ToInteger = ToInteger; } }).call(null); (function(){ if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( this.Data.Stack === undefined ) this.Data.Stack = undefined; with ( function(){ with ( Data ) { return function () { var VERSION = '0.0.0'; var NAMESPACE; /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Data.Stack module. * * The Initial Developer of the Original Code is * Daisuke Maki. * Portions created by the Initial Developer are Copyright (C) 2006 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ NAMESPACE = 'Data'; function Stack ( ) { this.length = 0; } var proto = Stack.prototype; proto.pop = Array.prototype.pop; proto.push = Array.prototype.push; proto.peek = function ( ) { return this.length > 0 ? this[this.length-1] : undefined; }; proto.isEmpty = function ( ) { return this.length == 0; }; return { Stack: Stack }; }(); } }.call(null) ) { this.Data.Stack = Stack; } }).call(null); (function(){ this.GLOBAL = this; }).call(null); (function(){ if ( !this.Util || (typeof this.Util != 'object' && typeof this.Util != 'function') ) this.Util = new Object(); if ( !this.Util.Arrayize || (typeof this.Util.Arrayize != 'object' && typeof this.Util.Arrayize != 'function') ) this.Util.Arrayize = new Object(); if ( this.Util.Arrayize.arrayize === undefined ) this.Util.Arrayize.arrayize = undefined; with ( function(){ with ( Util.Arrayize ) { return function () { var VERSION = '0.0.0'; var NAMESPACE; NAMESPACE = 'Util.Arrayize'; var slice = Array.prototype.slice; function arrayize ( o ) { if ( !o ) return []; try { return slice.call(o, 0); } catch ( e ) { var r = []; for ( var i=0; i < o.length; i++ ) { r[i] = o[i]; } return r; } } return { arrayize: arrayize }; }(); } }.call(null) ) { this.Util.Arrayize.arrayize = arrayize; } }).call(null); (function(){ if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Cons || (typeof this.Data.Cons != 'object' && typeof this.Data.Cons != 'function') ) this.Data.Cons = new Object(); if ( this.Data.Cons.Cell === undefined ) this.Data.Cons.Cell = undefined; if ( this.Data.Cons.Nil === undefined ) this.Data.Cons.Nil = undefined; if ( this.Data.Cons.nil === undefined ) this.Data.Cons.nil = undefined; if ( this.Data.Cons.cons === undefined ) this.Data.Cons.cons = undefined; if ( this.Data.Cons.car === undefined ) this.Data.Cons.car = undefined; if ( this.Data.Cons.cdr === undefined ) this.Data.Cons.cdr = undefined; with ( function(){ with ( Data.Cons ) { return function () { var VERSION = '0.2.0'; var NAMESPACE; /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Data.Cons code. * * The Initial Developer of the Original Code is * Daisuke Maki. * Portions created by the Initial Developer are Copyright (C) 2006-2007 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ NAMESPACE = 'Data.Cons'; function Cell ( car, cdr ) { this.car = car; this.cdr = cdr; } var proto = Cell.prototype; proto.toString = function ( ) { return "(" + this.car + " . " + this.cdr + ")"; }; proto.toLocaleString = function ( ) { return "(" + (this.car == null ? String(this.car) : this.car.toLocaleString) + " . " + (this.cdr == null ? String(this.cdr) : this.cdr.toLocaleString) + ")"; }; proto.isNil = function ( ) { return false; }; function Nil ( ) { this.car = this; this.cdr = this; } var proto = Nil.prototype = new Cell(); proto.constructor = Nil; proto.toString = proto.toLocaleString = function ( ) { return "nil"; }; proto.isNil = function ( ) { return true; }; function nil ( ) { return new Nil(); }; function cons ( car, cdr ) { return new Cell(car, cdr); } function car ( cell ) { return cell.car; } function cdr ( cell ) { return cell.cdr; } return { nil: nil, Nil: Nil, car: car, Cell: Cell, cdr: cdr, cons: cons }; }(); } }.call(null) ) { this.Data.Cons.nil = nil; this.Data.Cons.Nil = Nil; this.Data.Cons.car = car; this.Data.Cons.Cell = Cell; this.Data.Cons.cdr = cdr; this.Data.Cons.cons = cons; } }).call(null); (function(){ if ( !this.WebBrowser || (typeof this.WebBrowser != 'object' && typeof this.WebBrowser != 'function') ) this.WebBrowser = new Object(); if ( !this.WebBrowser.ScriptExecuter || (typeof this.WebBrowser.ScriptExecuter != 'object' && typeof this.WebBrowser.ScriptExecuter != 'function') ) this.WebBrowser.ScriptExecuter = new Object(); if ( this.WebBrowser.ScriptExecuter.register === undefined ) this.WebBrowser.ScriptExecuter.register = undefined; if ( this.WebBrowser.ScriptExecuter.exec === undefined ) this.WebBrowser.ScriptExecuter.exec = undefined; with ( function(){ with ( WebBrowser.ScriptExecuter ) { return function () { var VERSION ; var NAMESPACE; NAMESPACE = 'WebBrowser.ScriptExecuter'; var executers = {}; var default_type = "text/javascript"; function register ( type, exec ) { if ( typeof exec != "function" ) throw new TypeError("function required, but got: " + exec); executers[String(type).toLowerCase()] = exec; } function exec ( ) { var metas = document.getElementsByTagName("META"); for ( var i=0; i < metas.length; i++ ) { if ( String(metas[i].httpEquiv).match(/^Content-Script-Type$/i) ) { default_type = metas[i].content; } } var scripts = document.getElementsByTagName("SCRIPT"); for ( var i=0; i < scripts.length; i++ ) { (function( el ){ setTimeout(function(){ exec_aux(el); }, 0); })(scripts[i]); } } function exec_aux ( el ) { var mime = parseMIMEType(el.type ? el.type : default_type); if ( executers[mime.type] ) { if ( el.src ) { var req = createXHR(); req.open("GET", el.src, true); req.onreadystatechange = function ( ) { if ( req.readyState == 4 ) rest(req.responseText); }; req.send(null); } else { rest(el.innerHTML); } } function rest ( source ) { el.parentNode.removeChild(el); executers[mime.type](source, mime.attr); } } function createXHR ( ) { try { return new XMLHttpRequest(); } catch (_){ try { return new ActiveXObject("Msxml2.XMLHTTP"); } catch (_){ return new ActiveXObject("Microsoft.XMLHTTP"); } } } var NOT_TSPECIAL = '[^][()<>@,;:\\\\"/?=\\x00-\\x20]'; var TOKEN = "(?:" + NOT_TSPECIAL + "+)"; var MIME_TYPE = "(?:" + TOKEN + "/" + TOKEN + ")"; var QUOTED_STRING = '(?:"[^"]*(?:\\\\.[^"]*)*")'; var VALUE = "(?:" + TOKEN + "|" + QUOTED_STRING + ")"; function parseMIMEType ( text ) { text = String(text); var re = new RegExp("^" + MIME_TYPE, "g"); re.lastIndex = 0; var result = re.exec(text); if ( !result ) return {type:text.toLowerCase(), attr:{}}; var type = result[0].toLowerCase(); var attr = {}; text = text.substring(re.lastIndex); re = new RegExp("^\\s*;\\s*(" + TOKEN + ")\\s*=\\s*(" + VALUE + ")", "g"); re.lastIndex = 0; while ( result = re.exec(text) ) { attr[result[1].toLowerCase()] = result[2]; text = text.substring(re.lastIndex); re.lastIndex = 0; } return {type:type, attr:attr}; } if ( window.addEventListener ) { window.addEventListener("load", exec, false); } else if ( window.attachEvent ) { window.attachEvent("onload", exec); } else { if ( window.onload ) { var temp = window.onload; window.onload = function ( ) { var r = temp.apply(this, arguments); exec(); return r; }; } else { window.onload = exec; } } return { register: register, exec: exec }; }(); } }.call(null) ) { this.WebBrowser.ScriptExecuter.register = register; this.WebBrowser.ScriptExecuter.exec = exec; } }).call(null); (function(){ if ( !this.WebBrowser || (typeof this.WebBrowser != 'object' && typeof this.WebBrowser != 'function') ) this.WebBrowser = new Object(); if ( !this.WebBrowser.GUI || (typeof this.WebBrowser.GUI != 'object' && typeof this.WebBrowser.GUI != 'function') ) this.WebBrowser.GUI = new Object(); if ( !this.WebBrowser.GUI.Event || (typeof this.WebBrowser.GUI.Event != 'object' && typeof this.WebBrowser.GUI.Event != 'function') ) this.WebBrowser.GUI.Event = new Object(); if ( this.WebBrowser.GUI.Event.attach === undefined ) this.WebBrowser.GUI.Event.attach = undefined; if ( this.WebBrowser.GUI.Event.detach === undefined ) this.WebBrowser.GUI.Event.detach = undefined; with ( function(){ with ( WebBrowser.GUI.Event ) { return function () { var VERSION = '0.0.0'; var NAMESPACE; NAMESPACE = 'WebBrowser.GUI.Event'; var listener_id = 0; var registry = {}; attach(window, "unload", function(){ for ( var i in registry ) detach(Number(i)); }); function attach ( element, type, listener, useCapture ) { if ( !element || typeof element !== "object" ) { throw new TypeError("argument not a element: " + element); } type = String(type); if ( typeof listener !== "function" ) { throw new TypeError("argument not a function: " + listener); } useCapture = Boolean(useCapture); function handler ( e ) { e = e || window.event; if ( !e.stopPropagation ) { // Sets standard properties for IE e.target = e.srcElement; e.currentTarget = this; e.cancelable = true; e.stopPropagation = function stopPropagation ( ) { this.cancelBubble = true; }; var prevent_default = false; e.preventDefault = function preventDefault ( ) { prevent_default = true; }; } var ret_val = listener.call(this, e); return prevent_default ? false : ret_val; } if ( element.addEventListener ) { element.addEventListener(type, handler, useCapture); } else if ( element.attachEvent ) { element.attachEvent("on"+type, handler); } else { element["on"+type] = handler; } var id = listener_id++; registry[id] = { element : element, type : type, listener : listener, useCapture: useCapture, handler : handler }; return id; } function detach ( element, type, listener, useCapture ) { if ( arguments.length === 1 && typeof element === "number" ) { if ( !registry[element] ) return false; var reg = registry[element]; delete registry[element]; return detach_aux(reg.element, reg.type, reg.handler, reg.useCapture); } else { if ( !element || typeof element !== "object" ) { throw new TypeError("argument is not an element: " + element); } type = String(type); if ( typeof listener !== "function" ) { throw new TypeError("argument is not s function: " + listener); } useCapture = Boolean(useCapture); var ret_val = false; for ( var i in registry ) { var reg = registry[i]; if ( reg.element === element && reg.type === type && reg.listener === listener && reg.useCapture === useCapture ) { delete registry[i]; ret_val = detach_aux(reg.element, reg.type, reg.handler, reg.useCapture) || ret_val; } } return ret_val; } }; function detach_aux ( element, type, listener, useCapture ) { return element.removeEventListener ? element.removeEventListener(type, listener, useCapture) : element.detachEvent ? element.detachEvent("on"+type, listener) : delete element["on"+type] ; } return { detach: detach, attach: attach }; }(); } }.call(null) ) { this.WebBrowser.GUI.Event.detach = detach; this.WebBrowser.GUI.Event.attach = attach; } }).call(null); (function(){ if ( !this.JSON || (typeof this.JSON != 'object' && typeof this.JSON != 'function') ) this.JSON = new Object(); if ( this.JSON.dump === undefined ) this.JSON.dump = undefined; with ( function(){ with ( JSON ) { return function () { var VERSION = '0.0.0'; var NAMESPACE; NAMESPACE = 'JSON'; var DUMPER = "JSON.dumper"; function dump ( data, opts ) { opts = opts || {}; var indent = String(opts.indent); if ( !indent.match(/^\s*$/) ) indent = " "; return dump_main(data, {pretty:opts.pretty, indent:indent, deflate:opts.deflate}); } function dump_main ( data, opts ) { switch ( typeof data ) { case "undefined": return opts.deflate ? '(void 0)' : '"undefined"'; case "boolean": case "number": return String(data); case "string": return dump_string(data); case "function": case "object": if ( data === null ) { return "null"; } else if ( typeof data[DUMPER] == "function" ){ return data[DUMPER](opts); } else if ( data instanceof Array ) { var arr = []; for ( var i=0; i < data.length; i++ ) arr[i] = dump_main(data[i], opts); if ( opts.pretty ) { return "[\n" + arr.join(",\n").replace(/^/mg, opts.indent) + "\n]"; } else { return "[" + arr.join(",") + "]"; } } else { var arr = []; for ( var i in data ) { if ( data.hasOwnProperty(i) ) { arr.push(dump_string(i) + ":" + dump_main(data[i], opts)); } } if ( opts.pretty ) { return "{\n" + arr.join(",\n").replace(/^/mg, opts.indent) + "\n}"; } else { return "{" + arr.join(",") + "}"; } } } } function dump_string ( str ) { return '"' + str.replace(/[^\u0020-\u0021\u0023-\u005B\u005D-\u007E]/g, function (c){ // any ASCII character except '"', '\' and control-character c = c.charCodeAt(0); switch ( c ) { case '"' : return '\\"'; case '\\': return '\\\\'; case '\b': return '\\b'; case '\f': return '\\f'; case '\n': return '\\n'; case '\r': return '\\r'; case '\t': return '\\t'; default: c = c.toString(16); while ( c.length < 4 ) c = "0" + c; return "\\u" + c; } }) + '"'; } String.prototype[DUMPER] = function ( opts ) { return opts.deflate ? "new String(" + dump_string(this.toString()) + ")" : dump_string(this.toString()); }; Boolean.prototype[DUMPER] = function ( opts ) { return opts.deflate ? "new Boolean(" + this.toString() + ")" : this.toString(); }; Number.prototype[DUMPER] = function ( opts ) { return opts.deflate ? "new Number(" + this.toString() + ")" : this.toString(); }; Date.prototype[DUMPER] = function ( opts ) { return opts.deflate ? "new Date(" + this.valueOf() + ")" : dump_string(this.toString()); }; RegExp.prototype[DUMPER] = function ( opts ) { return opts.deflate ? this.toString() : dump_string(this.toString()); }; Function.prototype[DUMPER] = function ( opts ) { return opts.deflate ? this.toString() : dump_string(this.toString()); }; return { dump: dump }; }(); } }.call(null) ) { this.JSON.dump = dump; } }).call(null); (function(){ with ( function(){ return function () { var VERSION = '0.1.0'; var NAMESPACE; Function.prototype.bind = function ( o ) { var f = this; return function ( ) { return f.apply(o, arguments); }; }; return { }; }(); }.call(null) ) { } }).call(null); (function(){ if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Functional || (typeof this.Data.Functional != 'object' && typeof this.Data.Functional != 'function') ) this.Data.Functional = new Object(); if ( !this.Data.Functional.Loop || (typeof this.Data.Functional.Loop != 'object' && typeof this.Data.Functional.Loop != 'function') ) this.Data.Functional.Loop = new Object(); if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Functional || (typeof this.Data.Functional != 'object' && typeof this.Data.Functional != 'function') ) this.Data.Functional = new Object(); if ( this.Data.Functional.discontinue === undefined ) this.Data.Functional.discontinue = undefined; if ( this.Data.Functional.DiscontinueException === undefined ) this.Data.Functional.DiscontinueException = undefined; if ( this.Data.Functional.ignore === undefined ) this.Data.Functional.ignore = undefined; if ( this.Data.Functional.IgnoreException === undefined ) this.Data.Functional.IgnoreException = undefined; if ( this.Data.Functional.return_list === undefined ) this.Data.Functional.return_list = undefined; if ( this.Data.Functional.ReturnListException === undefined ) this.Data.Functional.ReturnListException = undefined; if ( this.Data.Functional.Loop.EndOfLoopException === undefined ) this.Data.Functional.Loop.EndOfLoopException = undefined; if ( this.Data.Functional.Loop.wrap_for_forEach === undefined ) this.Data.Functional.Loop.wrap_for_forEach = undefined; if ( this.Data.Functional.Loop.wrap_for_fold === undefined ) this.Data.Functional.Loop.wrap_for_fold = undefined; if ( this.Data.Functional.Loop.wrap_for_map === undefined ) this.Data.Functional.Loop.wrap_for_map = undefined; with ( function(){ with ( Data.Functional.Loop ) { with ( Data.Functional ) { return function () { var VERSION = '0.5.0'; var NAMESPACE; /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Data.Functional code. * * The Initial Developer of the Original Code is * Daisuke Maki. * Portions created by the Initial Developer are Copyright (C) 2005-2007 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ NAMESPACE = 'Data.Functional'; function discontinue ( /* variable arguments */ ) { throw new DiscontinueException(arguments); } function DiscontinueException ( args ) { this.args = args; } var proto = DiscontinueException.prototype; proto.name = NAMESPACE + ".DiscontinueException"; proto.message = "unusual use of `discontinue' (this should be caught by `forEach' or other iteration-methods)."; function ignore ( /* variable arguments */ ) { throw new IgnoreException(arguments); } function IgnoreException ( args ) { this.args = args; } var proto = IgnoreException.prototype; proto.name = NAMESPACE + ".IgnoreException"; proto.message = "unusual use of `ignore' (this should be caught by `forEach' or other iteration-methods)."; function return_list ( /* variable arguments */ ) { throw new ReturnListException(arguments); } function ReturnListException ( args ) { this.args = args; } var proto = ReturnListException.prototype; proto.name = NAMESPACE + ".ReturnListException"; proto.message = "unusual use of `return_list' (this should be caught by `forEach' or other iteration-methods)."; NAMESPACE = 'Data.Functional.Loop'; function EndOfLoopException ( v ) { this.result = v; } var proto = EndOfLoopException.prototype; proto.name = NAMESPACE + ".EndOfLoopException"; proto.message = "this should be caught by `forEach' or other iteration-methods"; function wrap_for_forEach ( t, f ) { if ( typeof f != "function" ) throw new TypeError("argument to forEach must be function"); return function ( v ) { try { f.call(t, v); } catch ( e ) { if ( e instanceof DiscontinueException ) { throw new EndOfLoopException(); } else if ( e instanceof IgnoreException ) { // Do nothing. } else if ( e instanceof ReturnListException ) { // Do nothing. } else { throw e; } } }; } function wrap_for_fold ( t, f, s ) { if ( typeof f != "function" ) throw new TypeError("argument to fold must be function"); return function ( v ) { try { return s = f.call(t, s, v); } catch ( e ) { if ( e instanceof DiscontinueException ) { throw new EndOfLoopException(e.args[e.args.length-1]); } else if ( e instanceof IgnoreException ) { return s; } else if ( e instanceof ReturnListException ) { return s = f.call(t, s, e.args[e.args.length-1]); } else { throw e; } } }; } function wrap_for_map ( t, f, a ) { if ( typeof f != "function" ) throw new TypeError("argument to map must be function"); if ( typeof a != "function" ) throw new TypeError("the third argument to wrap_for_map must be function"); return function ( v ) { try { a.call(null, f.call(t, v)); } catch ( e ) { if ( e instanceof DiscontinueException ) { a.apply(null, e.args); throw new EndOfLoopException(); } else if ( e instanceof IgnoreException ) { // Do nothing. } else if ( e instanceof ReturnListException ) { a.apply(null, e.args); } else { throw e; } } }; } return { DiscontinueException: DiscontinueException, wrap_for_forEach: wrap_for_forEach, wrap_for_map: wrap_for_map, ignore: ignore, discontinue: discontinue, ReturnListException: ReturnListException, wrap_for_fold: wrap_for_fold, return_list: return_list, IgnoreException: IgnoreException, EndOfLoopException: EndOfLoopException }; }(); } } }.call(null) ) { this.Data.Functional.DiscontinueException = DiscontinueException; this.Data.Functional.Loop.wrap_for_forEach = wrap_for_forEach; this.Data.Functional.Loop.wrap_for_map = wrap_for_map; this.Data.Functional.ignore = ignore; this.Data.Functional.discontinue = discontinue; this.Data.Functional.ReturnListException = ReturnListException; this.Data.Functional.Loop.wrap_for_fold = wrap_for_fold; this.Data.Functional.return_list = return_list; this.Data.Functional.IgnoreException = IgnoreException; this.Data.Functional.Loop.EndOfLoopException = EndOfLoopException; } }).call(null); (function(){ if ( !this.Util || (typeof this.Util != 'object' && typeof this.Util != 'function') ) this.Util = new Object(); if ( !this.Util.Arrayize || (typeof this.Util.Arrayize != 'object' && typeof this.Util.Arrayize != 'function') ) this.Util.Arrayize = new Object(); with ( function(){ with ( Util.Arrayize ) { return function () { var VERSION = '0.0.0'; var NAMESPACE; var null_constructor = function (){}; Function.prototype.extend = function extend ( init, props ) { if ( typeof init !== "function" ) throw new TypeError("function is expected: " + init); if ( props == null ) props = {}; var SuperClass = this; var SubClass = function ( ) { var self = this; var super_is_called = false; function super_call ( ) { if ( super_is_called ) throw new Error("super-constructor has already been called"); super_is_called = true; var ret_val = SuperClass.apply(self, arguments); if ( ret_val instanceof Object ) { for ( var i in ret_val ) { if ( ret_val.hasOwnProperty(i) ) self[i] = ret_val[i]; } } return ret_val; } arguments = arrayize(arguments); arguments.unshift(super_call); return init.apply(self, arguments); }; null_constructor.prototype = SuperClass.prototype; var proto = SubClass.prototype = new null_constructor; proto.constructor = SubClass; proto.$super = function ( prop ) { if ( !arguments.length ) return SuperClass; var value = SuperClass.prototype[prop]; if ( typeof value === "function" ) { return value.bind(this); } else { return value; } }; for ( var i in props ) proto[i] = props[i]; return SubClass; }; return { }; }(); } }.call(null) ) { } }).call(null); (function(){ if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Error || (typeof this.Data.Error != 'object' && typeof this.Data.Error != 'function') ) this.Data.Error = new Object(); if ( this.Data.Error.Error === undefined ) this.Data.Error.Error = undefined; if ( this.Data.Error.Exception === undefined ) this.Data.Error.Exception = undefined; with ( function(){ with ( Data.Error ) { return function () { var VERSION = '0.3.0'; var NAMESPACE; /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Data.Error module. * * The Initial Developer of the Original Code is * Daisuke Maki. * Portions created by the Initial Developer are Copyright (C) 2005-2006 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ NAMESPACE = 'Data.Error'; var Error = GLOBAL.Error.extend( function ( $super, message ) { $super(message); }, { name : NAMESPACE + ".Error", message : "something's wrong", toString: function ( ) { var s = String(this.message); s = s ? this.name + ": " + s : this.name; if ( this.fileName ) { s += " @" + this.fileName + ":" + this.lineNumber; } return s; } } ); var Exception = GLOBAL.Error.extend( function ( $super, message ) { $super(message); }, { name : NAMESPACE + ".Exception", message : "an exception has occurred", toString: function ( ) { var s = String(this.message); s = s ? this.name + ": " + s : this.name; if ( this.fileName ) { s += " @" + this.fileName + ":" + this.lineNumber; } return s; } } ); return { Error: Error, Exception: Exception }; }(); } }.call(null) ) { this.Data.Error.Error = Error; this.Data.Error.Exception = Exception; } }).call(null); (function(){ if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Error || (typeof this.Data.Error != 'object' && typeof this.Data.Error != 'function') ) this.Data.Error = new Object(); if ( this.Data.Error.UnimplementedMethodError === undefined ) this.Data.Error.UnimplementedMethodError = undefined; with ( function(){ with ( Data.Error ) { return function () { var VERSION = '0.3.0'; var NAMESPACE; /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Data.Error.UnimplementedMethodError. * * The Initial Developer of the Original Code is * Daisuke Maki. * Portions created by the Initial Developer are Copyright (C) 2005-2006 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ NAMESPACE = 'Data.Error'; var UnimplementedMethodError = Error.extend( function ( $super, method, invocant, message ) { if ( message !== undefined ) { $super(message); } else { $super("an required method `" + method + "' has not been implemented"); } this.method = method; this.invocant = invocant; }, { name: NAMESPACE + ".UnimplementedMethodError" } ); return { UnimplementedMethodError: UnimplementedMethodError }; }(); } }.call(null) ) { this.Data.Error.UnimplementedMethodError = UnimplementedMethodError; } }).call(null); (function(){ if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Error || (typeof this.Data.Error != 'object' && typeof this.Data.Error != 'function') ) this.Data.Error = new Object(); if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Iterator || (typeof this.Data.Iterator != 'object' && typeof this.Data.Iterator != 'function') ) this.Data.Iterator = new Object(); if ( this.Data.Iterator.NoSuchElementError === undefined ) this.Data.Iterator.NoSuchElementError = undefined; with ( function(){ with ( Data.Error ) { with ( Data.Iterator ) { return function () { var VERSION = '0.2.0'; var NAMESPACE; /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Data.Iterator code. * * The Initial Developer of the Original Code is * Daisuke Maki. * Portions created by the Initial Developer are Copyright (C) 2006 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ NAMESPACE = 'Data.Iterator'; var NoSuchElementError = Error.extend( function ( $super, message ) { $super(message); }, { name : NAMESPACE + ".NoSuchElementError", message: "no such element" } ); return { NoSuchElementError: NoSuchElementError }; }(); } } }.call(null) ) { this.Data.Iterator.NoSuchElementError = NoSuchElementError; } }).call(null); (function(){ if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Error || (typeof this.Data.Error != 'object' && typeof this.Data.Error != 'function') ) this.Data.Error = new Object(); if ( this.Data.Error.IllegalStateError === undefined ) this.Data.Error.IllegalStateError = undefined; with ( function(){ with ( Data.Error ) { return function () { var VERSION = '0.0.0'; var NAMESPACE; /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Data.Error.IllegalStateError module. * * The Initial Developer of the Original Code is * Daisuke Maki. * Portions created by the Initial Developer are Copyright (C) 2006 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ NAMESPACE = 'Data.Error'; var IllegalStateError = Error.extend( function ( $super, message ) { $super(message); }, { name : NAMESPACE + ".IllegalStateError", message: "illegal state" } ); return { IllegalStateError: IllegalStateError }; }(); } }.call(null) ) { this.Data.Error.IllegalStateError = IllegalStateError; } }).call(null); (function(){ if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Error || (typeof this.Data.Error != 'object' && typeof this.Data.Error != 'function') ) this.Data.Error = new Object(); if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Iterator || (typeof this.Data.Iterator != 'object' && typeof this.Data.Iterator != 'function') ) this.Data.Iterator = new Object(); if ( this.Data.Iterator.Iterator === undefined ) this.Data.Iterator.Iterator = undefined; with ( function(){ with ( Data.Error ) { with ( Data.Iterator ) { return function () { var VERSION = '0.2.1'; var NAMESPACE; /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Data.Iterator code. * * The Initial Developer of the Original Code is * Daisuke Maki. * Portions created by the Initial Developer are Copyright (C) 2006 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ NAMESPACE = 'Data.Iterator'; function Iterator ( ) { // This is a kind of abstract class. // Sub-classes should implement appropreate methods. } var proto = Iterator.prototype; var obj_name = "[object " + NAMESPACE + ".Iterator]"; proto.toString = function ( ) { return obj_name; }; // Returns true if this iterator points to the tail of a list, // false othersise. // The default implementation merely throws UnimplementedMethodError. // Sub-classes must implement their own version of this method. proto.isTail = function ( ) { throw new UnimplementedMethodError("isTail", this); }; // Returns value of the element which is just after the position // this iterator points to. // The default implementation merely throws UnimplementedMethodError. // Sub-classes must implement their own version of this method, // which may throws Data.Iterator.NoSuchElementError. proto.value = function ( ) { throw new UnimplementedMethodError("value", this); }; // Returns a new iterator that points to the next position to the // one which this iterator points to. // The default implementation merely throws UnimplementedMethodError. // Sub-classes must implement their own version of this method, // which may throws Data.Iterator.NoSuchElementError. proto.next = function ( ) { throw new UnimplementedMethodError("next", this); }; // Returns true if and only if this iterator is associated with the // object specified by the argument, false otherwise. // The default implementation just returns false. proto.isBoundTo = function ( list ) { return false; }; proto.find = function ( f ) { for ( var it=this; !it.isTail(); it=it.next() ) { if ( f(it.value()) ) break; } return it; }; return { Iterator: Iterator }; }(); } } }.call(null) ) { this.Data.Iterator.Iterator = Iterator; } }).call(null); (function(){ if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Error || (typeof this.Data.Error != 'object' && typeof this.Data.Error != 'function') ) this.Data.Error = new Object(); if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Functional || (typeof this.Data.Functional != 'object' && typeof this.Data.Functional != 'function') ) this.Data.Functional = new Object(); if ( !this.Data.Functional.Loop || (typeof this.Data.Functional.Loop != 'object' && typeof this.Data.Functional.Loop != 'function') ) this.Data.Functional.Loop = new Object(); if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Functional || (typeof this.Data.Functional != 'object' && typeof this.Data.Functional != 'function') ) this.Data.Functional = new Object(); if ( this.Data.Functional.Enumerable === undefined ) this.Data.Functional.Enumerable = undefined; if ( this.Data.Functional.EmptyEnumerationError === undefined ) this.Data.Functional.EmptyEnumerationError = undefined; with ( function(){ with ( Data.Error ) { with ( Data.Functional.Loop ) { with ( Data.Functional ) { return function () { var VERSION = '0.5.0'; var NAMESPACE; /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Data.Functional code. * * The Initial Developer of the Original Code is * Daisuke Maki. * Portions created by the Initial Developer are Copyright (C) 2005-2007 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ NAMESPACE = 'Data.Functional'; function Enumerable ( ) { // This is a kind of abstract class. } var proto = Enumerable.prototype; var obj_name = "[object " + NAMESPACE + ".Enumerable]"; proto.toString = function ( ) { return obj_name; }; proto.iterator = function ( ) { throw new UnimplementedMethodError("iterator", this); }; proto.forEach = function ( f ) { var ret_val; f = wrap_for_forEach(this, f); for ( var it=this.iterator(); !it.isTail(); it=it.next() ) { try { f(it.value()); } catch ( e ) { if ( e instanceof EndOfLoopException ) return; else throw e; } } }; proto.fold = function ( f, s ) { f = wrap_for_fold(this, f, s); for ( var it=this.iterator(); !it.isTail(); it=it.next() ) { try { s = f(it.value()); } catch ( e ) { if ( e instanceof EndOfLoopException ) return e.result; else throw e; } } return s; }; proto.fold1 = function ( f ) { var it = this.iterator(); if ( it.isTail() ) throw new EmptyEnumerationError(); var s = it.value(); it = it.next(); f = wrap_for_fold(this, f, s); for ( ; !it.isTail(); it=it.next() ) { try { s = f(it.value()); } catch ( e ) { if ( e instanceof EndOfLoopException ) return e.result; else throw e; } } return s; }; proto.and = function ( ) { return this.fold(function ( x, y ) { return y || discontinue(y); }, true); }; proto.or = function ( ) { return this.fold(function ( x, y ) { return y && discontinue(y); }, false); }; proto.all = function ( f ) { return this.fold(function ( x, y ) { y = f.call(this, y); return y || discontinue(y); }, true); }; proto.any = function ( f ) { return this.fold(function ( x, y ) { y = f.call(this, y); return y && discontinue(y); }, false); }; var EmptyEnumerationError = Error.extend( function ( $super, message ) { $super(message); }, { name : NAMESPACE + ".EmptyEnumerationError", message: "empty enumeration" } ); return { EmptyEnumerationError: EmptyEnumerationError, Enumerable: Enumerable }; }(); } } } }.call(null) ) { this.Data.Functional.EmptyEnumerationError = EmptyEnumerationError; this.Data.Functional.Enumerable = Enumerable; } }).call(null); (function(){ if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Error || (typeof this.Data.Error != 'object' && typeof this.Data.Error != 'function') ) this.Data.Error = new Object(); if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Functional || (typeof this.Data.Functional != 'object' && typeof this.Data.Functional != 'function') ) this.Data.Functional = new Object(); if ( !this.Data.Functional.Loop || (typeof this.Data.Functional.Loop != 'object' && typeof this.Data.Functional.Loop != 'function') ) this.Data.Functional.Loop = new Object(); if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Functional || (typeof this.Data.Functional != 'object' && typeof this.Data.Functional != 'function') ) this.Data.Functional = new Object(); if ( this.Data.Functional.Collection === undefined ) this.Data.Functional.Collection = undefined; with ( function(){ with ( Data.Error ) { with ( Data.Functional.Loop ) { with ( Data.Functional ) { return function () { var VERSION = '0.5.0'; var NAMESPACE; /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Data.Functional code. * * The Initial Developer of the Original Code is * Daisuke Maki. * Portions created by the Initial Developer are Copyright (C) 2005-2007 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ NAMESPACE = 'Data.Functional'; function Collection ( ) { // This is kind of abstract class. } var proto = Collection.prototype = new Enumerable(); proto.constructor = Collection; var obj_name = "[object " + NAMESPACE + ".Collection]"; proto.toString = function ( ) { return obj_name; }; proto.toArray = function ( ) { var a = []; this.forEach(function( it ){ a.push(it); }); return a; }; proto.add = function ( /* variable args */ ) { throw new UnimplementedMethodError("add", this); }; proto.addAll = function ( /* variable arguments */ ) { var self = this; var changed = false; for ( var i=0; i < arguments.length; i++ ) { var c = arguments[i]; if ( c instanceof Collection ) { c.forEach(function( it ){ changed = self.add(it) || changed; }); } else if ( c instanceof Array ) { changed = this.add.apply(this, c) || changed; } else { chagned = this.add(c) || changed; } } return changed; }; proto.removeAt = function ( it ) { throw new UnimplementedMethodError("removeAt", this); }; proto.isEmpty = function ( ) { return this.iterator().isTail(); }; proto.empty = function ( ) { var it; while ( !(it=this.iterator()).isTail() ) this.removeAt(it); }; proto.size = function ( ) { var i = 0; this.forEach(function(){ ++i; }); return i; }; proto.emptyCopy = function ( ) { return new this.constructor(); }; proto.copy = function ( ) { var c = this.emptyCopy(); this.forEach(function( it ){ c.add(it); }); return c; }; proto.map = function ( f ) { var c = this.emptyCopy(); f = wrap_for_map(this, f, function ( ) { c.add.apply(c, arguments); }); for ( var it=this.iterator(); !it.isTail(); it=it.next() ) { try { f(it.value()); } catch ( e ) { if ( e instanceof EndOfLoopException ) return c; else throw e; } } return c; }; proto.filter = function ( f ) { return this.map(function( it ){ if ( f.call(this, it) ) return it; else ignore(); }); }; proto.grep = function ( re ) { if ( !(re instanceof RegExp) ) re = new Regex(re); return this.filter(function(it){ return String(it).match(re); }); }; return { Collection: Collection }; }(); } } } }.call(null) ) { this.Data.Functional.Collection = Collection; } }).call(null); (function(){ if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Error || (typeof this.Data.Error != 'object' && typeof this.Data.Error != 'function') ) this.Data.Error = new Object(); if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Iterator || (typeof this.Data.Iterator != 'object' && typeof this.Data.Iterator != 'function') ) this.Data.Iterator = new Object(); if ( this.Data.Iterator.BidirectionalIterator === undefined ) this.Data.Iterator.BidirectionalIterator = undefined; with ( function(){ with ( Data.Error ) { with ( Data.Iterator ) { return function () { var VERSION = '0.2.0'; var NAMESPACE; /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Data.Iterator code. * * The Initial Developer of the Original Code is * Daisuke Maki. * Portions created by the Initial Developer are Copyright (C) 2006 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ NAMESPACE = 'Data.Iterator'; function BidirectionalIterator ( ) { // This is a kind of abstract class. // Sub-classes should implement appropreate methods. } var proto = BidirectionalIterator.prototype = new Iterator(); proto.constructor = BidirectionalIterator; var obj_name = "[object " + NAMESPACE + ".BidirectionalIterator]"; proto.toString = function ( ) { return obj_name; }; // Returns true if this iterator points to the head of a list, // false othersise. // The default implementation merely throws UnimplementedMethodError. // Sub-classes must implement their own version of this method. proto.isHead = function ( ) { throw new UnimplementedMethodError("isHead", this); }; // Returns a new iterator that points to the previous position to // the one which this iterator points to. // The default implementation merely throws UnimplementedMethodError. // Sub-classes must implement their own version of this method. proto.previous = function ( ) { throw new UnimplementedMethodError("previous", this); }; return { BidirectionalIterator: BidirectionalIterator }; }(); } } }.call(null) ) { this.Data.Iterator.BidirectionalIterator = BidirectionalIterator; } }).call(null); (function(){ if ( !this.Math || (typeof this.Math != 'object' && typeof this.Math != 'function') ) this.Math = new Object(); if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Functional || (typeof this.Data.Functional != 'object' && typeof this.Data.Functional != 'function') ) this.Data.Functional = new Object(); if ( !this.Data.Functional.Loop || (typeof this.Data.Functional.Loop != 'object' && typeof this.Data.Functional.Loop != 'function') ) this.Data.Functional.Loop = new Object(); if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Functional || (typeof this.Data.Functional != 'object' && typeof this.Data.Functional != 'function') ) this.Data.Functional = new Object(); if ( this.Data.Functional.List === undefined ) this.Data.Functional.List = undefined; with ( function(){ with ( Math ) { with ( Data.Functional.Loop ) { with ( Data.Functional ) { return function () { var VERSION = '0.5.0'; var NAMESPACE; /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Data.Functional code. * * The Initial Developer of the Original Code is * Daisuke Maki. * Portions created by the Initial Developer are Copyright (C) 2005-2007 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ // This module should not be required directly. // Require Data.Functional.List instead. NAMESPACE = 'Data.Functional'; function List ( ) { // This is a kind of abstract class. } var proto = List.prototype = new Collection(); proto.constructor = List; // Iterator methods. // Return an iterator pointing to just before the n'th element // (the first element is the 0th one). If there are only n elements // in this list, return an iterator pointing to the tail. // If n is negative, it is treated as size+n, where size is the length // of this list. Thus, if n is negative, the result of head(n) and // the one of tail(-n) should be equivalent. // These methods can throw RangeError. proto.head = function ( n ) { if ( n < 0 ) return this.tail(-n); return nNextFromHead(this.tail(), n); }; proto.tail = function ( n ) { if ( n < 0 ) return this.head(-n); return nPreviousFromTail(this.head(), n); }; proto.reverseHead = function ( n ) { if ( n < 0 ) return this.reverseTail(-n); return nNextFromHead(this.reverseTail(), n); }; proto.reverseTail = function ( n ) { if ( n < 0 ) return this.reverseHead(-n); return nPreviousFromTail(this.reverseHead(), n); }; function nNextFromHead ( it, n ) { var q = []; n = ToInteger(n); if ( n == 0 ) { // simple optimization while ( !it.isHead() ) it = it.previous(); return it; } else { while ( n-- > 0 ) { if ( it.isHead() ) throw new RangeError(); q.push(it); it = it.previous(); } while ( !it.isHead() ) { q.shift(); q.push(it); it = it.previous(); } q.push(it); return q[0]; } } function nPreviousFromTail ( it, n ) { var q = []; n = ToInteger(n); if ( n == 0 ) { // simple optimization while ( !it.isTail() ) it = it.next(); return it; } else { while ( n-- > 0 ) { if ( it.isTail() ) throw new RangeError(); q.push(it); it = it.next(); } while ( !it.isTail() ) { q.shift(); q.push(it); it = it.next(); } q.push(it); return q[0]; } } proto.iterator = function ( /* delegate */ ) { return this.head.apply(this, arguments); }; proto.add = function ( /* variable args */ ) { if ( arguments.length == 0 ) return false; for ( var i=0; i < arguments.length; i++ ) { this.tail().insert(arguments[i]); } return true; }; // Returns the value indexed by the argument. // If there is no corresponding value in this list, returns undefined. // The argument can be either number or iterator. proto.get = function ( it ) { if ( !(it instanceof List.Iterator && it.isBoundTo(this)) ) { try { it = this.head(it); } catch ( e ) { if ( e instanceof RangeError ) { return undefined; } else { throw e; } } } if ( it.isTail() ) return undefined; else return it.value(); }; // Assigns the second argument to the container indexed by the first // argument. // The argument can be either number or iterator. proto.set = function ( it, v ) { if ( !(it instanceof List.Iterator && it.isBoundTo(this)) ) { it = this.head(it); } return it.assign(v); }; // Inserts a new container at the position indexed by the first // argument, and sets the second argument to the container, then, // returns the value of the container. // The argument can be either number or iterator. // The position which this iterator points to after insertion is // implementation-dependent. proto.insertAt = function ( it, v ) { if ( !(it instanceof List.Iterator && it.isBoundTo(this)) ) { it = this.head(it); } return it.insert(v); }; // Removes the container indexed by the argument, then, returns the // value of the container. // The argument can be either number or iterator. // The position which this iterator points to after removal is // implementation-dependent. proto.removeAt = function ( it ) { if ( !(it instanceof List.Iterator && it.isBoundTo(this)) ) { it = this.head(it); } return it.remove(); }; proto.pop = function ( ) { return this.reverseHead().remove(); }; proto.push = function ( /* variable args */ ) { this.add.apply(this, arguments); return this.size(); }; proto.shift = function ( ) { return this.head().remove(); }; proto.unshift = function ( /* variable args */ ) { for ( var i=arguments.length-1; i >= 0; i-- ) { this.head().insert(arguments[i]); } return this.size(); }; proto.join = function ( /* delegate */ ) { var arr = this.toArray(); return arr.join.apply(arr, arguments); }; proto.toString = function ( /* delegate */ ) { var arr = this.toArray(); return arr.toString.apply(arr, arguments); }; proto.toLocaleString = function ( /* delegate */ ) { var arr = this.toArray(); return arr.toLocaleString.apply(arr, arguments); }; proto.reverse = function ( ) { var r = this.emptyCopy(); for ( var it=this.reverseHead(); !it.isTail(); it=it.next() ) { r.add(it.value()); } return r; }; proto.slice = function ( start, end ) { if ( !( start instanceof List.Iterator && end instanceof List.Iterator && start.isBoundTo(this) && end.isBoundTo(this) && start.constructor === end.constructor ) ) // one might be reverse-iterator even though the other is iterator. { try { start = this.head(start); } catch ( e ) { if ( e instanceof RangeError ) { start = start < 0 ? this.head() : this.tail(); } else { throw e; } } if ( end === undefined ) { end = this.tail(); } else { try { end = this.head(end); } catch ( e ) { if ( e instanceof RangeError ) { end = end < 0 ? this.head() : this.tail(); } else { throw e; } } } } var l = this.emptyCopy(); if ( start.compareTo(end) >= 0 ) return l; while ( !start.equals(end) ) { l.add(start.value()); start = start.next(); } return l; }; proto.concat = function ( /* variable arguments */ ) { var list = this.emptyCopy(); arguments[-1] = this; for ( var i=-1; i < arguments.length; i++ ) { var e = arguments[i]; if ( e instanceof List ) { e.forEach(function(it){ list.add(it) }); } else if ( e instanceof Array ) { for ( var j=0; j < e.length; j++ ) list.add(e[j]) } else { list.add(e); } } return list; }; proto.foldl = proto.fold; proto.foldl1 = proto.fold1; proto.foldr = function ( f, s ) { var g = wrap_for_fold(this, function(x,y){return f.call(this,y,x);}, s); for ( var it=this.reverseHead(); !it.isTail(); it=it.next() ) { try { s = g(it.value()); } catch ( e ) { if ( e instanceof EndOfLoopException ) return e.result; else throw e; } } return s; }; proto.foldr1 = function ( f ) { var it = this.reverseHead(); if ( it.isTail() ) throw new EmptyEnumerationError(); var s = it.value(); it = it.next(); var g = wrap_for_fold(this, function(x,y){return f.call(this,y,x);}, s); for ( ; !it.isTail(); it=it.next() ) { try { s = g(it.value()); } catch ( e ) { if ( e instanceof EndOfLoopException ) return e.result; else throw e; } } return s; }; return { List: List }; }(); } } } }.call(null) ) { this.Data.Functional.List = List; } }).call(null); (function(){ if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Error || (typeof this.Data.Error != 'object' && typeof this.Data.Error != 'function') ) this.Data.Error = new Object(); if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Iterator || (typeof this.Data.Iterator != 'object' && typeof this.Data.Iterator != 'function') ) this.Data.Iterator = new Object(); if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Functional || (typeof this.Data.Functional != 'object' && typeof this.Data.Functional != 'function') ) this.Data.Functional = new Object(); if ( this.Data.Functional.Set === undefined ) this.Data.Functional.Set = undefined; with ( function(){ with ( Data.Error ) { with ( Data.Iterator ) { with ( Data.Functional ) { return function () { var VERSION = '0.4.0'; var NAMESPACE; /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Data.Functional code. * * The Initial Developer of the Original Code is * Daisuke Maki. * Portions created by the Initial Developer are Copyright (C) 2005-2007 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ NAMESPACE = 'Data.Functional'; function Set ( ) { // This is kind of interface. } var proto = Set.prototype = new Collection(); proto.constructor = Set; var obj_name = "[object " + NAMESPACE + ".Set]"; proto.toString = function ( ) { return obj_name; }; proto.contains = function ( /* variable args */ ) { throw new UnimplementedMethodError("contains", this); }; proto.containsAll = function ( /* variable args */ ) { for ( var i=0; i < arguments.length; i++ ) { var e = arguments[i]; if ( e instanceof Array ) { if ( !this.contains.apply(this, e) ) return false; } else if ( e instanceof Collection ) { var self = this; if ( !e.all(function(it){ return self.contains(it); }) ) return false; } else { if ( !this.contains(e) ) return false; } } return true; }; proto.remove = function ( /* variable args */ ) { throw new UnimplementedMethodError("remove", this); }; proto.removeAll = function ( /* variable args */ ) { var changed = false; for ( var i=0; i < arguments.length; i++ ) { var e = arguments[i]; if ( e instanceof Array ) { changed = this.remove.apply(this, e) || changed; } else if ( e instanceof Collection ) { var self = this; e.forEach(function( it ){ changed = self.remove(it) || changed; }); } else { changed = this.remove(e) || changed; } } return changed; }; proto.removeAt = function ( it ) { if ( !(it instanceof Iterator) ) throw new TypeError("the argument is not of type Data.Iterator.Iterator"); if ( !it.isBoundTo(this) ) throw new IllegalStateError(); var v = it.value(); this.remove(v); return v; }; proto.retainAll = function ( /* variable args */ ) { var temp = this.emptyCopy(); temp.addAll.apply(temp, arguments); return this.removeAll( this.filter(function(it){ return !temp.contains(it); }) ); }; return { Set: Set }; }(); } } } }.call(null) ) { this.Data.Functional.Set = Set; } }).call(null); (function(){ if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Error || (typeof this.Data.Error != 'object' && typeof this.Data.Error != 'function') ) this.Data.Error = new Object(); if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Iterator || (typeof this.Data.Iterator != 'object' && typeof this.Data.Iterator != 'function') ) this.Data.Iterator = new Object(); if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Functional || (typeof this.Data.Functional != 'object' && typeof this.Data.Functional != 'function') ) this.Data.Functional = new Object(); if ( !this.Data.Functional.List || (typeof this.Data.Functional.List != 'object' && typeof this.Data.Functional.List != 'function') ) this.Data.Functional.List = new Object(); if ( this.Data.Functional.List.Iterator === undefined ) this.Data.Functional.List.Iterator = undefined; with ( function(){ with ( Data.Error ) { with ( Data.Iterator ) { with ( Data.Functional.List ) { return function () { var VERSION = '0.5.0'; var NAMESPACE; /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Data.Functional code. * * The Initial Developer of the Original Code is * Daisuke Maki. * Portions created by the Initial Developer are Copyright (C) 2005-2007 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ NAMESPACE = 'Data.Functional.List'; function Iterator ( ) { // This is a kind of abstract class. } var proto = Iterator.prototype = new BidirectionalIterator(); proto.constructor = Iterator; var obj_name = "[object " + NAMESPACE + ".Iterator]"; proto.toString = function ( ) { return obj_name; }; // Assign the argument to the element which is just after the position // this iterator points to, then returns the new value of the element, // which can be defferent from the argument. // The effect of assignment at the tail of a list should be identical // to the one of insertion. // The default implementation merely throws UnimplementedMethodError. proto.assign = function ( v ) { throw new UnimplementedMethodError("assign", this); }; // Inserts a new container at the position which this iterator points // to and sets the argument to the container, then, returns the value // of the container, which can be defferent from the argument. // The position which the iterator points to after insertion is // implementation-dependent. // The default implementation merely throws UnimplementedMethodError. proto.insert = function ( v ) { throw new UnimplementedMethodError("insert", this); }; // Removes the container just after the position which this iterator // points, then, returns the value of the container. // The position which the iterator points to after removal is // implementation-dependent. // The default implementation merely throws UnimplementedMethodError. proto.remove = function ( ) { throw new UnimplementedMethodError("remove", this); }; // Returns true if both this iterator and the argument points to the same position, // false otherwise. // The default implementation is based on `compareTo' method. proto.equals = function ( that ) { return this.compareTo(that) === 0; }; // Returns the distance of this iterator and the argument, // or undefined if the iterators seem to point to defferent list. // A negative return value means the arguments succeeds this iterator // and its magnitude represents the distance of them. Thus, this can be // used as comparison-function. // The default implementation is based on `next', `equals' and `isTail' method. proto.distance = proto.compareTo = function ( that ) { if ( !(that instanceof Iterator) ) return undefined; for ( var i=0, l=this, r=that; ; i--, l=l.next() ) { if ( l.equals(r) ) return i; if ( l.isTail() ) break; } for ( var i=1, l=that.next(), r=this; ; i++, l=l.next() ) { if ( l.equals(r) ) return i; if ( l.isTail() ) break; } return undefined; }; return { Iterator: Iterator }; }(); } } } }.call(null) ) { this.Data.Functional.List.Iterator = Iterator; } }).call(null); (function(){ if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Functional || (typeof this.Data.Functional != 'object' && typeof this.Data.Functional != 'function') ) this.Data.Functional = new Object(); if ( !this.Data.Functional.List || (typeof this.Data.Functional.List != 'object' && typeof this.Data.Functional.List != 'function') ) this.Data.Functional.List = new Object(); if ( this.Data.Functional.List.ReverseIterator === undefined ) this.Data.Functional.List.ReverseIterator = undefined; with ( function(){ with ( Data.Functional.List ) { return function () { var VERSION = '0.4.0'; var NAMESPACE; /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Data.Functional code. * * The Initial Developer of the Original Code is * Daisuke Maki. * Portions created by the Initial Developer are Copyright (C) 2005-2007 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ NAMESPACE = 'Data.Functional.List'; // This module provides convinient wrapper to construct // reverse iterator from normal list iterator. function ReverseIterator ( it ) { this._it = it; } var proto = ReverseIterator.prototype = new Iterator(); proto.constructor = ReverseIterator; proto.isBoundTo = function ( that ) { return this._it.isBoundTo(that); }; proto.isTail = function ( ) { return this._it.isHead(); }; proto.isHead = function ( ) { return this._it.isTail(); }; proto.next = function ( ) { return new ReverseIterator(this._it.previous()); }; proto.previous = function ( ) { return new ReverseIterator(this._it.next()); }; proto.value = function ( ) { return this._it.previous().value(); }; proto.assign = function ( v ) { return this._it.previous().assign(v); }; proto.insert = function ( v ) { return this._it.insert(v); }; proto.remove = function ( ) { return this._it.previous().remove(); }; proto.equals = function ( that ) { if ( !(that instanceof ReverseIterator) ) return false; return this._it.equal(taht._it); }; proto.compareTo = function ( that ) { if ( !(that instanceof ReverseIterator) ) return undefined; var c = this._it.compareTo(that._it); if ( isNaN(d) ) return c; return -c; }; proto.distance = function ( that ) { if ( !(that instanceof ReverseIterator) ) return undefined; var d = this._it.distance(that._it); if ( isNaN(d) ) return d; return -d; }; return { ReverseIterator: ReverseIterator }; }(); } }.call(null) ) { this.Data.Functional.List.ReverseIterator = ReverseIterator; } }).call(null); (function(){ with ( function(){ return function () { var VERSION = '0.5.0'; var NAMESPACE; /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Data.Functional code. * * The Initial Developer of the Original Code is * Daisuke Maki. * Portions created by the Initial Developer are Copyright (C) 2005-2007 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ // This is just a alias. // See "Data.Functional.List.list" for the entity of "Data.Functional.List". return { }; }(); }.call(null) ) { } }).call(null); (function(){ if ( !this.Math || (typeof this.Math != 'object' && typeof this.Math != 'function') ) this.Math = new Object(); if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Error || (typeof this.Data.Error != 'object' && typeof this.Data.Error != 'function') ) this.Data.Error = new Object(); if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Functional || (typeof this.Data.Functional != 'object' && typeof this.Data.Functional != 'function') ) this.Data.Functional = new Object(); if ( !this.Data.Functional.Loop || (typeof this.Data.Functional.Loop != 'object' && typeof this.Data.Functional.Loop != 'function') ) this.Data.Functional.Loop = new Object(); if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Functional || (typeof this.Data.Functional != 'object' && typeof this.Data.Functional != 'function') ) this.Data.Functional = new Object(); with ( function(){ with ( Math ) { with ( Data.Error ) { with ( Data.Functional.Loop ) { with ( Data.Functional ) { return function () { var VERSION = '0.5.0'; var NAMESPACE; /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Data.Functional code. * * The Initial Developer of the Original Code is * Daisuke Maki. * Portions created by the Initial Developer are Copyright (C) 2005-2007 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ var proto = Array.prototype; for ( var i in List.prototype ) { if ( typeof proto[i] != "function" ) proto[i] = List.prototype[i]; } proto.head = function ( n ) { if ( n < 0 ) return this.tail(-n); n = ToInteger(n); if ( n > this.length ) throw new RangeError(); return new Iterator(this, n); }; proto.tail = function ( n ) { if ( n < 0 ) return this.head(-n); n = ToInteger(n); if ( n > this.length ) throw new RangeError(); return new Iterator(this, this.length-n); }; proto.iterator = proto.head; proto.reverseHead = function ( n ) { if ( n < 0 ) return this.reverseTail(-n); n = ToInteger(n); if ( n > this.length ) throw new RangeError(); return new ReverseIterator(this, n); }; proto.reverseTail = function ( n ) { if ( n < 0 ) return this.reverseHead(-n); n = ToInteger(n); if ( n > this.length ) throw new RangeError(); return new ReverseIterator(this, this.length-n); }; proto.add = function ( /* variable args */ ) { this.push.apply(this, arguments); return true; }; proto.get = function ( it ) { if ( it instanceof Iterator || it instanceof ReverseIterator ) { if ( it.isBoundTo(this) ) return it.value(); throw new IllegalStateError(); } it = ToInteger(n); if ( it < 0 ) it += this.length; return this[it]; }; proto.set = function ( it, v ) { if ( it instanceof Iterator || it instanceof ReverseIterator ) { if ( it.isBoundTo(this) ) return it.assign(v); throw new IllegalStateError(); } var n = ToInteger(it); if ( n < 0 ) n += this.length; if ( n < 0 ) throw new RangeError("`" + it + "' is too small."); if ( n >= this.length ) throw new RangeError("`" + it + "' is too large."); return this[n] = v; }; proto.insertAt = function ( it, v ) { if ( it instanceof Iterator || it instanceof ReverseIterator ) { if ( it.isBoundTo(this) ) return it.insert(v); throw new IllegalStateError(); } var n = ToInteger(it); if ( n < 0 ) n += this.length; if ( n < 0 ) throw new RangeError("`" + it + "' is too small."); if ( n >= this.length ) throw new RangeError("`" + it + "' is too large."); this.splice(n, 0, v); return v; }; proto.removeAt = function ( it ) { if ( it instanceof Iterator || it instanceof ReverseIterator ) { if ( it.isBoundTo(this) ) return it.remove(); throw new IllegalStateError(); } var n = ToInteger(it); if ( n < 0 ) n += this.length; if ( n < 0 ) throw new RangeError("`" + it + "' is too small."); if ( n >= this.length ) throw new RangeError("`" + it + "' is too large."); return this.splice(n, 1)[0]; }; proto.isEmpty = function ( ) { return this.length == 0; }; proto.empty = function ( ) { this.length = 0; }; proto.size = function ( ) { return this.length; }; proto.copy = proto.toArray = function ( ) { var a = []; for ( var i=0; i < this.length; i++ ) a[i] = this[i]; return a; }; proto.forEach = function ( f ) { f = wrap_for_forEach(this, f); for ( var i=0; i < this.length; i++ ) { try { f(this[i]); } catch ( e ) { if ( e instanceof EndOfLoopException ) { return; } else { throw e; } } } }; proto.fold = proto.foldl = function ( f, s ) { f = wrap_for_fold(this, f, s); for ( var i=0; i < this.length; i++ ) { try { s = f(this[i]); } catch ( e ) { if ( e instanceof EndOfLoopException ) { return e.result; } else { throw e; } } } return s; }; proto.fold1 = proto.foldl1 = function ( f ) { if ( this.length == 0 ) throw new EmptyEnumerationError(); var s = this[0]; f = wrap_for_fold(this, f, s); for ( var i=1; i < this.length; i++ ) { try { s = f(this[i]); } catch ( e ) { if ( e instanceof EndOfLoopException ) { return e.result; } else { throw e; } } } return s; }; proto.foldr = function ( f, s ) { var g = wrap_for_fold(this, function(x,y){return f.call(this,y,x);}, s); for ( var i=this.length-1; i >= 0; i-- ) { try { s = f(this[i]); } catch ( e ) { if ( e instanceof EndOfLoopException ) { return e.result; } else { throw e; } } } return s; }; proto.foldr1 = function ( f ) { if ( this.length == 0 ) throw new EmptyEnumerationError(); var s = this[this.length-1]; var g = wrap_for_fold(this, function(x,y){return f.call(this,y,x);}, s); for ( var i=this.length-2; i >= 0; i-- ) { try { s = g(this[i]); } catch ( e ) { if ( e instanceof EndOfLoopException ) { return e.result; } else { throw e; } } } return s; }; proto.map = function ( f ) { var a = []; f = wrap_for_map(this, f, function(){ a.push.apply(a, arguments); }); for ( var i=0; i < this.length; i++ ) { try { f(this[i]); } catch ( e ) { if ( e instanceof EndOfLoopException ) return a; else throw e; } } return a; }; // Re-define concat and slice var original_concat = proto.concat; proto.concat = function ( /* variable argumentes */ ) { for ( var i=0; i < arguments.length; i++ ) { var v = arguments[i]; if ( v instanceof List ) arguments[i] = v.toArray(); } return original_concat.apply(this, arguments); }; var original_slice = proto.slice; proto.slice = function ( start, end ) { if ( ( start instanceof Iterator && end instanceof Iterator || start instanceof ReverseIterator && end instanceof ReverseIterator ) && start.isBoundTo(this) && end.isBoundTo(this) ) { if ( start.compareTo(end) >= 0 ) return []; var s = []; do { s.push(start.value()); start = start.next(); } while ( !start.equals(end) ); return s; } else { return original_slice.apply(this, arguments); } }; function Iterator ( a, n ) { this._arr = a; this._pos = n; } var proto = Iterator.prototype = new List.Iterator(); proto.constructor = Iterator; proto.isBoundTo = function ( that ) { return this._arr === that; }; proto.isHead = function ( ) { return ToInteger(this._pos) <= 0 || this._arr.length == 0; }; proto.isTail = function ( ) { return ToInteger(this._pos) >= this._arr.length || this._arr.length == 0; }; proto.value = function ( ) { if ( this.isTail() ) return undefined; if ( this.isHead() ) return this._arr[0]; else return this._arr[ToInteger(this._pos)]; }; proto.assign = function ( v ) { if ( this.isTail() ) return this.insert(); if ( this.isHead() ) return this._arr[0] = v; else return this._arr[ToInteger(this._pos)] = v; }; proto.insert = function ( v ) { var i = ToInteger(this._pos); if ( i <= 0 ) i = 0; else i = min(i, this._arr.length); return this._arr.insertAt(i, v); }; proto.remove = function ( ) { if ( this.isTail() ) throw new IllegalStateError("can't remove at the tail of list"); else if ( this.isHead() ) return this._arr.aplice(0, 1)[0]; else return this._arr.splice(this._pos, 1)[0]; }; proto.next = function ( ) { if ( this.isTail() ) throw new NoSuchElement("no next element"); if ( this.isHead() ) return new this.constructor(this._arr, 1); else return new this.constructor(this._arr, this._pos+1); }; proto.previous = function ( ) { if ( this.isHead() ) throw new NoSuchElement("no previous element"); if ( this.isTail() ) return new this.constructor(this._arr, this._arr.length-1); else return new this.constructor(this._arr, this._pos-1); }; proto.compareTo = proto.distance = function ( that ) { if ( !(that instanceof this.constructor) ) return undefined; if ( this._arr !== that._arr ) return undefined; var s = this._arr.length; var l = ToInteger(this._pos); var r = ToInteger(that._pos); if ( l <= 0 && r <= 0 || l >= s && r >= s ) return 0; return l - r; }; function ReverseIterator ( a, n ) { Iterator.apply(this, arguments); } var proto = ReverseIterator.prototype = new List.Iterator(); for ( var i in Iterator.prototype ) { if ( Iterator.prototype.hasOwnProperty(i) && typeof Iterator.prototype[i] == "function" ) { proto[i] = Iterator.prototype[i]; } } proto.constructor = ReverseIterator; proto.value = function ( ) { if ( this.isTail() ) return undefined; if ( this.isHead() ) return this._arr[this._arr.length-1]; else return this._arr[this._arr.length-1-ToInteger(this._pos)]; }; proto.assign = function ( v ) { if ( this.isTail() ) this.insert(v); if ( this.isHead() ) return this._arr[this._arr.length-1] = v; else return this._arr[this._arr.length-1-ToInteger(this._pos)] = v; }; proto.insert = function ( v ) { var i = ToInteger(this._pos); if ( i <= 0 ) i = 0; else i = min(i, this._arr.length); return this._arr.insertAt(this._arr.length-i, v); }; proto.remove = function ( ) { if ( this.isTail() ) throw new IllegalStateError("can't remove at the tail of list"); if ( this.isHead() ) return this._arr.splice(this._arr.length-1, 1)[0]; else return this._arr.splice(this._arr.length-1-ToInteger(this._pos), 1)[0]; }; return { }; }(); } } } } }.call(null) ) { } }).call(null); (function(){ if ( !this.Math || (typeof this.Math != 'object' && typeof this.Math != 'function') ) this.Math = new Object(); if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Error || (typeof this.Data.Error != 'object' && typeof this.Data.Error != 'function') ) this.Data.Error = new Object(); if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Iterator || (typeof this.Data.Iterator != 'object' && typeof this.Data.Iterator != 'function') ) this.Data.Iterator = new Object(); if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Functional || (typeof this.Data.Functional != 'object' && typeof this.Data.Functional != 'function') ) this.Data.Functional = new Object(); if ( !this.Data.Functional.Loop || (typeof this.Data.Functional.Loop != 'object' && typeof this.Data.Functional.Loop != 'function') ) this.Data.Functional.Loop = new Object(); if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Functional || (typeof this.Data.Functional != 'object' && typeof this.Data.Functional != 'function') ) this.Data.Functional = new Object(); if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Cons || (typeof this.Data.Cons != 'object' && typeof this.Data.Cons != 'function') ) this.Data.Cons = new Object(); if ( this.Data.Cons.list === undefined ) this.Data.Cons.list = undefined; if ( this.Data.Cons.InsertAtHeadError === undefined ) this.Data.Cons.InsertAtHeadError = undefined; if ( this.Data.Cons.RemoveHeadError === undefined ) this.Data.Cons.RemoveHeadError = undefined; with ( function(){ with ( Math ) { with ( Data.Error ) { with ( Data.Iterator ) { with ( Data.Functional.Loop ) { with ( Data.Functional ) { with ( Data.Cons ) { return function () { var VERSION = '0.2.0'; var NAMESPACE; /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Data.Cons code. * * The Initial Developer of the Original Code is * Daisuke Maki. * Portions created by the Initial Developer are Copyright (C) 2007 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ NAMESPACE = 'Data.Cons'; var proto = new List(); proto.toString = Cell.prototype.toString; proto.toLocaleString = Cell.prototype.toLocaleString; proto.isNil = Cell.prototype.isNil; Cell.prototype = proto; proto.constructor = Cell; proto = new Cell(); proto.toString = Nil.prototype.toString; proto.toLocaleString = Nil.prototype.toLocaleString; proto.isNil = Nil.prototype.isNil; Nil.prototype = proto; proto.constructor = Nil; function list ( /* variable args */ ) { var head, cell; head = cell = new Cell(null, new Nil()); for ( var i=0; i < arguments.length; i++ ) { cell = cell.cdr = new Cell(arguments[i], cell.cdr); } return head.cdr; } proto = Cell.prototype; proto.iterator = proto.head = function ( n ) { n = ToInteger(n); if ( n < 0 ) return this.tail(-n); try { for ( var it=new Iterator(this, this, null); n > 0; it=it.next(), n-- ); return it; } catch ( e ) { if ( e instanceof NoSuchElementError ) { throw new RangeError(); } else { throw e; } } }; proto.tail = function ( n ) { n = ToInteger(n); if ( n < 0 ) return this.head(-n); for ( var it=new Iterator(this, this, null); !it.isTail(); it=it.next() ); try { for ( ; n > 0; it=it.previous(), n-- ); return it; } catch ( e ) { if ( e instanceof NoSuchElementError ) { throw new RangeError(); } else { throw e; } } }; proto.reverseHead = function ( n ) { return new ReverseIterator(this.tail(n)); }; proto.reverseTail = function ( n ) { return new ReverseIterator(this.head(n)); }; proto.get = function ( n ) { if ( n instanceof Iterator || n instanceof ReverseIterator ) { if ( !n.isBoundTo(this) ) throw new IllegalStateError(); return n.value(); } n = ToInteger(n); if ( n < 0 ) return this.reverse().get(-n-1); var c = this; while ( n !== 0 ) { c = c.cdr; if ( c.isNil() ) return undefined; n--; } return c.car; }; proto.set = function ( n, v ) { if ( n instanceof Iterator || n instanceof ReverseIterator ) { if ( !n.isBoundTo(this) ) throw new IllegalStateError(); return n.assign(v); } return this.head(n).assign(v); }; proto.add = function ( /* variable args */ ) { if ( arguments.length == 0 ) return false; if ( this.isNil() ) throw new InsertAtHeadError(); for ( var c=this; !c.cdr.isNil(); c=c.cdr ); for ( var i=0; i < arguments.length; i++ ) { c = c.cdr = new Cell(arguments[i], new Nil()); } return true; }; proto.shift = function ( ) { throw new RemoveHeadError(); }; proto.unshift = function ( ) { throw new InsertAtHeadError(); }; proto.pop = function ( ) { if ( this.isNil() ) return undefined; if ( this.cdr.isNil() ) throw new RemoveHeadError(); for ( var c=this.cdr; !c.cdr.cdr.isNil(); c=c.cdr ); var r = c.cdr.car; c.cdr = c.cdr.cdr; return r; }; proto.push = function ( /* variable args */ ) { if ( arguments.length == 0 ) return this.size(); if ( this.isEmpty() ) throw new InsertAtHeadError(); for ( var l=1, c=this; !c.cdr.isNil(); l++, c=c.cdr ); for ( var i=0; i < arguments.length; i++, l++ ) { c = c.cdr = new Cell(arguments[i], c.cdr); } return l; }; proto.isEmpty = function ( ) { return this.isNil(); }; proto.empty = function ( ) { if ( this.isEmpty() ) return; throw new RemoveHeadError(); }; proto.size = function ( ) { for ( var i=0, c=this; !c.isNil(); i++, c=c.cdr ); return i; }; proto.copy = function ( ) { if ( this.isNil() ) return new Nil(); var head, cell; head = cell = new Cell(this.car, new Nil()); for ( var c=this.cdr; !c.isNil(); c=c.cdr ) { cell = cell.cdr = new Cell(c.car, cell.cdr); } return head; }; proto.toArray = function ( ) { var a = []; for ( var c=this; !c.isNil(); c=c.cdr ) a.push(c.car); return a; }; proto.reverse = function ( ) { var r = new Nil(); for ( var c=this; !c.isNil(); c=c.cdr ) r = new Cell(c.car, r); return r; }; proto.concat = function ( /* variable args */ ) { var head, cell; head = cell = new Cell(null, new Nil()); arguments[-1] = this; for ( var i=-1; i < arguments.length; i++ ) { var c = arguments[i]; if ( c instanceof List ) { c.forEach(function( it ){ cell = cell.cdr = new Cell(it, cell.cdr); }); } else if ( c instanceof Array ) { for ( var j=0; j < c.length; j++ ) { cell = cell.cdr = new Cell(c[j], cell.cdr); } } else { cell = cell.cdr = new Cell(c, cell.cdr); } } return head.cdr; }; proto.slice = function ( start, end ) { if ( !( ( start instanceof Iterator && end instanceof Iterator || start instanceof ReverseIterator && end instanceof ReverseIterator ) && start.isBoundTo(this) && end.isBoundTo(this) ) ) { try { start = this.head(start); } catch ( e ) { if ( e instanceof RangeError ) { start = start < 0 ? this.head() : this.tail(); } else { throw e; } } if ( end === undefined ) { end = this.tail(); } else { try { end = this.head(end); } catch ( e ) { if ( e instanceof RangeError ) { end = end < 0 ? this.head() : this.tail(); } else { throw e; } } } } if ( start.compareTo(end) >= 0 ) return new Nil(); var head, cell; head = cell = new Cell(null, new Nil()); while ( !start.equals(end) ) { cell = cell.cdr = new Cell(start.value(), cell.cdr); start = start.next(); } return head.cdr; } proto.forEach = function ( f ) { f = wrap_for_forEach(this, f); for ( var c=this; !c.isNil(); c=c.cdr ) { try { f(c.car); } catch ( e ) { if ( e instanceof EndOfLoopException ) { return; } else { throw e; } } } }; proto.fold = proto.foldl = function ( f, s ) { f = wrap_for_fold(this, f, s); for ( var c=this; !c.isNil(); c=c.cdr ) { try { s = f(c.car); } catch ( e ) { if ( e instanceof EndOfLoopException ) { return e.result; } else { throw e; } } } return s; }; proto.fold1 = proto.foldl1 = function ( f ) { if ( this.isEmpty() ) throw new EmptyEnumerationError(); var s = this.car; f = wrap_for_fold(this, f, s); for ( var c=this.cdr; !c.isNil(); c=c.cdr ) { try { s = f(c.car); } catch ( e ) { if ( e instanceof EndOfLoopException ) { return e.result; } else { throw e; } } } return s; }; proto.foldr = function ( f, s ) { return this.reverse().foldl(function(x,y){return f.call(this,y,x);}, s); }; proto.foldr1 = function ( f ) { return this.reverse().foldl1(function(x,y){return f.call(this,y,x);}); }; proto.map = function ( f ) { if ( this.isNil() ) return new Nil(); var head, cell; head = cell = new Cell(null, new Nil()); f = wrap_for_map(this, f, function(){ for ( var i=0; i < arguments.length; i++ ) { cell = cell.cdr = new Cell(arguments[i], cell.cdr); } }); for ( var c=this; !c.isNil(); c=c.cdr ) { try { f(c.car); } catch ( e ) { if ( e instanceof EndOfLoopException ) { return head.cdr; } else { throw e; } } } return head.cdr; } function Iterator ( head, cell, prev ) { this._head = head; this._cell = cell; this._prev = prev; } var proto = Iterator.prototype = new List.Iterator(); proto.constructor = Iterator; proto.isBoundTo = function ( that ) { return this._head === that; }; proto.isHead = function ( ) { return this._head === this._cell; }; proto.isTail = function ( ) { return this._cell.isNil(); }; proto.value = function ( ) { return this._cell.car; }; proto.assign = function ( v ) { if ( this.isTail() ) this.insert(v); else this._cell.car = v; return v; }; proto.insert = function ( v ) { if ( this.isHead() ) throw new InsertAtHeadError(); this._cell = this._prev._cell.cdr = new Cell(v, this._cell.cdr); return v; }; proto.remove = function ( ) { if ( this.isHead() ) throw new RemoveHeadError(); if ( this.isTail() ) throw new IllegalStateError("can't remove at tail"); var r = this._cell.car; this._cell = this._prev._cell.cdr = this._cell.cdr; return r; }; proto.next = function ( ) { if ( this.isTail() ) throw new NoSuchElementError("no next element"); return new Iterator(this._head, this._cell.cdr, this); }; proto.previous = function ( ) { if ( this.isHead() ) throw new NoSuchElementError("no previous element"); return this._prev; }; proto.equals = function ( that ) { return that instanceof Iterator && that.isBoundTo(this._head) && this._cell === that._cell; }; proto.compareTo = proto.distance = function ( that ) { if ( !(that instanceof Iterator && that.isBoundTo(this._head)) ) return undefined; for ( var i=0, l=this._cell, r=that._cell; !l.isNil(); i++, l=l.cdr ) { if ( l === r ) return -i; } for ( var i=1, l=that._cell.cdr, r=this._cell; !l.isNil(); i++, l=l.cdr ) { if ( l === r ) return i; } return void 0; }; function ReverseIterator ( ) { return List.ReverseIterator.apply(this, arguments); } var proto = ReverseIterator.prototype = new List.ReverseIterator(); proto.constructor = ReverseIterator; var InsertAtHeadError = Error.extend( function ( $super, message ) { $super(message); }, { name : NAMESPACE + ".InsertAtHeadError", message: "can't insert at head of cons-list" } ); var RemoveHeadError = Error.extend( function ( $super, message ) { $super(message); }, { name : NAMESPACE + ".RemoveHeadError", message: "can't remove head of cons-list" } ); return { InsertAtHeadError: InsertAtHeadError, RemoveHeadError: RemoveHeadError, list: list }; }(); } } } } } } }.call(null) ) { this.Data.Cons.InsertAtHeadError = InsertAtHeadError; this.Data.Cons.RemoveHeadError = RemoveHeadError; this.Data.Cons.list = list; } }).call(null); (function(){ if ( !this.Math || (typeof this.Math != 'object' && typeof this.Math != 'function') ) this.Math = new Object(); if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Error || (typeof this.Data.Error != 'object' && typeof this.Data.Error != 'function') ) this.Data.Error = new Object(); if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Iterator || (typeof this.Data.Iterator != 'object' && typeof this.Data.Iterator != 'function') ) this.Data.Iterator = new Object(); if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Functional || (typeof this.Data.Functional != 'object' && typeof this.Data.Functional != 'function') ) this.Data.Functional = new Object(); if ( !this.Data.Functional.Loop || (typeof this.Data.Functional.Loop != 'object' && typeof this.Data.Functional.Loop != 'function') ) this.Data.Functional.Loop = new Object(); if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Functional || (typeof this.Data.Functional != 'object' && typeof this.Data.Functional != 'function') ) this.Data.Functional = new Object(); if ( this.Data.LinkedList === undefined ) this.Data.LinkedList = undefined; with ( function(){ with ( Math ) { with ( Data.Error ) { with ( Data.Iterator ) { with ( Data.Functional.Loop ) { with ( Data.Functional ) { with ( Data ) { return function () { var VERSION = '0.3.1'; var NAMESPACE; /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Data.LinkedList module. * * The Initial Developer of the Original Code is * Daisuke Maki. * Portions created by the Initial Developer are Copyright (C) 2005-2007 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ NAMESPACE = 'Data'; function LinkedList ( /* variable arguments */ ) { this._value = undefined; this._prev = this; this._next = this; this._removed = false; this.add.apply(this, arguments); } LinkedList.fromCollection = function ( /* variable args */ ) { var l = new LinkedList(); l.addAll.apply(l, arguments); return l; }; function makeContainer ( v ) { return { _value: v, _removed: false }; } var proto = LinkedList.prototype = new List(); proto.constructor = LinkedList; function nForward ( top, c, n ) { if ( n == 0 ) return c; c = c._next; while ( --n > 0 ) { if ( c === top ) throw new RangeError(); c = c._next; } return c; } function nBackward ( top, c, n ) { if ( n == 0 ) return c; c = c._prev; while ( --n > 0 ) { if ( c === top ) throw new RangeError(); c = c._prev; } return c; } proto.head = function ( n ) { if ( n < 0 ) return this.tail(-n); return new Iterator( this, nForward(this, this._next, ToInteger(n)) ); }; proto.tail = function ( n ) { if ( n < 0 ) return this.head(-n); return new Iterator( this, nBackward(this, this, ToInteger(n)) ); }; proto.reverseHead = function ( n ) { if ( n < 0 ) return this.reverseTail(-n); return new ReverseIterator( this, nBackward(this, this._prev, ToInteger(n)) ); }; proto.reverseTail = function ( n ) { if ( n < 0 ) return this.reverseHead(-n); return new ReverseIterator( this, nBackward(this, this, ToInteger(n)) ); }; proto.iterator = proto.head; proto.add = function ( /* variable args */ ) { if ( !arguments.length ) return false; var it = new Iterator(this, this); for ( var i=0; i < arguments.length; i++ ) it.insert(arguments[i]); return true; }; proto.pop = function ( ) { return (new Iterator(this, this._prev)).remove(); }; proto.shift = function ( ) { return (new Iterator(this, this._next)).remove(); }; proto.unshift = function ( /* variable arguments */ ) { var it = new Iterator(this, this._next); for ( var i=0; i < arguments.length; i++ ) it.insert(arguments[i]); return this.size(); }; proto.isEmpty = function ( ) { return this._next === this; }; proto.empty = function ( ) { this._prev = this._next = this; }; proto.size = function ( ) { for ( var i=0, c=this._next; c !== this; ++i, c=c._next ); return i; }; proto.copy = function ( ) { var l = this.emptyCopy(); for ( var c=this._next; c !== this; c=c._next ) l.add(c._value); return l; }; proto.toArray = function ( ) { var a = []; for ( var c=this._next; c !== this; c=c._next ) a.push(c._value); return a; }; proto.forEach = function ( f ) { f = wrap_for_forEach(this, f); for ( var c=this._next; c !== this; c=c._next ) { try { f(c._value); } catch ( e ) { if ( e instanceof EndOfLoopException ) { return; } else { throw e; } } } } proto.fold = proto.foldl = function ( f, s ) { f = wrap_for_fold(this, f, s); for ( var c=this._next; c !== this; c=c._next ) { try { s = f(c._value); } catch ( e ) { if ( e instanceof EndOfLoopException ) { return e.result; } else { throw e; } } } return s; }; proto.fold1 = proto.foldl1 = function ( f ) { if ( this.isEmpty() ) throw new EmptyEnumerationError(); var s = this._next._value; f = wrap_for_fold(this, f, s); for ( var c=this._next._next; c !== this; c=c._next ) { try { s = f(c._value); } catch ( e ) { if ( e instanceof EndOfLoopException ) { return e.result; } else { throw e; } } } return s; }; proto.foldr = function ( f, s ) { var g = wrap_for_fold(this, function(x,y){return f.call(this,y,x);}, s); for ( var c=this._prev; c !== this; c=c._prev ) { try { s = f(c._value); } catch ( e ) { if ( e instanceof EndOfLoopException ) { return e.result; } else { throw e; } } } return s; }; proto.foldr1 = function ( f ) { if ( this.isEmpty() ) throw new EmptyEnumerationError(); var s = this._prev._value; var g = wrap_for_fold(this, function(x,y){return f.call(this,y,x);}, s); for ( var c=this._prev._prev; c !== this; c=c._prev ) { try { s = g(c._value); } catch ( e ) { if ( e instanceof EndOfLoopException ) { return e.result; } else { throw e; } } } return s; }; proto.map = function ( f ) { var l = new LinkedList(); f = wrap_for_map(this, f, function(){ l.add.apply(l, arguments); }); for ( var c=this._next; c !== this; c=c._next ) { try { f(c._value); } catch ( e ) { if ( e instanceof EndOfLoopException ) return l; else throw e; } } return l; }; // comparison function about containers function comp ( top, l, r ) { if ( l === r ) return 0; do { l = l._next; if ( l === r ) return -1; } while ( l !== top ); return 1; } // distance function about containers function dist ( top, l, r ) { for ( var i=0, it=l; it !== top; i--, it=it._next ) { if ( it === r ) return i; } for ( var i=1, it=r._next; it !== top; i++, it=it._next ) { if ( it === l ) return i; } return undefined; } function Iterator ( l, c ) { this._top = l; // LinkedList object which this iterator belongs to. this._pos = c; // Current position; abstractly iterator points to just before this container } var proto = Iterator.prototype = new List.Iterator(); proto.constructor = Iterator; function validate ( it ) { while ( it._pos._removed ) { it._pos = it._pos._next; } } proto.isBoundTo = function ( that ) { return this._top === that; }; proto.equals = function ( that ) { if ( !(that instanceof Iterator && that.isBoundTo(this._top)) ) return false; validate(this); validate(that); return this._pos === that._pos; }; proto.compareTo = function ( that ) { if ( !(that instanceof Iterator && that.isBoundTo(this._top)) ) return undefined; validate(this); validate(that); return comp(this._top, this._pos, that._pos); }; proto.distance = function ( that ) { if ( !(that instanceof Iterator && that.isBoundTo(this._top)) ) return undefined; validate(this); validate(that); return dist(this._top, this._pos, that._pos); }; proto.isHead = function ( ) { validate(this); return this._pos === this._top._next; }; proto.isTail = function ( ) { validate(this); return this._pos === this._top; }; proto.next = function ( ) { if ( this.isTail() ) throw new NoSuchElementError("no next element"); return new Iterator(this._top, this._pos._next); }; proto.previous = function ( ) { if ( this.isHead() ) throw new NoSuchElementError("no previous element"); return new Iterator(this._top, this._pos._prev); }; proto.value = function ( ) { validate(this); return this._pos._value; }; proto.assign = function ( v ) { if ( this.isTail() ) return this.insert(v); else return this._pos._value = v; }; proto.insert = function ( v ) { validate(this); var c = makeContainer(v); c._prev = this._pos._prev; c._next = this._pos; this._pos._prev = this._pos._prev._next = c; return v; }; proto.remove = function ( ) { if ( this.isTail() ) throw new IllegalStateError("can't remove at the tail of list"); this._pos._prev._next = this._pos._next; this._pos._next._prev = this._pos._prev; this._pos._removed = true; return this._pos._value; }; function ReverseIterator ( l, c ) { this._top = l; // LinkedList object which this iterator belongs to. this._pos = c; // Current position; abstractly iterator points to just before this container } var proto = ReverseIterator.prototype = new List.Iterator(); for ( var i in Iterator.prototype ) proto[i] = Iterator.prototype[i]; proto.constructor = ReverseIterator; function rvalidate ( it ) { while ( it._pos._removed ) { it._pos = it._pos._prev; } } proto.isBoundTo = Iterator.prototype.isBoundTo; proto.equals = function ( that ) { if ( !(that instanceof Iterator && that.isBoundTo(this._top)) ) return false; rvalidate(this); rvalidate(that); return this._pos === that._pos; }; proto.compareTo = function ( that ) { if ( !(that instanceof Iterator && that.isBoundTo(this._top)) ) return undefined; rvalidate(this); rvalidate(that); return -comp(this._top, this._pos, that._pos); }; proto.distance = function ( that ) { if ( !(that instanceof Iterator && that.isBoundTo(this._top)) ) return undefined; rvalidate(this); rvalidate(that); var d = dist(this._top, this._pos, that._pos); return isNaN(d) ? d : -d; }; proto.isHead = function ( ) { rvalidate(this); return this._pos === this._top._prev; }; proto.isTail = function ( ) { rvalidate(this); return this._pos === this._top; }; proto.next = function ( ) { if ( this.isTail() ) throw new NoSuchElementError("no next element"); return new ReverseIterator(this._top, this._pos._prev); }; proto.previous = function ( ) { if ( this.isHead() ) throw new NoSuchElementError("no previous element"); return new ReverseIterator(this._top, this._pos._next); }; proto.value = function ( ) { rvalidate(this); return this._pos._value; }; proto.assign = Iterator.prototype.assign; proto.insert = function ( v ) { rvalidate(this); var c = makeContainer(v); c._next = this._pos._next; c._prev = this._pos; this._pos._next = this._pos._next._prev = c; return v; }; proto.remove = Iterator.prototype.remove; return { LinkedList: LinkedList }; }(); } } } } } } }.call(null) ) { this.Data.LinkedList = LinkedList; } }).call(null); (function(){ if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Error || (typeof this.Data.Error != 'object' && typeof this.Data.Error != 'function') ) this.Data.Error = new Object(); if ( !this.Concurrent || (typeof this.Concurrent != 'object' && typeof this.Concurrent != 'function') ) this.Concurrent = new Object(); if ( this.Concurrent.Thread === undefined ) this.Concurrent.Thread = undefined; with ( function(){ with ( Data.Error ) { with ( Concurrent ) { return function () { var VERSION = '0.1.0'; var NAMESPACE; /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Concurrent.Thread code. * * The Initial Developer of the Original Code is * Daisuke Maki. * Portions created by the Initial Developer are Copyright (C) 2006-2007 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ NAMESPACE = 'Concurrent'; var current_thread = null; // Retains the current thread. function NoContinuationException ( r ) { this.ret_val = r; } function initial_continuation_procedure ( ret_val ) { throw new NoContinuationException(ret_val); } function NoExceptionHandlerException ( e ) { this.thrown = e; } function initial_exception_handler ( e ) { throw new NoExceptionHandlerException(e); } var initial_continuation = { this_val : null, procedure: initial_continuation_procedure, exception: { this_val : null, procedure: initial_exception_handler } }; // Cyclic reference ensures that at least one exceptinal continuation always exists. initial_continuation.exception.exception = initial_continuation.exception; function Thread ( ) { throw new Error("Thread cannot be instantiated directly."); } function THREAD ( t ) { this._triplet = t; // {continuation:{...}, timeout:int|undefined, ret_val:any} this._is_ended = 0; // 0:running, -1:throw, 1:return this._join_thread = null; this._joined_list = new Data.LinkedList(); this._timerID = undefined; standBy.call(this, 0); } var proto = THREAD.prototype = Thread.prototype; +function(){ var name = "[object " + NAMESPACE + ".Thread]" proto.toString = function ( ) { return name; }; }(); // Cancel timeout event. function cancel ( ) { if ( this._timerID ) { clearTimeout(this._timerID); this._timerID = undefined; } } // Reserve execution of the next step after t msec. function standBy ( t ) { cancel.call(this); var self = this; this._timerID = setTimeout( function(){ doNext.call(self); }, Number(t) || 2 // some version of IE occationally fails to // context-switch with timeout interval less than 2. ); } // Cut "join" link. function unjoin ( ) { if ( this._join_thread ) { var self = this; var it = this._join_thread._joined_list.head().find(function( it ){ return it === self; }); it.remove(); this._join_thread = null; } } Thread.TIME_SLICE = 20; function doNext ( ) { cancel.call(this); var triplet = this._triplet; this._triplet = null; try { current_thread = this; var limit = (new Date).valueOf() + Thread.TIME_SLICE; do { try { triplet = triplet.continuation.procedure.call( triplet.continuation.this_val, triplet.ret_val ); } catch ( e ) { if ( e instanceof NoContinuationException ) { this._is_ended = 1; this._result = e.ret_val; while ( !this._joined_list.isEmpty() ) { var it = this._joined_list.head().value(); unjoin.call(it); it._triplet.ret_val = e.ret_val; standBy.call(it); } this._joined_list = null; return; } else if ( e instanceof NoExceptionHandlerException ) { e = e.thrown; var joined_list = this._joined_list; this._joined_list = null; this._is_ended = -1; this._result = e; if ( !joined_list.isEmpty() ) { while ( !joined_list.isEmpty() ) { joined_list.head().value().notify(e); // "notify" implies "unjoin". } } else if ( !(e instanceof KillException) ) { throw e; } return; } else { triplet.continuation = triplet.continuation.exception; triplet.ret_val = e; } } } while ( triplet.timeout === undefined && (new Date).valueOf() < limit ); } finally { current_thread = null; } this._triplet = triplet; if ( triplet.timeout < 0 ) { /* Do nothing. */ } else { standBy.call(this, triplet.timeout); } } proto.notify = function ( e ) { if ( current_thread === this ) throw e; if ( this._is_ended ) throw new NotAliveError(); cancel.call(this); unjoin.call(this); this._triplet.continuation = this._triplet.continuation.exception; this._triplet.ret_val = e; standBy.call(this); return e; }; proto.kill = function ( s ) { return this.notify( arguments.length ? new KillException(s) : new KillException() ); }; proto.join = function ( ) { throw new Error("can't `join' in non-compiled functions"); }; proto.join.$Concurrent_Thread_compiled = function ( this_val, args, cont ) { //!TODO: check cyclic-join if ( this_val._is_ended > 0 ) { // this thread has already ended normally return { continuation:cont, ret_val:this_val._result, timeout:undefined }; } else if ( this_val._is_ended < 0 ) { // this thread has already ended by exception throw this_val._result; } else { this_val._joined_list.add(current_thread); current_thread._join_thread = this_val; return { continuation:cont, timeout:-1 }; } }; Thread.create = function ( f /* , ... */ ) { if ( typeof f != "function" ) throw new TypeError("can't create new thread from non-function value"); if ( typeof f.$Concurrent_Thread_compiled !== "function" ) f = this.compile(f); return f.async(null, Array.prototype.slice.call(arguments, 1, arguments.length)); }; Thread.self = function ( ) { return current_thread; }; Thread.sleep = function ( ) { throw new Error("can't `sleep' in non-compiled functions"); }; Thread.sleep.$Concurrent_Thread_compiled = function ( this_val, args, cont ) { return { continuation: cont, ret_val : undefined, timeout : args[0] > 0 ? args[0] : 0 }; }; Thread.stop = function ( ) { throw new Error("can't `stop' in non-compiled functions"); }; Thread.stop.$Concurrent_Thread_compiled = function ( this_val, args, cont ) { return { continuation: cont, ret_val : undefined, timeout : -1 }; }; Thread.yield = function ( ) { throw new Error("can't `yield' in non-compiled functions"); }; Thread.yield.$Concurrent_Thread_compiled = function ( this_val, args, cont ) { return { continuation: cont, ret_val : undefined, timeout : 0 }; }; var KillException = Thread.KillException = Exception.extend( function ( $super, message ) { $super(message); }, { name : NAMESPACE + ".Thread.KillException", message: "thread killed" } ); var NotAliveError = Thread.NotAliveError = Error.extend( function ( $super, message ) { $super(message); }, { name : NAMESPACE + ".Thread.NotAliveError", message: "thread not alive" } ); // Extends Function object. var proto = Function.prototype; proto.apply.$Concurrent_Thread_compiled = function ( this_val, args, cont ) { if ( typeof this_val.$Concurrent_Thread_compiled == "function" ) { return this_val.$Concurrent_Thread_compiled(args[0], args[1], cont); } else { return { continuation: cont, ret_val : this_val.apply(args[0], args[1]) }; } }; proto.call.$Concurrent_Thread_compiled = function ( this_val, args, cont ) { if ( typeof this_val.$Concurrent_Thread_compiled == "function" ) { return this_val.$Concurrent_Thread_compiled(args[0], Array.prototype.slice.call(args, 1, args.length), cont); } else { return { continuation: cont, ret_val : this_val.apply(args[0], Array.prototype.slice.call(args, 1, args.length)) }; } }; proto.async = function ( this_val, args ) { if ( typeof this.$Concurrent_Thread_compiled != "function" ) throw new Error("this is not a compiled function"); if ( args === void 0 ) args = []; // IE6 does not allow null or undefined-value as the second argument of Function.prototype.apply. That does not conform to ECMA262-3! return new THREAD( this.$Concurrent_Thread_compiled( this_val, args, initial_continuation ) ); }; return { Thread: Thread }; }(); } } }.call(null) ) { this.Concurrent.Thread = Thread; } }).call(null); (function(){ if ( !this.Concurrent || (typeof this.Concurrent != 'object' && typeof this.Concurrent != 'function') ) this.Concurrent = new Object(); if ( !this.Concurrent.Thread || (typeof this.Concurrent.Thread != 'object' && typeof this.Concurrent.Thread != 'function') ) this.Concurrent.Thread = new Object(); if ( !this.Concurrent.Thread.Http || (typeof this.Concurrent.Thread.Http != 'object' && typeof this.Concurrent.Thread.Http != 'function') ) this.Concurrent.Thread.Http = new Object(); if ( this.Concurrent.Thread.Http.send === undefined ) this.Concurrent.Thread.Http.send = undefined; if ( this.Concurrent.Thread.Http.get === undefined ) this.Concurrent.Thread.Http.get = undefined; if ( this.Concurrent.Thread.Http.post === undefined ) this.Concurrent.Thread.Http.post = undefined; with ( function(){ with ( Concurrent.Thread.Http ) { return function () { var VERSION = '0.0.0'; var NAMESPACE; /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Concurrent.Thread code. * * The Initial Developer of the Original Code is * Daisuke Maki. * Portions created by the Initial Developer are Copyright (C) 2006-2007 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ NAMESPACE = 'Concurrent.Thread.Http'; var createXMLHttpRequest; // Set up according to environment. try { new XMLHttpRequest(); createXMLHttpRequest = function ( ) { return new XMLHttpRequest(); }; } catch ( e ) { try { // MSXML3 or later new ActiveXObject("Msxml2.XMLHTTP"); createXMLHttpRequest = function ( ) { return new ActiveXObject("Msxml2.XMLHTTP"); }; } catch ( e ) { try { // MSXML up to 2 new ActiveXObject("Microsoft.XMLHTTP"); createXMLHttpRequest = function ( ) { return new ActiveXObject("Microsoft.XMLHTTP"); }; } catch ( e ) { throw new Error(NAMESPACE + ": can't load XMLHttpRequest object"); } } } function send ( method, url, body, headers ) { throw new Error(NAMESPACE + ".send is unusable in non-compiled function"); } var LoadedException = {}; send.$Concurrent_Thread_compiled = function ( $this, $args, $cont ) { var method=$args[0], url=$args[1], body=$args[2], headers=$args[3]; if ( !headers || !(headers instanceof Array) ) headers = []; var req = createXMLHttpRequest(); req.open(method, url, true); for ( var i=0; i < headers.length; i+=2 ) { req.setRequestHeader(headers[i], headers[i+1]); } var self = Concurrent.Thread.self(); var loaded = false; var cache_hit = true; req.onreadystatechange = function ( ) { if ( req.readyState == 4 ) { loaded = true; if ( !cache_hit ) self.notify(LoadedException); } }; req.send(body); // Firefox occasionally causes "onload" event here. Maybe, it occurs in case of cache-hit. cache_hit = false; if ( loaded ) { return { continuation: $cont, ret_val : req, timeout : undefined }; } else { var ex_handler = { procedure: function ( e ) { if ( e === LoadedException ) { return { continuation: $cont, ret_val : req, timeout : undefined }; } else { try{ req.abort(); }catch(_){} // IE less than 7 does not support "abort". return { continuation: $cont.exception, ret_val : e, timeout : undefined }; } }, this_val : null }; ex_handler.exception = ex_handler; // Cyclic reference assures to abort request. return { timeout : -1, continuation: { procedure: null, this_val : null, exception: ex_handler } }; } }; function get ( url, headers ) { throw new Error(NAMESPACE + ".get is unusable in non-compiled function"); } get.$Concurrent_Thread_compiled = function ($this, $args, $cont) { return send.$Concurrent_Thread_compiled( null, ["GET", $args[0], $args[1], null], $cont ); } function post ( url, body, headers ) { throw new Error(NAMESPACE + ".post is unusable in non-compiled function"); } post.$Concurrent_Thread_compiled = function ( $this, $args, $cont ) { var url=$args[0], body=$args[1], headers=$args[2]; if ( typeof body == "object" ) { var vals = []; for ( var i in body ) { if ( body.hasOwnProperty(i) ) { vals.push( encodeURIComponent(i) + "=" + encodeURIComponent(body[i]) ); } } body = vals.join("&"); } if ( !headers || !(headers instanceof Array) ) headers = []; var content_type_exists = false; for ( var i=0; i < headers.length; i+=2 ) { if ( String(headers[i]).match(/^Content-type$/i) ) { content_type_exists = true; break; } } if ( !content_type_exists ) { headers = headers.concat("Content-type", "application/x-www-form-urlencoded"); } return send.$Concurrent_Thread_compiled( null, ["POST", url, body, headers], $cont ); }; return { send: send, post: post, get: get }; }(); } }.call(null) ) { this.Concurrent.Thread.Http.send = send; this.Concurrent.Thread.Http.post = post; this.Concurrent.Thread.Http.get = get; } }).call(null); (function(){ if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Cons || (typeof this.Data.Cons != 'object' && typeof this.Data.Cons != 'function') ) this.Data.Cons = new Object(); if ( !this.Data.Cons.Util || (typeof this.Data.Cons.Util != 'object' && typeof this.Data.Cons.Util != 'function') ) this.Data.Cons.Util = new Object(); if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Error || (typeof this.Data.Error != 'object' && typeof this.Data.Error != 'function') ) this.Data.Error = new Object(); if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Cons || (typeof this.Data.Cons != 'object' && typeof this.Data.Cons != 'function') ) this.Data.Cons = new Object(); if ( this.Data.Cons.Util.last === undefined ) this.Data.Cons.Util.last = undefined; if ( this.Data.Cons.Util.adder === undefined ) this.Data.Cons.Util.adder = undefined; if ( this.Data.Cons.Util.concat === undefined ) this.Data.Cons.Util.concat = undefined; with ( function(){ with ( Data.Error ) { with ( Data.Cons ) { with ( Data.Cons.Util ) { return function () { var VERSION = '0.0.0'; var NAMESPACE; /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Data.Cons code. * * The Initial Developer of the Original Code is * Daisuke Maki. * Portions created by the Initial Developer are Copyright (C) 2007 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ NAMESPACE = 'Data.Cons.Util'; function last ( c ) { if ( !(c instanceof Cell) ) throw new TypeError("argument is not cons-list"); if ( c.isNil() ) return c; if ( !(c.cdr instanceof Cell) ) throw new TypeError("argument is not cons-list"); while ( !c.cdr.isNil() ) { c = c.cdr; if ( !(c.cdr instanceof Cell) ) throw new TypeError("argument is not cons-list"); } return c; } function adder ( c ) { c = last(c); if ( c.isNil() ) throw new IllegalStateError("can't append to nil"); return function ( /* variable arguments */ ) { c = last(c); for ( var i=0; i < arguments.length; i++ ) { c = c.cdr = new Cell(arguments[i], c.cdr); } }; } function concat ( /* variable arguments */ ) { if ( arguments.length == 0 ) return nil(); var head = arguments[0]; var cell = last(head); for ( var i=1; i < arguments.length; i++ ) { cell.cdr = arguments[i]; cell = last(cell); } return head; } return { adder: adder, concat: concat, last: last }; }(); } } } }.call(null) ) { this.Data.Cons.Util.adder = adder; this.Data.Cons.Util.concat = concat; this.Data.Cons.Util.last = last; } }).call(null); (function(){ if ( !this.Concurrent || (typeof this.Concurrent != 'object' && typeof this.Concurrent != 'function') ) this.Concurrent = new Object(); if ( !this.Concurrent.Thread || (typeof this.Concurrent.Thread != 'object' && typeof this.Concurrent.Thread != 'function') ) this.Concurrent.Thread = new Object(); if ( !this.Concurrent.Thread.Compiler || (typeof this.Concurrent.Thread.Compiler != 'object' && typeof this.Concurrent.Thread.Compiler != 'function') ) this.Concurrent.Thread.Compiler = new Object(); if ( this.Concurrent.Thread.Compiler.isAlpha === undefined ) this.Concurrent.Thread.Compiler.isAlpha = undefined; if ( this.Concurrent.Thread.Compiler.isDigit === undefined ) this.Concurrent.Thread.Compiler.isDigit = undefined; if ( this.Concurrent.Thread.Compiler.isHexDigit === undefined ) this.Concurrent.Thread.Compiler.isHexDigit = undefined; if ( this.Concurrent.Thread.Compiler.isLineTerminator === undefined ) this.Concurrent.Thread.Compiler.isLineTerminator = undefined; if ( this.Concurrent.Thread.Compiler.isSpace === undefined ) this.Concurrent.Thread.Compiler.isSpace = undefined; if ( this.Concurrent.Thread.Compiler.isFormatChar === undefined ) this.Concurrent.Thread.Compiler.isFormatChar = undefined; if ( this.Concurrent.Thread.Compiler.isIdentifierStart === undefined ) this.Concurrent.Thread.Compiler.isIdentifierStart = undefined; if ( this.Concurrent.Thread.Compiler.isIdentifierPart === undefined ) this.Concurrent.Thread.Compiler.isIdentifierPart = undefined; with ( function(){ with ( Concurrent.Thread.Compiler ) { return function () { var VERSION = '0.0.0'; var NAMESPACE; /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Concurrent.Thread code. * * The Initial Developer of the Original Code is * Daisuke Maki. * Portions created by the Initial Developer are Copyright (C) 2006-2007 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ NAMESPACE = 'Concurrent.Thread.Compiler'; function isAlpha ( c ) { c = c.charCodeAt(0); // #generated# Last update: Tue, 01 Aug 2006 16:31:50 +0900 return c <= 0x5A ? 0x41 <= c : 0x61 <= c && c <= 0x7A; // #/generated# } function isDigit ( c ) { c = c.charCodeAt(0); // #generated# Last update: Tue, 01 Aug 2006 21:02:15 +0900 return 0x30 <= c && c <= 0x39; // #/generated# } function isHexDigit ( c ) { c = c.charCodeAt(0); // #generated# Last update: Tue, 01 Aug 2006 15:49:52 +0900 return c <= 0x46 ? c <= 0x39 ? 0x30 <= c : 0x41 <= c : 0x61 <= c && c <= 0x66; // #/generated# } function isLineTerminator ( c ) { switch ( c.charCodeAt(0) ) { case 0x000A: // Line Feed case 0x000D: // Carriage Return case 0x2028: // Line separator case 0x2029: // Paragraph separator return true; default: return false; } } function isSpace ( c ) { c = c.charCodeAt(0); if ( c <= 255 ) { switch ( c ) { case 0x0009: // Tab case 0x000B: // Vertical Tab case 0x000C: // Form Feed case 0x0020: // Space case 0x00A0: // No-break space return true; default: return false; } } else { // the following code is derived from the Unicode category Zs based on: // http://www.unicode.org/Public/UNIDATA/extracted/DerivedGeneralCategory.txt // #generated# Last update: Tue, 01 Aug 2006 01:57:18 +0900 return c <= 0x180E ? c <= 0xA0 ? c <= 0x20 ? 0x20 <= c : 0xA0 <= c : c <= 0x1680 ? 0x1680 <= c : 0x180E <= c : c <= 0x202F ? c <= 0x200A ? 0x2000 <= c : 0x202F <= c : c <= 0x205F ? 0x205F <= c : c === 0x3000; // #/generated# } } function isFormatChar ( c ) { c = c.charCodeAt(0); if ( c <= 127 ) return false; // optimization for ASCII characters // the following code is derived from the Unicode category Cf based on: // http://www.unicode.org/Public/UNIDATA/extracted/DerivedGeneralCategory.txt // #generated# Last update: Tue, 01 Aug 2006 01:50:39 +0900 return c <= 0x202E ? c <= 0x70F ? c <= 0x603 ? c <= 0xAD ? 0xAD <= c : 0x600 <= c : c <= 0x6DD ? 0x6DD <= c : 0x70F <= c : c <= 0x200F ? c <= 0x17B5 ? 0x17B4 <= c : 0x200B <= c : 0x202A <= c : c <= 0xFFFB ? c <= 0x206F ? c <= 0x2063 ? 0x2060 <= c : 0x206A <= c : c <= 0xFEFF ? 0xFEFF <= c : 0xFFF9 <= c : c <= 0xE0001 ? c <= 0x1D17A ? 0x1D173 <= c : 0xE0001 <= c : 0xE0020 <= c && c <= 0xE007F; // #/generated# } function isIdentifierStart ( c ) { var c = c.charCodeAt(0); switch ( c ) { case 0x24: // '$' case 0x5F: // '_' return true; } // the following code is derived from the Unicode category Lu, Ll, Lt, Lm, Lo, and Nl based on: // http://www.unicode.org/Public/UNIDATA/extracted/DerivedGeneralCategory.txt // #generated# Last update: Tue, 01 Aug 2006 01:47:30 +0900 return c <= 0x1731 ? c <= 0xB95 ? c <= 0x961 ? c <= 0x587 ? c <= 0x37D ? c <= 0xD6 ? c <= 0xAA ? c <= 0x7A ? c <= 0x5A ? 0x41 <= c : 0x61 <= c : 0xAA <= c : c <= 0xBA ? c <= 0xB5 ? 0xB5 <= c : 0xBA <= c : 0xC0 <= c : c <= 0x2D1 ? c <= 0x2C1 ? c <= 0xF6 ? 0xD8 <= c : 0xF8 <= c : 0x2C6 <= c : c <= 0x2EE ? c <= 0x2E4 ? 0x2E0 <= c : 0x2EE <= c : 0x37A <= c : c <= 0x3F5 ? c <= 0x38C ? c <= 0x38A ? c <= 0x386 ? 0x386 <= c : 0x388 <= c : 0x38C <= c : c <= 0x3CE ? c <= 0x3A1 ? 0x38E <= c : 0x3A3 <= c : 0x3D0 <= c : c <= 0x556 ? c <= 0x513 ? c <= 0x481 ? 0x3F7 <= c : 0x48A <= c : 0x531 <= c : c <= 0x559 ? 0x559 <= c : 0x561 <= c : c <= 0x710 ? c <= 0x6D3 ? c <= 0x63A ? c <= 0x5F2 ? c <= 0x5EA ? 0x5D0 <= c : 0x5F0 <= c : 0x621 <= c : c <= 0x66F ? c <= 0x64A ? 0x640 <= c : 0x66E <= c : 0x671 <= c : c <= 0x6EF ? c <= 0x6E6 ? c <= 0x6D5 ? 0x6D5 <= c : 0x6E5 <= c : 0x6EE <= c : c <= 0x6FF ? c <= 0x6FC ? 0x6FA <= c : 0x6FF <= c : 0x710 <= c : c <= 0x7F5 ? c <= 0x7A5 ? c <= 0x76D ? c <= 0x72F ? 0x712 <= c : 0x74D <= c : 0x780 <= c : c <= 0x7EA ? c <= 0x7B1 ? 0x7B1 <= c : 0x7CA <= c : 0x7F4 <= c : c <= 0x93D ? c <= 0x939 ? c <= 0x7FA ? 0x7FA <= c : 0x904 <= c : 0x93D <= c : c <= 0x950 ? 0x950 <= c : 0x958 <= c : c <= 0xA8D ? c <= 0x9F1 ? c <= 0x9B2 ? c <= 0x990 ? c <= 0x98C ? c <= 0x97F ? 0x97B <= c : 0x985 <= c : 0x98F <= c : c <= 0x9B0 ? c <= 0x9A8 ? 0x993 <= c : 0x9AA <= c : 0x9B2 <= c : c <= 0x9CE ? c <= 0x9BD ? c <= 0x9B9 ? 0x9B6 <= c : 0x9BD <= c : 0x9CE <= c : c <= 0x9E1 ? c <= 0x9DD ? 0x9DC <= c : 0x9DF <= c : 0x9F0 <= c : c <= 0xA36 ? c <= 0xA28 ? c <= 0xA10 ? c <= 0xA0A ? 0xA05 <= c : 0xA0F <= c : 0xA13 <= c : c <= 0xA33 ? c <= 0xA30 ? 0xA2A <= c : 0xA32 <= c : 0xA35 <= c : c <= 0xA5E ? c <= 0xA5C ? c <= 0xA39 ? 0xA38 <= c : 0xA59 <= c : 0xA5E <= c : c <= 0xA74 ? 0xA72 <= c : 0xA85 <= c : c <= 0xB28 ? c <= 0xABD ? c <= 0xAB0 ? c <= 0xAA8 ? c <= 0xA91 ? 0xA8F <= c : 0xA93 <= c : 0xAAA <= c : c <= 0xAB9 ? c <= 0xAB3 ? 0xAB2 <= c : 0xAB5 <= c : 0xABD <= c : c <= 0xB0C ? c <= 0xAE1 ? c <= 0xAD0 ? 0xAD0 <= c : 0xAE0 <= c : 0xB05 <= c : c <= 0xB10 ? 0xB0F <= c : 0xB13 <= c : c <= 0xB61 ? c <= 0xB39 ? c <= 0xB33 ? c <= 0xB30 ? 0xB2A <= c : 0xB32 <= c : 0xB35 <= c : c <= 0xB5D ? c <= 0xB3D ? 0xB3D <= c : 0xB5C <= c : 0xB5F <= c : c <= 0xB8A ? c <= 0xB83 ? c <= 0xB71 ? 0xB71 <= c : 0xB83 <= c : 0xB85 <= c : c <= 0xB90 ? 0xB8E <= c : 0xB92 <= c : c <= 0xEB0 ? c <= 0xD28 ? c <= 0xC61 ? c <= 0xBB9 ? c <= 0xB9F ? c <= 0xB9C ? c <= 0xB9A ? 0xB99 <= c : 0xB9C <= c : 0xB9E <= c : c <= 0xBAA ? c <= 0xBA4 ? 0xBA3 <= c : 0xBA8 <= c : 0xBAE <= c : c <= 0xC28 ? c <= 0xC10 ? c <= 0xC0C ? 0xC05 <= c : 0xC0E <= c : 0xC12 <= c : c <= 0xC39 ? c <= 0xC33 ? 0xC2A <= c : 0xC35 <= c : 0xC60 <= c : c <= 0xCBD ? c <= 0xCA8 ? c <= 0xC90 ? c <= 0xC8C ? 0xC85 <= c : 0xC8E <= c : 0xC92 <= c : c <= 0xCB9 ? c <= 0xCB3 ? 0xCAA <= c : 0xCB5 <= c : 0xCBD <= c : c <= 0xD0C ? c <= 0xCE1 ? c <= 0xCDE ? 0xCDE <= c : 0xCE0 <= c : 0xD05 <= c : c <= 0xD10 ? 0xD0E <= c : 0xD12 <= c : c <= 0xE82 ? c <= 0xDBD ? c <= 0xD96 ? c <= 0xD61 ? c <= 0xD39 ? 0xD2A <= c : 0xD60 <= c : 0xD85 <= c : c <= 0xDBB ? c <= 0xDB1 ? 0xD9A <= c : 0xDB3 <= c : 0xDBD <= c : c <= 0xE33 ? c <= 0xE30 ? c <= 0xDC6 ? 0xDC0 <= c : 0xE01 <= c : 0xE32 <= c : c <= 0xE46 ? 0xE40 <= c : 0xE81 <= c : c <= 0xE9F ? c <= 0xE8A ? c <= 0xE88 ? c <= 0xE84 ? 0xE84 <= c : 0xE87 <= c : 0xE8A <= c : c <= 0xE97 ? c <= 0xE8D ? 0xE8D <= c : 0xE94 <= c : 0xE99 <= c : c <= 0xEA7 ? c <= 0xEA5 ? c <= 0xEA3 ? 0xEA1 <= c : 0xEA5 <= c : 0xEA7 <= c : c <= 0xEAB ? 0xEAA <= c : 0xEAD <= c : c <= 0x1258 ? c <= 0x102A ? c <= 0xF00 ? c <= 0xEC4 ? c <= 0xEBD ? c <= 0xEB3 ? 0xEB2 <= c : 0xEBD <= c : 0xEC0 <= c : c <= 0xEDD ? c <= 0xEC6 ? 0xEC6 <= c : 0xEDC <= c : 0xF00 <= c : c <= 0xF8B ? c <= 0xF6A ? c <= 0xF47 ? 0xF40 <= c : 0xF49 <= c : 0xF88 <= c : c <= 0x1027 ? c <= 0x1021 ? 0x1000 <= c : 0x1023 <= c : 0x1029 <= c : c <= 0x11A2 ? c <= 0x10FA ? c <= 0x10C5 ? c <= 0x1055 ? 0x1050 <= c : 0x10A0 <= c : 0x10D0 <= c : c <= 0x1159 ? c <= 0x10FC ? 0x10FC <= c : 0x1100 <= c : 0x115F <= c : c <= 0x124D ? c <= 0x1248 ? c <= 0x11F9 ? 0x11A8 <= c : 0x1200 <= c : 0x124A <= c : c <= 0x1256 ? 0x1250 <= c : 0x1258 <= c : c <= 0x1315 ? c <= 0x12BE ? c <= 0x128D ? c <= 0x1288 ? c <= 0x125D ? 0x125A <= c : 0x1260 <= c : 0x128A <= c : c <= 0x12B5 ? c <= 0x12B0 ? 0x1290 <= c : 0x12B2 <= c : 0x12B8 <= c : c <= 0x12D6 ? c <= 0x12C5 ? c <= 0x12C0 ? 0x12C0 <= c : 0x12C2 <= c : 0x12C8 <= c : c <= 0x1310 ? 0x12D8 <= c : 0x1312 <= c : c <= 0x169A ? c <= 0x13F4 ? c <= 0x138F ? c <= 0x135A ? 0x1318 <= c : 0x1380 <= c : 0x13A0 <= c : c <= 0x1676 ? c <= 0x166C ? 0x1401 <= c : 0x166F <= c : 0x1681 <= c : c <= 0x170C ? c <= 0x16F0 ? c <= 0x16EA ? 0x16A0 <= c : 0x16EE <= c : 0x1700 <= c : c <= 0x1711 ? 0x170E <= c : 0x1720 <= c : c <= 0xA805 ? c <= 0x2115 ? c <= 0x1F4D ? c <= 0x19A9 ? c <= 0x17DC ? c <= 0x1770 ? c <= 0x176C ? c <= 0x1751 ? 0x1740 <= c : 0x1760 <= c : 0x176E <= c : c <= 0x17D7 ? c <= 0x17B3 ? 0x1780 <= c : 0x17D7 <= c : 0x17DC <= c : c <= 0x191C ? c <= 0x18A8 ? c <= 0x1877 ? 0x1820 <= c : 0x1880 <= c : 0x1900 <= c : c <= 0x1974 ? c <= 0x196D ? 0x1950 <= c : 0x1970 <= c : 0x1980 <= c : c <= 0x1E9B ? c <= 0x1B33 ? c <= 0x1A16 ? c <= 0x19C7 ? 0x19C1 <= c : 0x1A00 <= c : 0x1B05 <= c : c <= 0x1DBF ? c <= 0x1B4B ? 0x1B45 <= c : 0x1D00 <= c : 0x1E00 <= c : c <= 0x1F1D ? c <= 0x1F15 ? c <= 0x1EF9 ? 0x1EA0 <= c : 0x1F00 <= c : 0x1F18 <= c : c <= 0x1F45 ? 0x1F20 <= c : 0x1F48 <= c : c <= 0x1FD3 ? c <= 0x1FB4 ? c <= 0x1F5B ? c <= 0x1F59 ? c <= 0x1F57 ? 0x1F50 <= c : 0x1F59 <= c : 0x1F5B <= c : c <= 0x1F7D ? c <= 0x1F5D ? 0x1F5D <= c : 0x1F5F <= c : 0x1F80 <= c : c <= 0x1FC4 ? c <= 0x1FBE ? c <= 0x1FBC ? 0x1FB6 <= c : 0x1FBE <= c : 0x1FC2 <= c : c <= 0x1FCC ? 0x1FC6 <= c : 0x1FD0 <= c : c <= 0x207F ? c <= 0x1FF4 ? c <= 0x1FEC ? c <= 0x1FDB ? 0x1FD6 <= c : 0x1FE0 <= c : 0x1FF2 <= c : c <= 0x2071 ? c <= 0x1FFC ? 0x1FF6 <= c : 0x2071 <= c : 0x207F <= c : c <= 0x2107 ? c <= 0x2102 ? c <= 0x2094 ? 0x2090 <= c : 0x2102 <= c : 0x2107 <= c : c <= 0x2113 ? 0x210A <= c : 0x2115 <= c : c <= 0x2DBE ? c <= 0x2C5E ? c <= 0x2139 ? c <= 0x2126 ? c <= 0x2124 ? c <= 0x211D ? 0x2119 <= c : 0x2124 <= c : 0x2126 <= c : c <= 0x212D ? c <= 0x2128 ? 0x2128 <= c : 0x212A <= c : 0x212F <= c : c <= 0x214E ? c <= 0x2149 ? c <= 0x213F ? 0x213C <= c : 0x2145 <= c : 0x214E <= c : c <= 0x2C2E ? c <= 0x2184 ? 0x2160 <= c : 0x2C00 <= c : 0x2C30 <= c : c <= 0x2D6F ? c <= 0x2CE4 ? c <= 0x2C77 ? c <= 0x2C6C ? 0x2C60 <= c : 0x2C74 <= c : 0x2C80 <= c : c <= 0x2D65 ? c <= 0x2D25 ? 0x2D00 <= c : 0x2D30 <= c : 0x2D6F <= c : c <= 0x2DAE ? c <= 0x2DA6 ? c <= 0x2D96 ? 0x2D80 <= c : 0x2DA0 <= c : 0x2DA8 <= c : c <= 0x2DB6 ? 0x2DB0 <= c : 0x2DB8 <= c : c <= 0x30FA ? c <= 0x3029 ? c <= 0x2DD6 ? c <= 0x2DCE ? c <= 0x2DC6 ? 0x2DC0 <= c : 0x2DC8 <= c : 0x2DD0 <= c : c <= 0x3007 ? c <= 0x2DDE ? 0x2DD8 <= c : 0x3005 <= c : 0x3021 <= c : c <= 0x3096 ? c <= 0x303C ? c <= 0x3035 ? 0x3031 <= c : 0x3038 <= c : 0x3041 <= c : c <= 0x309F ? 0x309D <= c : 0x30A1 <= c : c <= 0x4DB5 ? c <= 0x318E ? c <= 0x312C ? c <= 0x30FF ? 0x30FC <= c : 0x3105 <= c : 0x3131 <= c : c <= 0x31FF ? c <= 0x31B7 ? 0x31A0 <= c : 0x31F0 <= c : 0x3400 <= c : c <= 0xA71A ? c <= 0xA48C ? c <= 0x9FBB ? 0x4E00 <= c : 0xA000 <= c : 0xA717 <= c : c <= 0xA801 ? 0xA800 <= c : 0xA803 <= c : c <= 0x1049D ? c <= 0xFEFC ? c <= 0xFB36 ? c <= 0xFA6A ? c <= 0xA873 ? c <= 0xA822 ? c <= 0xA80A ? 0xA807 <= c : 0xA80C <= c : 0xA840 <= c : c <= 0xFA2D ? c <= 0xD7A3 ? 0xAC00 <= c : 0xF900 <= c : 0xFA30 <= c : c <= 0xFB17 ? c <= 0xFB06 ? c <= 0xFAD9 ? 0xFA70 <= c : 0xFB00 <= c : 0xFB13 <= c : c <= 0xFB28 ? c <= 0xFB1D ? 0xFB1D <= c : 0xFB1F <= c : 0xFB2A <= c : c <= 0xFD3D ? c <= 0xFB41 ? c <= 0xFB3E ? c <= 0xFB3C ? 0xFB38 <= c : 0xFB3E <= c : 0xFB40 <= c : c <= 0xFBB1 ? c <= 0xFB44 ? 0xFB43 <= c : 0xFB46 <= c : 0xFBD3 <= c : c <= 0xFDFB ? c <= 0xFDC7 ? c <= 0xFD8F ? 0xFD50 <= c : 0xFD92 <= c : 0xFDF0 <= c : c <= 0xFE74 ? 0xFE70 <= c : 0xFE76 <= c : c <= 0x1003D ? c <= 0xFFD7 ? c <= 0xFFBE ? c <= 0xFF5A ? c <= 0xFF3A ? 0xFF21 <= c : 0xFF41 <= c : 0xFF66 <= c : c <= 0xFFCF ? c <= 0xFFC7 ? 0xFFC2 <= c : 0xFFCA <= c : 0xFFD2 <= c : c <= 0x10026 ? c <= 0x1000B ? c <= 0xFFDC ? 0xFFDA <= c : 0x10000 <= c : 0x1000D <= c : c <= 0x1003A ? 0x10028 <= c : 0x1003C <= c : c <= 0x1034A ? c <= 0x100FA ? c <= 0x1005D ? c <= 0x1004D ? 0x1003F <= c : 0x10050 <= c : 0x10080 <= c : c <= 0x1031E ? c <= 0x10174 ? 0x10140 <= c : 0x10300 <= c : 0x10330 <= c : c <= 0x103CF ? c <= 0x103C3 ? c <= 0x1039D ? 0x10380 <= c : 0x103A0 <= c : 0x103C8 <= c : c <= 0x103D5 ? 0x103D1 <= c : 0x10400 <= c : c <= 0x1D505 ? c <= 0x1236E ? c <= 0x1083F ? c <= 0x10835 ? c <= 0x10808 ? c <= 0x10805 ? 0x10800 <= c : 0x10808 <= c : 0x1080A <= c : c <= 0x1083C ? c <= 0x10838 ? 0x10837 <= c : 0x1083C <= c : 0x1083F <= c : c <= 0x10A13 ? c <= 0x10A00 ? c <= 0x10915 ? 0x10900 <= c : 0x10A00 <= c : 0x10A10 <= c : c <= 0x10A33 ? c <= 0x10A17 ? 0x10A15 <= c : 0x10A19 <= c : 0x12000 <= c : c <= 0x1D4A6 ? c <= 0x1D49C ? c <= 0x1D454 ? c <= 0x12462 ? 0x12400 <= c : 0x1D400 <= c : 0x1D456 <= c : c <= 0x1D4A2 ? c <= 0x1D49F ? 0x1D49E <= c : 0x1D4A2 <= c : 0x1D4A5 <= c : c <= 0x1D4BB ? c <= 0x1D4B9 ? c <= 0x1D4AC ? 0x1D4A9 <= c : 0x1D4AE <= c : 0x1D4BB <= c : c <= 0x1D4C3 ? 0x1D4BD <= c : 0x1D4C5 <= c : c <= 0x1D6DA ? c <= 0x1D544 ? c <= 0x1D51C ? c <= 0x1D514 ? c <= 0x1D50A ? 0x1D507 <= c : 0x1D50D <= c : 0x1D516 <= c : c <= 0x1D53E ? c <= 0x1D539 ? 0x1D51E <= c : 0x1D53B <= c : 0x1D540 <= c : c <= 0x1D6A5 ? c <= 0x1D550 ? c <= 0x1D546 ? 0x1D546 <= c : 0x1D54A <= c : 0x1D552 <= c : c <= 0x1D6C0 ? 0x1D6A8 <= c : 0x1D6C2 <= c : c <= 0x1D788 ? c <= 0x1D734 ? c <= 0x1D714 ? c <= 0x1D6FA ? 0x1D6DC <= c : 0x1D6FC <= c : 0x1D716 <= c : c <= 0x1D76E ? c <= 0x1D74E ? 0x1D736 <= c : 0x1D750 <= c : 0x1D770 <= c : c <= 0x1D7CB ? c <= 0x1D7C2 ? c <= 0x1D7A8 ? 0x1D78A <= c : 0x1D7AA <= c : 0x1D7C4 <= c : c <= 0x2A6D6 ? 0x20000 <= c : 0x2F800 <= c && c <= 0x2FA1D; // #/generated# } function isIdentifierPart ( c ) { var c = c.charCodeAt(0); switch ( c ) { case 0x24: // '$' case 0x5F: // '_' return true; } // the following code is derived from the Unicode category Lu, Ll, Lt, Lm, Lo, Nl, Mn, Mc, Nd, and Pc based on: // http://www.unicode.org/Public/UNIDATA/extracted/DerivedGeneralCategory.txt // #generated# Last update: Tue, 01 Aug 2006 02:00:01 +0900 return c <= 0x12B0 ? c <= 0xB90 ? c <= 0x990 ? c <= 0x5BF ? c <= 0x37D ? c <= 0xD6 ? c <= 0x7A ? c <= 0x5A ? c <= 0x39 ? 0x30 <= c : 0x41 <= c : c <= 0x5F ? 0x5F <= c : 0x61 <= c : c <= 0xB5 ? c <= 0xAA ? 0xAA <= c : 0xB5 <= c : c <= 0xBA ? 0xBA <= c : 0xC0 <= c : c <= 0x2E4 ? c <= 0x2C1 ? c <= 0xF6 ? 0xD8 <= c : 0xF8 <= c : c <= 0x2D1 ? 0x2C6 <= c : 0x2E0 <= c : c <= 0x36F ? c <= 0x2EE ? 0x2EE <= c : 0x300 <= c : 0x37A <= c : c <= 0x481 ? c <= 0x3A1 ? c <= 0x38A ? c <= 0x386 ? 0x386 <= c : 0x388 <= c : c <= 0x38C ? 0x38C <= c : 0x38E <= c : c <= 0x3F5 ? c <= 0x3CE ? 0x3A3 <= c : 0x3D0 <= c : 0x3F7 <= c : c <= 0x559 ? c <= 0x513 ? c <= 0x486 ? 0x483 <= c : 0x48A <= c : c <= 0x556 ? 0x531 <= c : 0x559 <= c : c <= 0x5BD ? c <= 0x587 ? 0x561 <= c : 0x591 <= c : 0x5BF <= c : c <= 0x6FF ? c <= 0x63A ? c <= 0x5EA ? c <= 0x5C5 ? c <= 0x5C2 ? 0x5C1 <= c : 0x5C4 <= c : c <= 0x5C7 ? 0x5C7 <= c : 0x5D0 <= c : c <= 0x615 ? c <= 0x5F2 ? 0x5F0 <= c : 0x610 <= c : 0x621 <= c : c <= 0x6DC ? c <= 0x669 ? c <= 0x65E ? 0x640 <= c : 0x660 <= c : c <= 0x6D3 ? 0x66E <= c : 0x6D5 <= c : c <= 0x6FC ? c <= 0x6E8 ? 0x6DF <= c : 0x6EA <= c : 0x6FF <= c : c <= 0x94D ? c <= 0x7F5 ? c <= 0x76D ? c <= 0x74A ? 0x710 <= c : 0x74D <= c : c <= 0x7B1 ? 0x780 <= c : 0x7C0 <= c : c <= 0x939 ? c <= 0x7FA ? 0x7FA <= c : 0x901 <= c : 0x93C <= c : c <= 0x97F ? c <= 0x963 ? c <= 0x954 ? 0x950 <= c : 0x958 <= c : c <= 0x96F ? 0x966 <= c : 0x97B <= c : c <= 0x98C ? c <= 0x983 ? 0x981 <= c : 0x985 <= c : 0x98F <= c : c <= 0xA91 ? c <= 0xA28 ? c <= 0x9D7 ? c <= 0x9B9 ? c <= 0x9B0 ? c <= 0x9A8 ? 0x993 <= c : 0x9AA <= c : c <= 0x9B2 ? 0x9B2 <= c : 0x9B6 <= c : c <= 0x9C8 ? c <= 0x9C4 ? 0x9BC <= c : 0x9C7 <= c : c <= 0x9CE ? 0x9CB <= c : 0x9D7 <= c : c <= 0xA03 ? c <= 0x9E3 ? c <= 0x9DD ? 0x9DC <= c : 0x9DF <= c : c <= 0x9F1 ? 0x9E6 <= c : 0xA01 <= c : c <= 0xA10 ? c <= 0xA0A ? 0xA05 <= c : 0xA0F <= c : 0xA13 <= c : c <= 0xA48 ? c <= 0xA39 ? c <= 0xA33 ? c <= 0xA30 ? 0xA2A <= c : 0xA32 <= c : c <= 0xA36 ? 0xA35 <= c : 0xA38 <= c : c <= 0xA42 ? c <= 0xA3C ? 0xA3C <= c : 0xA3E <= c : 0xA47 <= c : c <= 0xA74 ? c <= 0xA5C ? c <= 0xA4D ? 0xA4B <= c : 0xA59 <= c : c <= 0xA5E ? 0xA5E <= c : 0xA66 <= c : c <= 0xA8D ? c <= 0xA83 ? 0xA81 <= c : 0xA85 <= c : 0xA8F <= c : c <= 0xB28 ? c <= 0xACD ? c <= 0xAB9 ? c <= 0xAB0 ? c <= 0xAA8 ? 0xA93 <= c : 0xAAA <= c : c <= 0xAB3 ? 0xAB2 <= c : 0xAB5 <= c : c <= 0xAC9 ? c <= 0xAC5 ? 0xABC <= c : 0xAC7 <= c : 0xACB <= c : c <= 0xB03 ? c <= 0xAE3 ? c <= 0xAD0 ? 0xAD0 <= c : 0xAE0 <= c : c <= 0xAEF ? 0xAE6 <= c : 0xB01 <= c : c <= 0xB10 ? c <= 0xB0C ? 0xB05 <= c : 0xB0F <= c : 0xB13 <= c : c <= 0xB57 ? c <= 0xB43 ? c <= 0xB33 ? c <= 0xB30 ? 0xB2A <= c : 0xB32 <= c : c <= 0xB39 ? 0xB35 <= c : 0xB3C <= c : c <= 0xB4D ? c <= 0xB48 ? 0xB47 <= c : 0xB4B <= c : 0xB56 <= c : c <= 0xB71 ? c <= 0xB61 ? c <= 0xB5D ? 0xB5C <= c : 0xB5F <= c : c <= 0xB6F ? 0xB66 <= c : 0xB71 <= c : c <= 0xB8A ? c <= 0xB83 ? 0xB82 <= c : 0xB85 <= c : 0xB8E <= c : c <= 0xDD6 ? c <= 0xCB3 ? c <= 0xC10 ? c <= 0xBC2 ? c <= 0xB9F ? c <= 0xB9A ? c <= 0xB95 ? 0xB92 <= c : 0xB99 <= c : c <= 0xB9C ? 0xB9C <= c : 0xB9E <= c : c <= 0xBAA ? c <= 0xBA4 ? 0xBA3 <= c : 0xBA8 <= c : c <= 0xBB9 ? 0xBAE <= c : 0xBBE <= c : c <= 0xBEF ? c <= 0xBCD ? c <= 0xBC8 ? 0xBC6 <= c : 0xBCA <= c : c <= 0xBD7 ? 0xBD7 <= c : 0xBE6 <= c : c <= 0xC0C ? c <= 0xC03 ? 0xC01 <= c : 0xC05 <= c : 0xC0E <= c : c <= 0xC56 ? c <= 0xC44 ? c <= 0xC33 ? c <= 0xC28 ? 0xC12 <= c : 0xC2A <= c : c <= 0xC39 ? 0xC35 <= c : 0xC3E <= c : c <= 0xC4D ? c <= 0xC48 ? 0xC46 <= c : 0xC4A <= c : 0xC55 <= c : c <= 0xC8C ? c <= 0xC6F ? c <= 0xC61 ? 0xC60 <= c : 0xC66 <= c : c <= 0xC83 ? 0xC82 <= c : 0xC85 <= c : c <= 0xCA8 ? c <= 0xC90 ? 0xC8E <= c : 0xC92 <= c : 0xCAA <= c : c <= 0xD43 ? c <= 0xCE3 ? c <= 0xCCD ? c <= 0xCC4 ? c <= 0xCB9 ? 0xCB5 <= c : 0xCBC <= c : c <= 0xCC8 ? 0xCC6 <= c : 0xCCA <= c : c <= 0xCDE ? c <= 0xCD6 ? 0xCD5 <= c : 0xCDE <= c : 0xCE0 <= c : c <= 0xD10 ? c <= 0xD03 ? c <= 0xCEF ? 0xCE6 <= c : 0xD02 <= c : c <= 0xD0C ? 0xD05 <= c : 0xD0E <= c : c <= 0xD39 ? c <= 0xD28 ? 0xD12 <= c : 0xD2A <= c : 0xD3E <= c : c <= 0xD96 ? c <= 0xD61 ? c <= 0xD4D ? c <= 0xD48 ? 0xD46 <= c : 0xD4A <= c : c <= 0xD57 ? 0xD57 <= c : 0xD60 <= c : c <= 0xD83 ? c <= 0xD6F ? 0xD66 <= c : 0xD82 <= c : 0xD85 <= c : c <= 0xDC6 ? c <= 0xDBB ? c <= 0xDB1 ? 0xD9A <= c : 0xDB3 <= c : c <= 0xDBD ? 0xDBD <= c : 0xDC0 <= c : c <= 0xDD4 ? c <= 0xDCA ? 0xDCA <= c : 0xDCF <= c : 0xDD6 <= c : c <= 0xF39 ? c <= 0xEA7 ? c <= 0xE88 ? c <= 0xE4E ? c <= 0xDF3 ? c <= 0xDDF ? 0xDD8 <= c : 0xDF2 <= c : c <= 0xE3A ? 0xE01 <= c : 0xE40 <= c : c <= 0xE82 ? c <= 0xE59 ? 0xE50 <= c : 0xE81 <= c : c <= 0xE84 ? 0xE84 <= c : 0xE87 <= c : c <= 0xE9F ? c <= 0xE8D ? c <= 0xE8A ? 0xE8A <= c : 0xE8D <= c : c <= 0xE97 ? 0xE94 <= c : 0xE99 <= c : c <= 0xEA5 ? c <= 0xEA3 ? 0xEA1 <= c : 0xEA5 <= c : 0xEA7 <= c : c <= 0xED9 ? c <= 0xEC4 ? c <= 0xEB9 ? c <= 0xEAB ? 0xEAA <= c : 0xEAD <= c : c <= 0xEBD ? 0xEBB <= c : 0xEC0 <= c : c <= 0xECD ? c <= 0xEC6 ? 0xEC6 <= c : 0xEC8 <= c : 0xED0 <= c : c <= 0xF29 ? c <= 0xF00 ? c <= 0xEDD ? 0xEDC <= c : 0xF00 <= c : c <= 0xF19 ? 0xF18 <= c : 0xF20 <= c : c <= 0xF37 ? c <= 0xF35 ? 0xF35 <= c : 0xF37 <= c : 0xF39 <= c : c <= 0x1059 ? c <= 0xFC6 ? c <= 0xF8B ? c <= 0xF6A ? c <= 0xF47 ? 0xF3E <= c : 0xF49 <= c : c <= 0xF84 ? 0xF71 <= c : 0xF86 <= c : c <= 0xFBC ? c <= 0xF97 ? 0xF90 <= c : 0xF99 <= c : 0xFC6 <= c : c <= 0x1032 ? c <= 0x1027 ? c <= 0x1021 ? 0x1000 <= c : 0x1023 <= c : c <= 0x102A ? 0x1029 <= c : 0x102C <= c : c <= 0x1049 ? c <= 0x1039 ? 0x1036 <= c : 0x1040 <= c : 0x1050 <= c : c <= 0x1248 ? c <= 0x1159 ? c <= 0x10FA ? c <= 0x10C5 ? 0x10A0 <= c : 0x10D0 <= c : c <= 0x10FC ? 0x10FC <= c : 0x1100 <= c : c <= 0x11F9 ? c <= 0x11A2 ? 0x115F <= c : 0x11A8 <= c : 0x1200 <= c : c <= 0x125D ? c <= 0x1256 ? c <= 0x124D ? 0x124A <= c : 0x1250 <= c : c <= 0x1258 ? 0x1258 <= c : 0x125A <= c : c <= 0x128D ? c <= 0x1288 ? 0x1260 <= c : 0x128A <= c : 0x1290 <= c : c <= 0x30FF ? c <= 0x1FB4 ? c <= 0x180D ? c <= 0x16EA ? c <= 0x135A ? c <= 0x12C5 ? c <= 0x12BE ? c <= 0x12B5 ? 0x12B2 <= c : 0x12B8 <= c : c <= 0x12C0 ? 0x12C0 <= c : 0x12C2 <= c : c <= 0x1310 ? c <= 0x12D6 ? 0x12C8 <= c : 0x12D8 <= c : c <= 0x1315 ? 0x1312 <= c : 0x1318 <= c : c <= 0x166C ? c <= 0x138F ? c <= 0x135F ? 0x135F <= c : 0x1380 <= c : c <= 0x13F4 ? 0x13A0 <= c : 0x1401 <= c : c <= 0x169A ? c <= 0x1676 ? 0x166F <= c : 0x1681 <= c : 0x16A0 <= c : c <= 0x1770 ? c <= 0x1734 ? c <= 0x170C ? c <= 0x16F0 ? 0x16EE <= c : 0x1700 <= c : c <= 0x1714 ? 0x170E <= c : 0x1720 <= c : c <= 0x176C ? c <= 0x1753 ? 0x1740 <= c : 0x1760 <= c : 0x176E <= c : c <= 0x17D7 ? c <= 0x17B3 ? c <= 0x1773 ? 0x1772 <= c : 0x1780 <= c : c <= 0x17D3 ? 0x17B6 <= c : 0x17D7 <= c : c <= 0x17E9 ? c <= 0x17DD ? 0x17DC <= c : 0x17E0 <= c : 0x180B <= c : c <= 0x1B59 ? c <= 0x196D ? c <= 0x191C ? c <= 0x1877 ? c <= 0x1819 ? 0x1810 <= c : 0x1820 <= c : c <= 0x18A9 ? 0x1880 <= c : 0x1900 <= c : c <= 0x193B ? c <= 0x192B ? 0x1920 <= c : 0x1930 <= c : 0x1946 <= c : c <= 0x19D9 ? c <= 0x19A9 ? c <= 0x1974 ? 0x1970 <= c : 0x1980 <= c : c <= 0x19C9 ? 0x19B0 <= c : 0x19D0 <= c : c <= 0x1B4B ? c <= 0x1A1B ? 0x1A00 <= c : 0x1B00 <= c : 0x1B50 <= c : c <= 0x1F45 ? c <= 0x1EF9 ? c <= 0x1DCA ? c <= 0x1B73 ? 0x1B6B <= c : 0x1D00 <= c : c <= 0x1E9B ? 0x1DFE <= c : 0x1EA0 <= c : c <= 0x1F1D ? c <= 0x1F15 ? 0x1F00 <= c : 0x1F18 <= c : 0x1F20 <= c : c <= 0x1F5B ? c <= 0x1F57 ? c <= 0x1F4D ? 0x1F48 <= c : 0x1F50 <= c : c <= 0x1F59 ? 0x1F59 <= c : 0x1F5B <= c : c <= 0x1F7D ? c <= 0x1F5D ? 0x1F5D <= c : 0x1F5F <= c : 0x1F80 <= c : c <= 0x2149 ? c <= 0x20DC ? c <= 0x1FF4 ? c <= 0x1FCC ? c <= 0x1FBE ? c <= 0x1FBC ? 0x1FB6 <= c : 0x1FBE <= c : c <= 0x1FC4 ? 0x1FC2 <= c : 0x1FC6 <= c : c <= 0x1FDB ? c <= 0x1FD3 ? 0x1FD0 <= c : 0x1FD6 <= c : c <= 0x1FEC ? 0x1FE0 <= c : 0x1FF2 <= c : c <= 0x2071 ? c <= 0x2040 ? c <= 0x1FFC ? 0x1FF6 <= c : 0x203F <= c : c <= 0x2054 ? 0x2054 <= c : 0x2071 <= c : c <= 0x2094 ? c <= 0x207F ? 0x207F <= c : 0x2090 <= c : 0x20D0 <= c : c <= 0x211D ? c <= 0x2107 ? c <= 0x20EF ? c <= 0x20E1 ? 0x20E1 <= c : 0x20E5 <= c : c <= 0x2102 ? 0x2102 <= c : 0x2107 <= c : c <= 0x2115 ? c <= 0x2113 ? 0x210A <= c : 0x2115 <= c : 0x2119 <= c : c <= 0x212D ? c <= 0x2126 ? c <= 0x2124 ? 0x2124 <= c : 0x2126 <= c : c <= 0x2128 ? 0x2128 <= c : 0x212A <= c : c <= 0x213F ? c <= 0x2139 ? 0x212F <= c : 0x213C <= c : 0x2145 <= c : c <= 0x2DB6 ? c <= 0x2CE4 ? c <= 0x2C5E ? c <= 0x2184 ? c <= 0x214E ? 0x214E <= c : 0x2160 <= c : c <= 0x2C2E ? 0x2C00 <= c : 0x2C30 <= c : c <= 0x2C77 ? c <= 0x2C6C ? 0x2C60 <= c : 0x2C74 <= c : 0x2C80 <= c : c <= 0x2D96 ? c <= 0x2D65 ? c <= 0x2D25 ? 0x2D00 <= c : 0x2D30 <= c : c <= 0x2D6F ? 0x2D6F <= c : 0x2D80 <= c : c <= 0x2DAE ? c <= 0x2DA6 ? 0x2DA0 <= c : 0x2DA8 <= c : 0x2DB0 <= c : c <= 0x302F ? c <= 0x2DD6 ? c <= 0x2DC6 ? c <= 0x2DBE ? 0x2DB8 <= c : 0x2DC0 <= c : c <= 0x2DCE ? 0x2DC8 <= c : 0x2DD0 <= c : c <= 0x3007 ? c <= 0x2DDE ? 0x2DD8 <= c : 0x3005 <= c : 0x3021 <= c : c <= 0x309A ? c <= 0x303C ? c <= 0x3035 ? 0x3031 <= c : 0x3038 <= c : c <= 0x3096 ? 0x3041 <= c : 0x3099 <= c : c <= 0x30FA ? c <= 0x309F ? 0x309D <= c : 0x30A1 <= c : 0x30FC <= c : c <= 0x1049D ? c <= 0xFE23 ? c <= 0xFB06 ? c <= 0xA71A ? c <= 0x31FF ? c <= 0x318E ? c <= 0x312C ? 0x3105 <= c : 0x3131 <= c : c <= 0x31B7 ? 0x31A0 <= c : 0x31F0 <= c : c <= 0x9FBB ? c <= 0x4DB5 ? 0x3400 <= c : 0x4E00 <= c : c <= 0xA48C ? 0xA000 <= c : 0xA717 <= c : c <= 0xFA2D ? c <= 0xA873 ? c <= 0xA827 ? 0xA800 <= c : 0xA840 <= c : c <= 0xD7A3 ? 0xAC00 <= c : 0xF900 <= c : c <= 0xFAD9 ? c <= 0xFA6A ? 0xFA30 <= c : 0xFA70 <= c : 0xFB00 <= c : c <= 0xFB44 ? c <= 0xFB3C ? c <= 0xFB28 ? c <= 0xFB17 ? 0xFB13 <= c : 0xFB1D <= c : c <= 0xFB36 ? 0xFB2A <= c : 0xFB38 <= c : c <= 0xFB41 ? c <= 0xFB3E ? 0xFB3E <= c : 0xFB40 <= c : 0xFB43 <= c : c <= 0xFDC7 ? c <= 0xFD3D ? c <= 0xFBB1 ? 0xFB46 <= c : 0xFBD3 <= c : c <= 0xFD8F ? 0xFD50 <= c : 0xFD92 <= c : c <= 0xFE0F ? c <= 0xFDFB ? 0xFDF0 <= c : 0xFE00 <= c : 0xFE20 <= c : c <= 0x1000B ? c <= 0xFF3F ? c <= 0xFEFC ? c <= 0xFE4F ? c <= 0xFE34 ? 0xFE33 <= c : 0xFE4D <= c : c <= 0xFE74 ? 0xFE70 <= c : 0xFE76 <= c : c <= 0xFF3A ? c <= 0xFF19 ? 0xFF10 <= c : 0xFF21 <= c : 0xFF3F <= c : c <= 0xFFCF ? c <= 0xFFBE ? c <= 0xFF5A ? 0xFF41 <= c : 0xFF66 <= c : c <= 0xFFC7 ? 0xFFC2 <= c : 0xFFCA <= c : c <= 0xFFDC ? c <= 0xFFD7 ? 0xFFD2 <= c : 0xFFDA <= c : 0x10000 <= c : c <= 0x10174 ? c <= 0x1004D ? c <= 0x1003A ? c <= 0x10026 ? 0x1000D <= c : 0x10028 <= c : c <= 0x1003D ? 0x1003C <= c : 0x1003F <= c : c <= 0x100FA ? c <= 0x1005D ? 0x10050 <= c : 0x10080 <= c : 0x10140 <= c : c <= 0x103C3 ? c <= 0x1034A ? c <= 0x1031E ? 0x10300 <= c : 0x10330 <= c : c <= 0x1039D ? 0x10380 <= c : 0x103A0 <= c : c <= 0x103D5 ? c <= 0x103CF ? 0x103C8 <= c : 0x103D1 <= c : 0x10400 <= c : c <= 0x1D4AC ? c <= 0x10A3F ? c <= 0x10915 ? c <= 0x10835 ? c <= 0x10805 ? c <= 0x104A9 ? 0x104A0 <= c : 0x10800 <= c : c <= 0x10808 ? 0x10808 <= c : 0x1080A <= c : c <= 0x1083C ? c <= 0x10838 ? 0x10837 <= c : 0x1083C <= c : c <= 0x1083F ? 0x1083F <= c : 0x10900 <= c : c <= 0x10A17 ? c <= 0x10A06 ? c <= 0x10A03 ? 0x10A00 <= c : 0x10A05 <= c : c <= 0x10A13 ? 0x10A0C <= c : 0x10A15 <= c : c <= 0x10A3A ? c <= 0x10A33 ? 0x10A19 <= c : 0x10A38 <= c : 0x10A3F <= c : c <= 0x1D1AD ? c <= 0x1D172 ? c <= 0x12462 ? c <= 0x1236E ? 0x12000 <= c : 0x12400 <= c : c <= 0x1D169 ? 0x1D165 <= c : 0x1D16D <= c : c <= 0x1D18B ? c <= 0x1D182 ? 0x1D17B <= c : 0x1D185 <= c : 0x1D1AA <= c : c <= 0x1D49F ? c <= 0x1D454 ? c <= 0x1D244 ? 0x1D242 <= c : 0x1D400 <= c : c <= 0x1D49C ? 0x1D456 <= c : 0x1D49E <= c : c <= 0x1D4A6 ? c <= 0x1D4A2 ? 0x1D4A2 <= c : 0x1D4A5 <= c : 0x1D4A9 <= c : c <= 0x1D6C0 ? c <= 0x1D51C ? c <= 0x1D505 ? c <= 0x1D4BB ? c <= 0x1D4B9 ? 0x1D4AE <= c : 0x1D4BB <= c : c <= 0x1D4C3 ? 0x1D4BD <= c : 0x1D4C5 <= c : c <= 0x1D514 ? c <= 0x1D50A ? 0x1D507 <= c : 0x1D50D <= c : 0x1D516 <= c : c <= 0x1D546 ? c <= 0x1D53E ? c <= 0x1D539 ? 0x1D51E <= c : 0x1D53B <= c : c <= 0x1D544 ? 0x1D540 <= c : 0x1D546 <= c : c <= 0x1D6A5 ? c <= 0x1D550 ? 0x1D54A <= c : 0x1D552 <= c : 0x1D6A8 <= c : c <= 0x1D788 ? c <= 0x1D734 ? c <= 0x1D6FA ? c <= 0x1D6DA ? 0x1D6C2 <= c : 0x1D6DC <= c : c <= 0x1D714 ? 0x1D6FC <= c : 0x1D716 <= c : c <= 0x1D76E ? c <= 0x1D74E ? 0x1D736 <= c : 0x1D750 <= c : 0x1D770 <= c : c <= 0x1D7FF ? c <= 0x1D7C2 ? c <= 0x1D7A8 ? 0x1D78A <= c : 0x1D7AA <= c : c <= 0x1D7CB ? 0x1D7C4 <= c : 0x1D7CE <= c : c <= 0x2FA1D ? c <= 0x2A6D6 ? 0x20000 <= c : 0x2F800 <= c : 0xE0100 <= c && c <= 0xE01EF; // #/generated# } return { isDigit: isDigit, isIdentifierStart: isIdentifierStart, isHexDigit: isHexDigit, isAlpha: isAlpha, isSpace: isSpace, isLineTerminator: isLineTerminator, isFormatChar: isFormatChar, isIdentifierPart: isIdentifierPart }; }(); } }.call(null) ) { this.Concurrent.Thread.Compiler.isDigit = isDigit; this.Concurrent.Thread.Compiler.isIdentifierStart = isIdentifierStart; this.Concurrent.Thread.Compiler.isHexDigit = isHexDigit; this.Concurrent.Thread.Compiler.isAlpha = isAlpha; this.Concurrent.Thread.Compiler.isSpace = isSpace; this.Concurrent.Thread.Compiler.isLineTerminator = isLineTerminator; this.Concurrent.Thread.Compiler.isFormatChar = isFormatChar; this.Concurrent.Thread.Compiler.isIdentifierPart = isIdentifierPart; } }).call(null); (function(){ if ( !this.Concurrent || (typeof this.Concurrent != 'object' && typeof this.Concurrent != 'function') ) this.Concurrent = new Object(); if ( !this.Concurrent.Thread || (typeof this.Concurrent.Thread != 'object' && typeof this.Concurrent.Thread != 'function') ) this.Concurrent.Thread = new Object(); if ( !this.Concurrent.Thread.Compiler || (typeof this.Concurrent.Thread.Compiler != 'object' && typeof this.Concurrent.Thread.Compiler != 'function') ) this.Concurrent.Thread.Compiler = new Object(); if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Error || (typeof this.Data.Error != 'object' && typeof this.Data.Error != 'function') ) this.Data.Error = new Object(); if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Iterator || (typeof this.Data.Iterator != 'object' && typeof this.Data.Iterator != 'function') ) this.Data.Iterator = new Object(); if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Functional || (typeof this.Data.Functional != 'object' && typeof this.Data.Functional != 'function') ) this.Data.Functional = new Object(); if ( this.Concurrent.Thread.Compiler.IdentifierSet === undefined ) this.Concurrent.Thread.Compiler.IdentifierSet = undefined; with ( function(){ with ( Data.Error ) { with ( Data.Iterator ) { with ( Data.Functional ) { with ( Concurrent.Thread.Compiler ) { return function () { var VERSION ; var NAMESPACE; /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Concurrent.Thread code. * * The Initial Developer of the Original Code is * Daisuke Maki. * Portions created by the Initial Developer are Copyright (C) 2006-2007 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ NAMESPACE = 'Concurrent.Thread.Compiler'; var MIN_INT = Math.pow(-2, 53); function IdentifierSet ( ) { this._set = {}; this._state_no = MIN_INT; } var proto = IdentifierSet.prototype = new Set(); proto.constructor = IdentifierSet; var hasOwnProperty = Object.prototype.hasOwnProperty; proto.contains = function ( /* variable arguments */ ) { for ( var i=0; i < arguments.length; i++ ) { var id = arguments[i]; if ( !(id instanceof Identifier) ) throw new TypeError("arguments[" + i + "] is not of type Identifier"); // Because "hasOwnProperty" itself can be used as identifier, // we need to avoid "this._set.hasOwnProperty". if ( !hasOwnProperty.call(this._set, id.valueOf()) ) return false; } return true; }; proto.add = function ( /* variable arguments */ ) { var changed = false; for ( var i=0; i < arguments.length; i++ ) { var id = arguments[i]; if ( !(id instanceof Identifier) ) throw new TypeError("arguments[" + i + "] is not of type Identifier"); var p = id.valueOf(); if ( this._set[p] !== id ) { this._set[p] = id; this._state_no++; changed = true; } } return changed; }; proto.remove = function ( /* variable arguments */ ) { var changed = false; for ( var i=0; i < arguments.length; i++ ) { var id = arguments[i]; if ( !(id instanceof Identifier) ) throw new TypeError("argument is not of type Identifier"); var p = id.valueOf(); if ( hasOwnProperty.call(this._set, p) ) { delete this._set[p]; this._state_no++; changed = true; } } return changed; }; proto.toArray = function ( ) { var arr = []; for ( var i in this._set ) { if ( hasOwnProperty.call(this._set, i) ) arr.push(this._set[i]); } return arr; }; proto.iterator = function ( ) { return new IdIterator(this, this.toArray(), 0); }; function IdIterator ( parent, elems, index ) { this._parent = parent; this._elems = elems; this._index = index; this._state_no = parent._state_no; } var proto = IdIterator.prototype = new Iterator(); proto.constructor = IdIterator; proto.isBoundTo = function ( o ) { return this._parent === o; }; proto.isTail = function ( ) { if ( this._state_no !== this._parent._state_no ) throw new IllegalStateError("parent IdentifierSet object's state has been changed"); return this._index >= this._elems.length; }; proto.next = function ( ) { if ( this._state_no !== this._parent._state_no ) throw new IllegalStateError("parent IdentifierSet object's state has been changed"); if ( this.isTail() ) throw new NoSuchElementError("no more element after the tail"); return new IdIterator(this._parent, this._elems, this._index+1); }; proto.value = function ( ) { if ( this._state_no !== this._parent._state_no ) throw new IllegalStateError("parent IdentifierSet object's state has been changed"); return this._elems[this._index]; }; return { IdentifierSet: IdentifierSet }; }(); } } } } }.call(null) ) { this.Concurrent.Thread.Compiler.IdentifierSet = IdentifierSet; } }).call(null); (function(){ if ( !this.Concurrent || (typeof this.Concurrent != 'object' && typeof this.Concurrent != 'function') ) this.Concurrent = new Object(); if ( !this.Concurrent.Thread || (typeof this.Concurrent.Thread != 'object' && typeof this.Concurrent.Thread != 'function') ) this.Concurrent.Thread = new Object(); if ( !this.Concurrent.Thread.Compiler || (typeof this.Concurrent.Thread.Compiler != 'object' && typeof this.Concurrent.Thread.Compiler != 'function') ) this.Concurrent.Thread.Compiler = new Object(); if ( this.Concurrent.Thread.Compiler.ErrorReporter === undefined ) this.Concurrent.Thread.Compiler.ErrorReporter = undefined; with ( function(){ with ( Concurrent.Thread.Compiler ) { return function () { var VERSION ; var NAMESPACE; /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Rhino code, released * May 6, 1999. * * The Initial Developer of the Original Code is * Netscape Communications Corporation. * Portions created by the Initial Developer are Copyright (C) 1997-1999 * the Initial Developer. All Rights Reserved. * * Contributor(s): * Norris Boyd * Daisuke Maki * * Alternatively, the contents of this file may be used under the terms of * the GNU General Public License Version 2 or later (the "GPL"), in which * case the provisions of the GPL are applicable instead of those above. If * you wish to allow use of your version of this file only under the terms of * the GPL and not to allow others to use your version of this file under the * MPL, indicate your decision by deleting the provisions above and replacing * them with the notice and other provisions required by the GPL. If you do * not delete the provisions above, a recipient may use your version of this * file under either the MPL or the GPL. * * ***** END LICENSE BLOCK ***** */ /** * This file is based on the file ErrorReporter.java in Rhino 1.6R5. */ // API class NAMESPACE = 'Concurrent.Thread.Compiler'; /** * This is interface defines a protocol for the reporting of * errors during JavaScript translation or execution. * * @author Norris Boyd */ function ErrorReporter ( ) { // This is kind of abstract class. // It provides null-implementations for the methods as default. } var proto = ErrorReporter.prototype; /** * Report a warning. * * The implementing class may choose to ignore the warning * if it desires. * * @param message a String describing the warning * @param line the line number associated with the warning * @param lineSource the text of the line (may be null) * @param lineOffset the offset into lineSource where problem was detected */ proto.warning = function ( message, line, lineSource, lineOffset ) { }; /** * Report an error. * * The implementing class is free to throw an exception if * it desires. * * If execution has not yet begun, the JavaScript engine is * free to find additional errors rather than terminating * the translation. It will not execute a script that had * errors, however. * * @param message a String describing the error * @param line the line number associated with the error * @param lineSource the text of the line (may be null) * @param lineOffset the offset into lineSource where problem was detected */ proto.error = function ( message, line, lineSource, lineOffset ) { }; return { ErrorReporter: ErrorReporter }; }(); } }.call(null) ) { this.Concurrent.Thread.Compiler.ErrorReporter = ErrorReporter; } }).call(null); (function(){ if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Error || (typeof this.Data.Error != 'object' && typeof this.Data.Error != 'function') ) this.Data.Error = new Object(); if ( !this.Concurrent || (typeof this.Concurrent != 'object' && typeof this.Concurrent != 'function') ) this.Concurrent = new Object(); if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Concurrent || (typeof this.Concurrent != 'object' && typeof this.Concurrent != 'function') ) this.Concurrent = new Object(); if ( !this.Concurrent.Thread || (typeof this.Concurrent.Thread != 'object' && typeof this.Concurrent.Thread != 'function') ) this.Concurrent.Thread = new Object(); if ( this.Concurrent.Thread.Mutex === undefined ) this.Concurrent.Thread.Mutex = undefined; with ( function(){ with ( Data ) { with ( Data.Error ) { with ( Concurrent ) { with ( Concurrent.Thread ) { return function () { var VERSION = '0.0.0'; var NAMESPACE; /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Concurrent.Thread code. * * The Initial Developer of the Original Code is * Daisuke Maki. * Portions created by the Initial Developer are Copyright (C) 2008 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ NAMESPACE = 'Concurrent.Thread'; function Mutex ( ) { this._acquiring = null; this._waiting = new LinkedList(); } var proto = Mutex.prototype; proto.isAcquirable = function ( ) { return !this._acquiring && this._waiting.isEmpty(); }; proto.acquire = function ( ) { throw new Error("can't `acquire' in non-converted function"); }; proto.acquire.$Concurrent_Thread_compiled = function ( $this, $args, $cont ) { if ( $this.isAcquirable() ) { $this._acquiring = Thread.self(); return { continuation: $cont , ret_val : void 0, timeout : void 0 }; } else { $this._waiting.push(Thread.self()); var callee = arguments.callee; return { continuation: { procedure: null, this_val : null, exception: { procedure: function( e ){ if ( e === releasedException ) { if ( $this._waiting.shift() !== Thread.self() ) { return { continuation: $cont.exception, ret_val : new IllegalStateError("unknown state (maybe bug)"), timeout : void 0 }; } $this._acquiring = Thread.self(); return { continuation: $cont, ret_val : void 0, timeout : void 0 }; } else { $this._waiting.head().find(function( it ){ return it === Thread.self(); }).remove(); return { continuation: $cont.exception, ret_val : e, timeout : void 0 }; } }, this_val : null, exception: $cont.exception } }, ret_val: void 0, timeout: -1 }; } }; proto.release = function ( ) { if ( !this._acquiring ) { throw new IllegalStateError("mutex is not locked"); } if ( this._acquiring !== Thread.self() ) { throw new IllegalStateError("mutex can be released only by the thread locking it"); } this._acquiring = null; if ( !this._waiting.isEmpty() ) { this._waiting.head().value().notify(releasedException); } }; var releasedException = {}; return { Mutex: Mutex }; }(); } } } } }.call(null) ) { this.Concurrent.Thread.Mutex = Mutex; } }).call(null); (function(){ if ( !this.Concurrent || (typeof this.Concurrent != 'object' && typeof this.Concurrent != 'function') ) this.Concurrent = new Object(); if ( !this.Concurrent.Thread || (typeof this.Concurrent.Thread != 'object' && typeof this.Concurrent.Thread != 'function') ) this.Concurrent.Thread = new Object(); if ( !this.Concurrent.Thread.Compiler || (typeof this.Concurrent.Thread.Compiler != 'object' && typeof this.Concurrent.Thread.Compiler != 'function') ) this.Concurrent.Thread.Compiler = new Object(); if ( !this.Concurrent.Thread.Compiler.Kit || (typeof this.Concurrent.Thread.Compiler.Kit != 'object' && typeof this.Concurrent.Thread.Compiler.Kit != 'function') ) this.Concurrent.Thread.Compiler.Kit = new Object(); if ( this.Concurrent.Thread.Compiler.Kit.printTrees === undefined ) this.Concurrent.Thread.Compiler.Kit.printTrees = undefined; if ( this.Concurrent.Thread.Compiler.Kit.codeBug === undefined ) this.Concurrent.Thread.Compiler.Kit.codeBug = undefined; with ( function(){ with ( Concurrent.Thread.Compiler.Kit ) { return function () { var VERSION = '0.0.0'; var NAMESPACE; /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Rhino code, released * May 6, 1999. * * The Initial Developer of the Original Code is * Netscape Communications Corporation. * Portions created by the Initial Developer are Copyright (C) 1997-1999 * the Initial Developer. All Rights Reserved. * * Contributor(s): * Igor Bukanov, igor@fastmail.fm * Daisuke Maki * * Alternatively, the contents of this file may be used under the terms of * the GNU General Public License Version 2 or later (the "GPL"), in which * case the provisions of the GPL are applicable instead of those above. If * you wish to allow use of your version of this file only under the terms of * the GPL and not to allow others to use your version of this file under the * MPL, indicate your decision by deleting the provisions above and replacing * them with the notice and other provisions required by the GPL. If you do * not delete the provisions above, a recipient may use your version of this * file under either the MPL or the GPL. * * ***** END LICENSE BLOCK ***** */ /** * This file is based on the file Kit.java in Rhino 1.6R5. */ NAMESPACE = 'Concurrent.Thread.Compiler.Kit'; var printTrees = false; // debug flag function codeBug ( /* variable arguments */ ) { var str = ""; for ( var i=0; i < arguments.length; i++ ) str += arguments[i]; var e = new Data.Error.IllegalStateError("FAILED ASSERTION: " + str); var s = e.toString(); if ( e.stack ) s += "\n----------\n" + e.stack; alert(s); throw e; } return { printTrees: printTrees, codeBug: codeBug }; }(); } }.call(null) ) { this.Concurrent.Thread.Compiler.Kit.printTrees = printTrees; this.Concurrent.Thread.Compiler.Kit.codeBug = codeBug; } }).call(null); (function(){ if ( !this.Concurrent || (typeof this.Concurrent != 'object' && typeof this.Concurrent != 'function') ) this.Concurrent = new Object(); if ( !this.Concurrent.Thread || (typeof this.Concurrent.Thread != 'object' && typeof this.Concurrent.Thread != 'function') ) this.Concurrent.Thread = new Object(); if ( !this.Concurrent.Thread.Continuation || (typeof this.Concurrent.Thread.Continuation != 'object' && typeof this.Concurrent.Thread.Continuation != 'function') ) this.Concurrent.Thread.Continuation = new Object(); if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Error || (typeof this.Data.Error != 'object' && typeof this.Data.Error != 'function') ) this.Data.Error = new Object(); if ( this.Concurrent.Thread.Continuation.callcc === undefined ) this.Concurrent.Thread.Continuation.callcc = undefined; if ( this.Concurrent.Thread.Continuation.getCC === undefined ) this.Concurrent.Thread.Continuation.getCC = undefined; if ( this.Concurrent.Thread.Continuation.currentContinuation === undefined ) this.Concurrent.Thread.Continuation.currentContinuation = undefined; if ( this.Concurrent.Thread.Continuation.ContinuationCalledException === undefined ) this.Concurrent.Thread.Continuation.ContinuationCalledException = undefined; with ( function(){ with ( Data.Error ) { with ( Concurrent.Thread.Continuation ) { return function () { var VERSION = '0.0.0'; var NAMESPACE; /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Concurrent.Thread code. * * The Initial Developer of the Original Code is * Daisuke Maki. * Portions created by the Initial Developer are Copyright (C) 2008 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ NAMESPACE = 'Concurrent.Thread.Continuation'; function callcc ( ) { throw new Error("can't call `" + NAMESPACE + ".callcc' in non-threaded functions"); } callcc.$Concurrent_Thread_compiled = function ( $this, $args, $cont ) { function continuation ( ) { throw new Error("can't call any captured continuation in non-threaded functions"); } continuation.$Concurrent_Thread_compiled = function ( $this, $args, _ ) { return { continuation: $cont , timeout : void 0, ret_val : $args[0] }; }; var f = $args[0]; return f && typeof f.$Concurrent_Thread_compiled === "function" ? f.$Concurrent_Thread_compiled(null, [continuation], $cont) : {continuation:$cont, ret_val:f(continuation), timeout:void 0}; }; function getCC ( ) { throw new Error("can't call `" + NAMESPACE + ".getCC' in non-threaded functions"); } getCC.$Concurrent_Thread_compiled = function ( $this, $args, $cont ) { function continuation ( ) { throw new Error("can't call any captured continuation in non-threaded functions"); } continuation.$Concurrent_Thread_compiled = function ( $this, $args, _ ) { return { continuation: $cont , timeout : void 0, ret_val : $args[0] }; }; return {continuation:$cont, ret_val:continuation, timeout:void 0}; }; function currentContinuation ( ) { throw new Error("can't call `" + NAMESPACE + ".currentContinuation' in non-threaded functions"); } currentContinuation.$Concurrent_Thread_compiled = function ( $this, $args, $cont ) { function continuation ( ) { throw new Error("can't call any captured continuation in non-threaded functions"); } continuation.$Concurrent_Thread_compiled = function ( $this, $args, _ ) { return { continuation: $cont.exception, timeout : void 0 , ret_val : new ContinuationCalledException($args) }; }; return { continuation: $cont , timeout : void 0, ret_val : continuation }; }; var ContinuationCalledException = Exception.extend( function ( $super, args ) { $super("continuation called"); this.args = args; }, { name: NAMESPACE + ".ContinuationCalledException" } ); return { ContinuationCalledException: ContinuationCalledException, callcc: callcc, getCC: getCC, currentContinuation: currentContinuation }; }(); } } }.call(null) ) { this.Concurrent.Thread.Continuation.ContinuationCalledException = ContinuationCalledException; this.Concurrent.Thread.Continuation.callcc = callcc; this.Concurrent.Thread.Continuation.getCC = getCC; this.Concurrent.Thread.Continuation.currentContinuation = currentContinuation; } }).call(null); (function(){ if ( !this.Concurrent || (typeof this.Concurrent != 'object' && typeof this.Concurrent != 'function') ) this.Concurrent = new Object(); if ( !this.Concurrent.Thread || (typeof this.Concurrent.Thread != 'object' && typeof this.Concurrent.Thread != 'function') ) this.Concurrent.Thread = new Object(); if ( !this.Concurrent.Thread.Compiler || (typeof this.Concurrent.Thread.Compiler != 'object' && typeof this.Concurrent.Thread.Compiler != 'function') ) this.Concurrent.Thread.Compiler = new Object(); if ( this.Concurrent.Thread.Compiler.Token === undefined ) this.Concurrent.Thread.Compiler.Token = undefined; with ( function(){ with ( Concurrent.Thread.Compiler ) { return function () { var VERSION = '0.0.0'; var NAMESPACE; /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Rhino code, released * May 6, 1999. * * The Initial Developer of the Original Code is * Netscape Communications Corporation. * Portions created by the Initial Developer are Copyright (C) 1997-1999 * the Initial Developer. All Rights Reserved. * * Contributor(s): * Roger Lawrence * Mike McCabe * Igor Bukanov * Milen Nankov * Daisuke Maki * * Alternatively, the contents of this file may be used under the terms of * the GNU General Public License Version 2 or later (the "GPL"), in which * case the provisions of the GPL are applicable instead of those above. If * you wish to allow use of your version of this file only under the terms of * the GPL and not to allow others to use your version of this file under the * MPL, indicate your decision by deleting the provisions above and replacing * them with the notice and other provisions required by the GPL. If you do * not delete the provisions above, a recipient may use your version of this * file under either the MPL or the GPL. * * ***** END LICENSE BLOCK ***** */ /** * This file is based on the file Token.java in Rhino 1.6R5. */ NAMESPACE = 'Concurrent.Thread.Compiler'; var Token = {}; // Although Token is in fact a namespace, we here implements it // "manually" because of efficiency. // start enum Token.ERROR = -1; // well-known as the only code < EOF Token.EOF = 0; // end of file token - (not EOF_CHAR) Token.EOL = 1; // end of line // Interpreter reuses the following as bytecodes Token.FIRST_BYTECODE_TOKEN = 2; Token.ENTERWITH = 2; Token.LEAVEWITH = 3; Token.RETURN = 4; Token.GOTO = 5; Token.IFEQ = 6; Token.IFNE = 7; Token.SETNAME = 8; Token.BITOR = 9; Token.BITXOR = 10; Token.BITAND = 11; Token.EQ = 12; Token.NE = 13; Token.LT = 14; Token.LE = 15; Token.GT = 16; Token.GE = 17; Token.LSH = 18; Token.RSH = 19; Token.URSH = 20; Token.ADD = 21; Token.SUB = 22; Token.MUL = 23; Token.DIV = 24; Token.MOD = 25; Token.NOT = 26; Token.BITNOT = 27; Token.POS = 28; Token.NEG = 29; Token.NEW = 30; Token.DELPROP = 31; Token.TYPEOF = 32; Token.GETPROP = 33; Token.SETPROP = 34; Token.GETELEM = 35; Token.SETELEM = 36; Token.CALL = 37; Token.NAME = 38; Token.NUMBER = 39; Token.STRING = 40; Token.NULL = 41; Token.THIS = 42; Token.FALSE = 43; Token.TRUE = 44; Token.SHEQ = 45; // shallow equality (===) Token.SHNE = 46; // shallow inequality (!==) Token.REGEXP = 47; Token.BINDNAME = 48; Token.THROW = 49; Token.RETHROW = 50; // rethrow caught execetion: catch (e if ) use it Token.IN = 51; Token.INSTANCEOF = 52; Token.LOCAL_LOAD = 53; Token.GETVAR = 54; Token.SETVAR = 55; Token.CATCH_SCOPE = 56; Token.ENUM_INIT_KEYS = 57; Token.ENUM_INIT_VALUES = 58; Token.ENUM_NEXT = 59; Token.ENUM_ID = 60; Token.THISFN = 61; Token.RETURN_RESULT = 62; // to return prevoisly stored return result Token.ARRAYLIT = 63; // array literal Token.OBJECTLIT = 64; // object literal Token.GET_REF = 65; // *reference Token.SET_REF = 66; // *reference : something Token.DEL_REF = 67; // delete reference Token.REF_CALL = 68; // f(args) = something or f(args)++ Token.REF_SPECIAL = 69; // reference for special properties like __proto // For XML support: Token.DEFAULTNAMESPACE = 70; // default xml namespace = Token.ESCXMLATTR = 71; Token.ESCXMLTEXT = 72; Token.REF_MEMBER = 73; // Reference for x.@y, x..y etc. Token.REF_NS_MEMBER = 74; // Reference for x.ns::y, x..ns::y etc. Token.REF_NAME = 75; // Reference for @y, @[y] etc. Token.REF_NS_NAME = 76; // Reference for ns::y, @ns::y@[y] etc. // End of interpreter bytecodes Token.LAST_BYTECODE_TOKEN = Token.REF_NS_NAME; Token.TRY = 77; Token.SEMI = 78; // semicolon Token.LB = 79; // left and right brackets Token.RB = 80; Token.LC = 81; // left and right curlies (braces) Token.RC = 82; Token.LP = 83; // left and right parentheses Token.RP = 84; Token.COMMA = 85; // comma operator Token.ASSIGN = 86; // simple assignment (=) Token.ASSIGN_BITOR = 87; // |= Token.ASSIGN_BITXOR = 88; // ^= Token.ASSIGN_BITAND = 89; // |= Token.ASSIGN_LSH = 90; // <<= Token.ASSIGN_RSH = 91; // >>= Token.ASSIGN_URSH = 92; // >>>= Token.ASSIGN_ADD = 93; // += Token.ASSIGN_SUB = 94; // -= Token.ASSIGN_MUL = 95; // *= Token.ASSIGN_DIV = 96; // /= Token.ASSIGN_MOD = 97; // %= Token.FIRST_ASSIGN = Token.ASSIGN; Token.LAST_ASSIGN = Token.ASSIGN_MOD; Token.HOOK = 98; // conditional (?:) Token.COLON = 99; Token.OR = 100; // logical or (||) Token.AND = 101; // logical and (&&) Token.INC = 102; // increment/decrement (++ --) Token.DEC = 103; Token.DOT = 104; // member operator (.) Token.FUNCTION = 105; // function keyword Token.EXPORT = 106; // export keyword Token.IMPORT = 107; // import keyword Token.IF = 108; // if keyword Token.ELSE = 109; // else keyword Token.SWITCH = 110; // switch keyword Token.CASE = 111; // case keyword Token.DEFAULT = 112; // default keyword Token.WHILE = 113; // while keyword Token.DO = 114; // do keyword Token.FOR = 115; // for keyword Token.BREAK = 116; // break keyword Token.CONTINUE = 117; // continue keyword Token.VAR = 118; // var keyword Token.WITH = 119; // with keyword Token.CATCH = 120; // catch keyword Token.FINALLY = 121; // finally keyword Token.VOID = 122; // void keyword Token.RESERVED = 123; // reserved keywords Token.EMPTY = 124; /* types used for the parse tree - these never get returned * by the scanner. */ Token.BLOCK = 125; // statement block Token.LABEL = 126; // label Token.TARGET = 127; Token.LOOP = 128; Token.EXPR_VOID = 129; // expression statement in functions Token.EXPR_RESULT = 130; // expression statement in scripts Token.JSR = 131; Token.SCRIPT = 132; // top-level node for entire script Token.TYPEOFNAME = 133; // for typeof(simple-name) Token.USE_STACK = 134; Token.SETPROP_OP = 135; // x.y op= something Token.SETELEM_OP = 136; // x[y] op= something Token.LOCAL_BLOCK = 137; Token.SET_REF_OP = 138; // *reference op= something // For XML support: Token.DOTDOT = 139; // member operator (..) Token.COLONCOLON = 140; // namespace::name Token.XML = 141; // XML type Token.DOTQUERY = 142; // .() -- e.g., x.emps.emp.(name == "terry") Token.XMLATTR = 143; // @ Token.XMLEND = 144; // Optimizer-only-tokens Token.TO_OBJECT = 145; Token.TO_DOUBLE = 146; Token.LAST_TOKEN = 146; Token.name = function ( token ) { if ( !Kit.printTrees ) return String(token); with ( Token ) { switch ( token ) { case ERROR: return "ERROR"; case EOF: return "EOF"; case EOL: return "EOL"; case ENTERWITH: return "ENTERWITH"; case LEAVEWITH: return "LEAVEWITH"; case RETURN: return "RETURN"; case GOTO: return "GOTO"; case IFEQ: return "IFEQ"; case IFNE: return "IFNE"; case SETNAME: return "SETNAME"; case BITOR: return "BITOR"; case BITXOR: return "BITXOR"; case BITAND: return "BITAND"; case EQ: return "EQ"; case NE: return "NE"; case LT: return "LT"; case LE: return "LE"; case GT: return "GT"; case GE: return "GE"; case LSH: return "LSH"; case RSH: return "RSH"; case URSH: return "URSH"; case ADD: return "ADD"; case SUB: return "SUB"; case MUL: return "MUL"; case DIV: return "DIV"; case MOD: return "MOD"; case NOT: return "NOT"; case BITNOT: return "BITNOT"; case POS: return "POS"; case NEG: return "NEG"; case NEW: return "NEW"; case DELPROP: return "DELPROP"; case TYPEOF: return "TYPEOF"; case GETPROP: return "GETPROP"; case SETPROP: return "SETPROP"; case GETELEM: return "GETELEM"; case SETELEM: return "SETELEM"; case CALL: return "CALL"; case NAME: return "NAME"; case NUMBER: return "NUMBER"; case STRING: return "STRING"; case NULL: return "NULL"; case THIS: return "THIS"; case FALSE: return "FALSE"; case TRUE: return "TRUE"; case SHEQ: return "SHEQ"; case SHNE: return "SHNE"; case REGEXP: return "OBJECT"; case BINDNAME: return "BINDNAME"; case THROW: return "THROW"; case RETHROW: return "RETHROW"; case IN: return "IN"; case INSTANCEOF: return "INSTANCEOF"; case LOCAL_LOAD: return "LOCAL_LOAD"; case GETVAR: return "GETVAR"; case SETVAR: return "SETVAR"; case CATCH_SCOPE: return "CATCH_SCOPE"; case ENUM_INIT_KEYS: return "ENUM_INIT_KEYS"; case ENUM_INIT_VALUES: return "ENUM_INIT_VALUES"; case ENUM_NEXT: return "ENUM_NEXT"; case ENUM_ID: return "ENUM_ID"; case THISFN: return "THISFN"; case RETURN_RESULT: return "RETURN_RESULT"; case ARRAYLIT: return "ARRAYLIT"; case OBJECTLIT: return "OBJECTLIT"; case GET_REF: return "GET_REF"; case SET_REF: return "SET_REF"; case DEL_REF: return "DEL_REF"; case REF_CALL: return "REF_CALL"; case REF_SPECIAL: return "REF_SPECIAL"; case DEFAULTNAMESPACE:return "DEFAULTNAMESPACE"; case ESCXMLTEXT: return "ESCXMLTEXT"; case ESCXMLATTR: return "ESCXMLATTR"; case REF_MEMBER: return "REF_MEMBER"; case REF_NS_MEMBER: return "REF_NS_MEMBER"; case REF_NAME: return "REF_NAME"; case REF_NS_NAME: return "REF_NS_NAME"; case TRY: return "TRY"; case SEMI: return "SEMI"; case LB: return "LB"; case RB: return "RB"; case LC: return "LC"; case RC: return "RC"; case LP: return "LP"; case RP: return "RP"; case COMMA: return "COMMA"; case ASSIGN: return "ASSIGN"; case ASSIGN_BITOR: return "ASSIGN_BITOR"; case ASSIGN_BITXOR: return "ASSIGN_BITXOR"; case ASSIGN_BITAND: return "ASSIGN_BITAND"; case ASSIGN_LSH: return "ASSIGN_LSH"; case ASSIGN_RSH: return "ASSIGN_RSH"; case ASSIGN_URSH: return "ASSIGN_URSH"; case ASSIGN_ADD: return "ASSIGN_ADD"; case ASSIGN_SUB: return "ASSIGN_SUB"; case ASSIGN_MUL: return "ASSIGN_MUL"; case ASSIGN_DIV: return "ASSIGN_DIV"; case ASSIGN_MOD: return "ASSIGN_MOD"; case HOOK: return "HOOK"; case COLON: return "COLON"; case OR: return "OR"; case AND: return "AND"; case INC: return "INC"; case DEC: return "DEC"; case DOT: return "DOT"; case FUNCTION: return "FUNCTION"; case EXPORT: return "EXPORT"; case IMPORT: return "IMPORT"; case IF: return "IF"; case ELSE: return "ELSE"; case SWITCH: return "SWITCH"; case CASE: return "CASE"; case DEFAULT: return "DEFAULT"; case WHILE: return "WHILE"; case DO: return "DO"; case FOR: return "FOR"; case BREAK: return "BREAK"; case CONTINUE: return "CONTINUE"; case VAR: return "VAR"; case WITH: return "WITH"; case CATCH: return "CATCH"; case FINALLY: return "FINALLY"; case RESERVED: return "RESERVED"; case EMPTY: return "EMPTY"; case BLOCK: return "BLOCK"; case LABEL: return "LABEL"; case TARGET: return "TARGET"; case LOOP: return "LOOP"; case EXPR_VOID: return "EXPR_VOID"; case EXPR_RESULT: return "EXPR_RESULT"; case JSR: return "JSR"; case SCRIPT: return "SCRIPT"; case TYPEOFNAME: return "TYPEOFNAME"; case USE_STACK: return "USE_STACK"; case SETPROP_OP: return "SETPROP_OP"; case SETELEM_OP: return "SETELEM_OP"; case LOCAL_BLOCK: return "LOCAL_BLOCK"; case SET_REF_OP: return "SET_REF_OP"; case DOTDOT: return "DOTDOT"; case COLONCOLON: return "COLONCOLON"; case XML: return "XML"; case DOTQUERY: return "DOTQUERY"; case XMLATTR: return "XMLATTR"; case XMLEND: return "XMLEND"; case TO_OBJECT: return "TO_OBJECT"; case TO_DOUBLE: return "TO_DOUBLE"; } } // Token without name Kit.codeBug(token); }; return { Token: Token }; }(); } }.call(null) ) { this.Concurrent.Thread.Compiler.Token = Token; } }).call(null); (function(){ if ( !this.Concurrent || (typeof this.Concurrent != 'object' && typeof this.Concurrent != 'function') ) this.Concurrent = new Object(); if ( !this.Concurrent.Thread || (typeof this.Concurrent.Thread != 'object' && typeof this.Concurrent.Thread != 'function') ) this.Concurrent.Thread = new Object(); if ( !this.Concurrent.Thread.Compiler || (typeof this.Concurrent.Thread.Compiler != 'object' && typeof this.Concurrent.Thread.Compiler != 'function') ) this.Concurrent.Thread.Compiler = new Object(); if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Cons || (typeof this.Data.Cons != 'object' && typeof this.Data.Cons != 'function') ) this.Data.Cons = new Object(); if ( this.Concurrent.Thread.Compiler.Expression === undefined ) this.Concurrent.Thread.Compiler.Expression = undefined; if ( this.Concurrent.Thread.Compiler.UnaryExpression === undefined ) this.Concurrent.Thread.Compiler.UnaryExpression = undefined; if ( this.Concurrent.Thread.Compiler.BinaryExpression === undefined ) this.Concurrent.Thread.Compiler.BinaryExpression = undefined; if ( this.Concurrent.Thread.Compiler.ThisExpression === undefined ) this.Concurrent.Thread.Compiler.ThisExpression = undefined; if ( this.Concurrent.Thread.Compiler.Identifier === undefined ) this.Concurrent.Thread.Compiler.Identifier = undefined; if ( this.Concurrent.Thread.Compiler.Literal === undefined ) this.Concurrent.Thread.Compiler.Literal = undefined; if ( this.Concurrent.Thread.Compiler.NumberLiteral === undefined ) this.Concurrent.Thread.Compiler.NumberLiteral = undefined; if ( this.Concurrent.Thread.Compiler.StringLiteral === undefined ) this.Concurrent.Thread.Compiler.StringLiteral = undefined; if ( this.Concurrent.Thread.Compiler.RegExpLiteral === undefined ) this.Concurrent.Thread.Compiler.RegExpLiteral = undefined; if ( this.Concurrent.Thread.Compiler.NullLiteral === undefined ) this.Concurrent.Thread.Compiler.NullLiteral = undefined; if ( this.Concurrent.Thread.Compiler.BooleanLiteral === undefined ) this.Concurrent.Thread.Compiler.BooleanLiteral = undefined; if ( this.Concurrent.Thread.Compiler.TrueLiteral === undefined ) this.Concurrent.Thread.Compiler.TrueLiteral = undefined; if ( this.Concurrent.Thread.Compiler.FalseLiteral === undefined ) this.Concurrent.Thread.Compiler.FalseLiteral = undefined; if ( this.Concurrent.Thread.Compiler.ArrayInitializer === undefined ) this.Concurrent.Thread.Compiler.ArrayInitializer = undefined; if ( this.Concurrent.Thread.Compiler.Elision === undefined ) this.Concurrent.Thread.Compiler.Elision = undefined; if ( this.Concurrent.Thread.Compiler.ObjectInitializer === undefined ) this.Concurrent.Thread.Compiler.ObjectInitializer = undefined; if ( this.Concurrent.Thread.Compiler.FunctionExpression === undefined ) this.Concurrent.Thread.Compiler.FunctionExpression = undefined; if ( this.Concurrent.Thread.Compiler.DotAccessor === undefined ) this.Concurrent.Thread.Compiler.DotAccessor = undefined; if ( this.Concurrent.Thread.Compiler.BracketAccessor === undefined ) this.Concurrent.Thread.Compiler.BracketAccessor = undefined; if ( this.Concurrent.Thread.Compiler.NewExpression === undefined ) this.Concurrent.Thread.Compiler.NewExpression = undefined; if ( this.Concurrent.Thread.Compiler.CallExpression === undefined ) this.Concurrent.Thread.Compiler.CallExpression = undefined; if ( this.Concurrent.Thread.Compiler.PostIncExpression === undefined ) this.Concurrent.Thread.Compiler.PostIncExpression = undefined; if ( this.Concurrent.Thread.Compiler.PostDecExpression === undefined ) this.Concurrent.Thread.Compiler.PostDecExpression = undefined; if ( this.Concurrent.Thread.Compiler.PreIncExpression === undefined ) this.Concurrent.Thread.Compiler.PreIncExpression = undefined; if ( this.Concurrent.Thread.Compiler.PreDecExpression === undefined ) this.Concurrent.Thread.Compiler.PreDecExpression = undefined; if ( this.Concurrent.Thread.Compiler.DeleteExpression === undefined ) this.Concurrent.Thread.Compiler.DeleteExpression = undefined; if ( this.Concurrent.Thread.Compiler.VoidExpression === undefined ) this.Concurrent.Thread.Compiler.VoidExpression = undefined; if ( this.Concurrent.Thread.Compiler.TypeofExpression === undefined ) this.Concurrent.Thread.Compiler.TypeofExpression = undefined; if ( this.Concurrent.Thread.Compiler.PosExpression === undefined ) this.Concurrent.Thread.Compiler.PosExpression = undefined; if ( this.Concurrent.Thread.Compiler.NegExpression === undefined ) this.Concurrent.Thread.Compiler.NegExpression = undefined; if ( this.Concurrent.Thread.Compiler.BitNotExpression === undefined ) this.Concurrent.Thread.Compiler.BitNotExpression = undefined; if ( this.Concurrent.Thread.Compiler.NotExpression === undefined ) this.Concurrent.Thread.Compiler.NotExpression = undefined; if ( this.Concurrent.Thread.Compiler.MulExpression === undefined ) this.Concurrent.Thread.Compiler.MulExpression = undefined; if ( this.Concurrent.Thread.Compiler.DivExpression === undefined ) this.Concurrent.Thread.Compiler.DivExpression = undefined; if ( this.Concurrent.Thread.Compiler.ModExpression === undefined ) this.Concurrent.Thread.Compiler.ModExpression = undefined; if ( this.Concurrent.Thread.Compiler.AddExpression === undefined ) this.Concurrent.Thread.Compiler.AddExpression = undefined; if ( this.Concurrent.Thread.Compiler.SubExpression === undefined ) this.Concurrent.Thread.Compiler.SubExpression = undefined; if ( this.Concurrent.Thread.Compiler.LShiftExpression === undefined ) this.Concurrent.Thread.Compiler.LShiftExpression = undefined; if ( this.Concurrent.Thread.Compiler.RShiftExpression === undefined ) this.Concurrent.Thread.Compiler.RShiftExpression = undefined; if ( this.Concurrent.Thread.Compiler.URShiftExpression === undefined ) this.Concurrent.Thread.Compiler.URShiftExpression = undefined; if ( this.Concurrent.Thread.Compiler.LessThanExpression === undefined ) this.Concurrent.Thread.Compiler.LessThanExpression = undefined; if ( this.Concurrent.Thread.Compiler.GreaterThanExpression === undefined ) this.Concurrent.Thread.Compiler.GreaterThanExpression = undefined; if ( this.Concurrent.Thread.Compiler.LessEqualExpression === undefined ) this.Concurrent.Thread.Compiler.LessEqualExpression = undefined; if ( this.Concurrent.Thread.Compiler.GreaterEqualExpression === undefined ) this.Concurrent.Thread.Compiler.GreaterEqualExpression = undefined; if ( this.Concurrent.Thread.Compiler.InstanceofExpression === undefined ) this.Concurrent.Thread.Compiler.InstanceofExpression = undefined; if ( this.Concurrent.Thread.Compiler.InExpression === undefined ) this.Concurrent.Thread.Compiler.InExpression = undefined; if ( this.Concurrent.Thread.Compiler.EqualExpression === undefined ) this.Concurrent.Thread.Compiler.EqualExpression = undefined; if ( this.Concurrent.Thread.Compiler.NotEqualExpression === undefined ) this.Concurrent.Thread.Compiler.NotEqualExpression = undefined; if ( this.Concurrent.Thread.Compiler.StrictEqualExpression === undefined ) this.Concurrent.Thread.Compiler.StrictEqualExpression = undefined; if ( this.Concurrent.Thread.Compiler.StrictNotEqualExpression === undefined ) this.Concurrent.Thread.Compiler.StrictNotEqualExpression = undefined; if ( this.Concurrent.Thread.Compiler.BitAndExpression === undefined ) this.Concurrent.Thread.Compiler.BitAndExpression = undefined; if ( this.Concurrent.Thread.Compiler.BitXorExpression === undefined ) this.Concurrent.Thread.Compiler.BitXorExpression = undefined; if ( this.Concurrent.Thread.Compiler.BitOrExpression === undefined ) this.Concurrent.Thread.Compiler.BitOrExpression = undefined; if ( this.Concurrent.Thread.Compiler.AndExpression === undefined ) this.Concurrent.Thread.Compiler.AndExpression = undefined; if ( this.Concurrent.Thread.Compiler.OrExpression === undefined ) this.Concurrent.Thread.Compiler.OrExpression = undefined; if ( this.Concurrent.Thread.Compiler.ConditionalExpression === undefined ) this.Concurrent.Thread.Compiler.ConditionalExpression = undefined; if ( this.Concurrent.Thread.Compiler.AssignExpression === undefined ) this.Concurrent.Thread.Compiler.AssignExpression = undefined; if ( this.Concurrent.Thread.Compiler.SimpleAssignExpression === undefined ) this.Concurrent.Thread.Compiler.SimpleAssignExpression = undefined; if ( this.Concurrent.Thread.Compiler.MulAssignExpression === undefined ) this.Concurrent.Thread.Compiler.MulAssignExpression = undefined; if ( this.Concurrent.Thread.Compiler.DivAssignExpression === undefined ) this.Concurrent.Thread.Compiler.DivAssignExpression = undefined; if ( this.Concurrent.Thread.Compiler.ModAssignExpression === undefined ) this.Concurrent.Thread.Compiler.ModAssignExpression = undefined; if ( this.Concurrent.Thread.Compiler.AddAssignExpression === undefined ) this.Concurrent.Thread.Compiler.AddAssignExpression = undefined; if ( this.Concurrent.Thread.Compiler.SubAssignExpression === undefined ) this.Concurrent.Thread.Compiler.SubAssignExpression = undefined; if ( this.Concurrent.Thread.Compiler.LShiftAssignExpression === undefined ) this.Concurrent.Thread.Compiler.LShiftAssignExpression = undefined; if ( this.Concurrent.Thread.Compiler.RShiftAssignExpression === undefined ) this.Concurrent.Thread.Compiler.RShiftAssignExpression = undefined; if ( this.Concurrent.Thread.Compiler.URShiftAssignExpression === undefined ) this.Concurrent.Thread.Compiler.URShiftAssignExpression = undefined; if ( this.Concurrent.Thread.Compiler.BitAndAssignExpression === undefined ) this.Concurrent.Thread.Compiler.BitAndAssignExpression = undefined; if ( this.Concurrent.Thread.Compiler.BitXorAssignExpression === undefined ) this.Concurrent.Thread.Compiler.BitXorAssignExpression = undefined; if ( this.Concurrent.Thread.Compiler.BitOrAssignExpression === undefined ) this.Concurrent.Thread.Compiler.BitOrAssignExpression = undefined; if ( this.Concurrent.Thread.Compiler.CommaExpression === undefined ) this.Concurrent.Thread.Compiler.CommaExpression = undefined; with ( function(){ with ( Data.Cons ) { with ( Concurrent.Thread.Compiler ) { return function () { var VERSION ; var NAMESPACE; /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Concurrent.Thread code. * * The Initial Developer of the Original Code is * Daisuke Maki. * Portions created by the Initial Developer are Copyright (C) 2006-2007 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ NAMESPACE = 'Concurrent.Thread.Compiler'; function Expression ( ) { // This is kind of abstract class. } var proto = Expression.prototype; proto.toString = function ( ) { Kit.codeBug("Unimplemented method `toString' of class: " + this.constructor); }; proto.containsFunctionCall = function ( ) { Kit.codeBug("Unimplemented method `containsFunctionCall' of class: " + this.constructor); }; proto.hasSideEffect = function ( ) { Kit.codeBug("Unimplemented method `hasSideEffect' of class: " + this.constructor); }; proto.hasLvalue = function ( ) { return false; }; function UnaryExpression ( e ) { // This is kind of abstract class and should not be instantiated directly. // It just provides default implementations of methods and constructor. this.exp = e; // Expression } var proto = UnaryExpression.prototype = new Expression(); proto.constructor = UnaryExpression; proto.containsFunctionCall = function ( ) { return this.exp.containsFunctionCall(); }; proto.hasSideEffect = function ( ) { return this.exp.hasSideEffect(); }; function BinaryExpression ( l, r ) { // This is kind of abstract class and should not be instantiated directly. // It just provides default implementations of methods and constructor. this.left = l; // Expression this.right = r; // Expression } var proto = BinaryExpression.prototype = new Expression(); proto.constructor = BinaryExpression; proto.containsFunctionCall = function ( ) { return this.left.containsFunctionCall() || this.right.containsFunctionCall(); }; proto.hasSideEffect = function ( ) { return this.left.hasSideEfect() || this.right.hasSideEffect(); }; function ThisExpression ( ) { return THIS_EXPRESSION; // Reuse object. } var proto = ThisExpression.prototype = new Expression(); proto.constructor = ThisExpression; proto.toString = function ( ) { return "this"; }; proto.containsFunctionCall = function ( ) { return false; }; proto.hasSideEffect = function ( ) { return false; }; function temp ( ) { } temp.prototype = ThisExpression.prototype; var THIS_EXPRESSION = new temp(); function Identifier ( s ) { this.string = String(s); this.value = eval('"' + this.string + '"'); } var proto = Identifier.prototype = new Expression(); proto.constructor = Identifier; proto.toString = function ( ) { return this.string; }; proto.valueOf = function ( ) { return this.value; }; proto.hasLvalue = function ( ) { return true; }; proto.containsFunctionCall = function ( ) { return false; }; proto.hasSideEffect = function ( ) { return false; }; function Literal ( s ) { this.string = String(s); this.value = eval(this.string); } var proto = Literal.prototype = new Expression(); proto.constructor = Literal; proto.toString = function ( ) { return this.string; }; proto.valueOf = function ( ) { return this.value; }; proto.containsFunctionCall = function ( ) { return false; }; proto.hasSideEffect = function ( ) { return false; }; function NumberLiteral ( s ) { Literal.apply(this, arguments); } var proto = NumberLiteral.prototype = new Literal(); proto.constructor = NumberLiteral; function StringLiteral ( s ) { Literal.apply(this, arguments); } var proto = StringLiteral.prototype = new Literal(); proto.constructor = StringLiteral; function RegExpLiteral ( s ) { Literal.apply(this, arguments); } var proto = RegExpLiteral.prototype = new Literal(); proto.constructor = RegExpLiteral; function NullLiteral ( ) { return NULL_LITERAL; // Reuse object. } var proto = NullLiteral.prototype = new Literal(); proto.constructor = NullLiteral; proto.string = "null"; proto.vakue = null; proto.toString = function ( ) { return "null"; }; proto.valueOf = function ( ) { return null; }; function temp ( ) { } temp.prototype = NullLiteral.prototype; var NULL_LITERAL = new temp(); function BooleanLiteral ( ) { } var proto = BooleanLiteral.prototype = new Literal(); proto.constructor = BooleanLiteral; function TrueLiteral ( ) { return TRUE_LITERAL; // Reuse object. } var proto = TrueLiteral.prototype = new BooleanLiteral(); proto.constructor = TrueLiteral; proto.string = "true"; proto.vakue = true; proto.toString = function ( ) { return "true"; }; proto.valueOf = function ( ) { return true; }; function temp ( ) { } temp.prototype = TrueLiteral.prototype; var TRUE_LITERAL = new temp(); function FalseLiteral ( ) { return FALSE_LITERAL; // Reuse object. } var proto = FalseLiteral.prototype = new BooleanLiteral(); proto.constructor = FalseLiteral; proto.string = "false"; proto.vakue = false; proto.toString = function ( ) { return "false"; }; proto.valueOf = function ( ) { return false; }; function temp ( ) { } temp.prototype = FalseLiteral.prototype; var FALSE_LITERAL = new temp(); function ArrayInitializer ( elems ) { this.elems = elems; // array of Expression } var proto = ArrayInitializer.prototype = new Expression(); proto.constructor = ArrayInitializer; proto.toString = function ( ) { return "[" + this.elems.join(", ") + "]"; }; proto.containsFunctionCall = function ( ) { for ( var i=0; i < this.elems.length; i++ ) { if ( this.elems[i].containsFunctionCall() ) return true; } return false; }; proto.hasSideEfect = function ( ) { for ( var i=0; i < this.elems.length; i++ ) { if ( this.elems[i].hasSideEffect() ) return true; } return false; }; function Elision ( ) { } var proto = Elision.prototype = new Expression(); proto.constructor = Elision; proto.toString = function ( ) { return ""; }; proto.containsFunctionCall = function ( ) { return false; }; proto.hasSideEffect = function ( ) { return false; }; function ObjectInitializer ( v ) { this.pairs = v; // array of {prop: Identifier or Literal, exp: Expression} } var proto = ObjectInitializer.prototype = new Expression(); proto.constructor = ObjectInitializer; proto.toString = function ( ) { var buf = []; for ( var i=0; i < this.pairs.length; i++ ) { buf.push( String(this.pairs[i].prop) + ":" + String(this.pairs[i].exp) ); } return "{" + buf.join(", ") + "}"; }; proto.containsFunctionCall = function ( ) { for ( var i=0; i < this.pairs.length; i++ ) { if ( this.pairs[i].exp.containsFunctionCall() ) return true; } return false; }; proto.hasSideEffect = function ( ) { for ( var i=0; i < this.pairs.length; i++ ) { if ( this.pairs[i].exp.hasSideEffect() ) return true; } return false; }; function FunctionExpression ( name, params, body ) { this.name = name; // Identifier or null this.params = params; // array of Identifier this.body = body; // cons-list of Statement } var proto = FunctionExpression.prototype = new Expression(); proto.constructor = FunctionExpression; proto.toString = function ( ) { var buf = ["(function "]; if ( this.name ) buf.push(this.name); buf.push( "(", this.params.join(", "), ") {\n"); this.body.forEach(function( it ){ buf.push(it, "\n"); }); buf.push("})"); return buf.join(""); }; proto.containsFunctionCall = function ( ) { return false; }; proto.hasSideEffect = function ( ) { return false; }; function DotAccessor ( base, prop ) { this.base = base; // Expression this.prop = prop; // Identifier } var proto = DotAccessor.prototype = new Expression(); proto.constructor = DotAccessor; proto.toString = function ( ) { return String(this.base) + "." + String(this.prop); }; proto.hasLvalue = function ( ) { return true; }; proto.containsFunctionCall = function ( ) { return this.base.containsFunctionCall(); }; proto.hasSideEffect = function ( ) { return this.base.hasSideEffect(); }; function BracketAccessor ( left, right ) { BinaryExpression.apply(this, arguments); } var proto = BracketAccessor.prototype = new BinaryExpression(); proto.constructor = BracketAccessor; proto.toString = function ( ) { return [ this.left, "[", this.right, "]" ].join(""); }; proto.hasLvalue = function ( ) { return true; }; function NewExpression ( func, args ) { this.func = func; // Expression this.args = args; // array of Expression } var proto = NewExpression.prototype = new Expression(); proto.constructor = NewExpression; proto.toString = function ( ) { return [ "new ", this.func, "(", this.args.join(", "), ")" ].join(""); }; proto.containsFunctionCall = function ( ) { return true; }; proto.hasSideEffect = function ( ) { return true; }; function CallExpression ( func, args ) { this.func = func; // Expression this.args = args; // array of Expression } var proto = CallExpression.prototype = new Expression(); proto.constructor = CallExpression; proto.toString = function ( ) { return [ this.func, "(", this.args.join(", "), ")" ].join(""); }; proto.containsFunctionCall = function ( ) { return true; }; proto.hasSideEffect = function ( ) { return true; }; function PostIncExpression ( e ) { UnaryExpression.apply(this, arguments); } var proto = PostIncExpression.prototype = new UnaryExpression(); proto.constructor = PostIncExpression; proto.toString = function ( ) { return String(this.exp) + "++"; }; proto.hasSideEffect = function ( ) { return true; }; function PostDecExpression ( e ) { UnaryExpression.apply(this, arguments); } var proto = PostDecExpression.prototype = new UnaryExpression(); proto.constructor = PostDecExpression; proto.toString = function ( ) { return String(this.exp) + "--"; }; proto.hasSideEffect = function ( ) { return true; }; function PreIncExpression ( e ) { UnaryExpression.apply(this, arguments); } var proto = PreIncExpression.prototype = new UnaryExpression(); proto.constructor = PreIncExpression; proto.toString = function ( ) { return "++" + String(this.exp); }; proto.hasSideEffect = function ( ) { return true; }; function PreDecExpression ( e ) { UnaryExpression.apply(this, arguments); } var proto = PreDecExpression.prototype = new UnaryExpression(); proto.constructor = PreDecExpression; proto.toString = function ( ) { return "--" + String(this.exp); }; proto.hasSideEffect = function ( ) { return true; }; function DeleteExpression ( e ) { UnaryExpression.apply(this, arguments); } var proto = DeleteExpression.prototype = new UnaryExpression(); proto.constructor = DeleteExpression; proto.toString = function ( ) { return "delete " + String(this.exp); }; proto.hasSideEffect = function ( ) { return true; }; function VoidExpression ( e ) { UnaryExpression.apply(this, arguments); } var proto = VoidExpression.prototype = new UnaryExpression(); proto.constructor = VoidExpression; proto.toString = function ( ) { return "void " + String(this.exp); }; function TypeofExpression ( e ) { UnaryExpression.apply(this, arguments); } var proto = TypeofExpression.prototype = new UnaryExpression(); proto.constructor = TypeofExpression; proto.toString = function ( ) { return "typeof " + String(this.exp); }; function PosExpression ( e ) { UnaryExpression.apply(this, arguments); } var proto = PosExpression.prototype = new UnaryExpression(); proto.constructor = PosExpression; proto.toString = function ( ) { return "+ " + String(this.exp); }; function NegExpression ( e ) { UnaryExpression.apply(this, arguments); } var proto = NegExpression.prototype = new UnaryExpression(); proto.constructor = NegExpression; proto.toString = function ( ) { return "- " + String(this.exp); }; function BitNotExpression ( e ) { UnaryExpression.apply(this, arguments); } var proto = BitNotExpression.prototype = new UnaryExpression(); proto.constructor = BitNotExpression; proto.toString = function ( ) { return "~" + String(this.exp); }; function NotExpression ( e ) { UnaryExpression.apply(this, arguments); } var proto = NotExpression.prototype = new UnaryExpression(); proto.constructor = NotExpression; proto.toString = function ( ) { return "!" + String(this.exp); }; function MulExpression ( left, right ) { BinaryExpression.apply(this, arguments); } var proto = MulExpression.prototype = new BinaryExpression(); proto.constructor = MulExpression; proto.toString = function ( ) { return [ "(", this.left, " * ", this.right, ")" ].join(""); }; function DivExpression ( left, right ) { BinaryExpression.apply(this, arguments); } var proto = DivExpression.prototype = new BinaryExpression(); proto.constructor = DivExpression; proto.toString = function ( ) { return [ "(", this.left, " / ", this.right, ")" ].join(""); }; function ModExpression ( left, right ) { BinaryExpression.apply(this, arguments); } var proto = ModExpression.prototype = new BinaryExpression(); proto.constructor = ModExpression; proto.toString = function ( ) { return [ "(", this.left, " % ", this.right, ")" ].join(""); }; function AddExpression ( left, right ) { BinaryExpression.apply(this, arguments); } var proto = AddExpression.prototype = new BinaryExpression(); proto.constructor = AddExpression; proto.toString = function ( ) { return [ "(", this.left, " + ", this.right, ")" ].join(""); }; function SubExpression ( left, right ) { BinaryExpression.apply(this, arguments); } var proto = SubExpression.prototype = new BinaryExpression(); proto.constructor = SubExpression; proto.toString = function ( ) { return [ "(", this.left, " - ", this.right, ")" ].join(""); }; function LShiftExpression ( left, right ) { BinaryExpression.apply(this, arguments); } var proto = LShiftExpression.prototype = new BinaryExpression(); proto.constructor = LShiftExpression; proto.toString = function ( ) { return [ "(", this.left, " << ", this.right, ")" ].join(""); }; function RShiftExpression ( left, right ) { BinaryExpression.apply(this, arguments); } var proto = RShiftExpression.prototype = new BinaryExpression(); proto.constructor = RShiftExpression; proto.toString = function ( ) { return [ "(", this.left, " >> ", this.right, ")" ].join(""); }; function URShiftExpression ( left, right ) { BinaryExpression.apply(this, arguments); } var proto = URShiftExpression.prototype = new BinaryExpression(); proto.constructor = URShiftExpression; proto.toString = function ( ) { return [ "(", this.left, " >>> ", this.right, ")" ].join(""); }; function LessThanExpression ( left, right ) { BinaryExpression.apply(this, arguments); } var proto = LessThanExpression.prototype = new BinaryExpression(); proto.constructor = LessThanExpression; proto.toString = function ( ) { return [ "(", this.left, " < ", this.right, ")" ].join(""); }; function GreaterThanExpression ( left, right ) { BinaryExpression.apply(this, arguments); } var proto = GreaterThanExpression.prototype = new BinaryExpression(); proto.constructor = GreaterThanExpression; proto.toString = function ( ) { return [ "(", this.left, " > ", this.right, ")" ].join(""); }; function LessEqualExpression ( left, right ) { BinaryExpression.apply(this, arguments); } var proto = LessEqualExpression.prototype = new BinaryExpression(); proto.constructor = LessEqualExpression; proto.toString = function ( ) { return [ "(", this.left, " <= ", this.right, ")" ].join(""); }; function GreaterEqualExpression ( left, right ) { BinaryExpression.apply(this, arguments); } var proto = GreaterEqualExpression.prototype = new BinaryExpression(); proto.constructor = GreaterEqualExpression; proto.toString = function ( ) { return [ "(", this.left, " >= ", this.right, ")" ].join(""); }; function InstanceofExpression ( left, right ) { BinaryExpression.apply(this, arguments); } var proto = InstanceofExpression.prototype = new BinaryExpression(); proto.constructor = InstanceofExpression; proto.toString = function ( ) { return [ "(", this.left, " instanceof ", this.right, ")" ].join(""); }; function InExpression ( left, right ) { BinaryExpression.apply(this, arguments); } var proto = InExpression.prototype = new BinaryExpression(); proto.constructor = InExpression; proto.toString = function ( ) { return [ "(", this.left, " in ", this.right, ")" ].join(""); }; function EqualExpression ( left, right ) { BinaryExpression.apply(this, arguments); } var proto = EqualExpression.prototype = new BinaryExpression(); proto.constructor = EqualExpression; proto.toString = function ( ) { return [ "(", this.left, " == ", this.right, ")" ].join(""); }; function NotEqualExpression ( left, right ) { BinaryExpression.apply(this, arguments); } var proto = NotEqualExpression.prototype = new BinaryExpression(); proto.constructor = NotEqualExpression; proto.toString = function ( ) { return [ "(", this.left, " != ", this.right, ")" ].join(""); }; function StrictEqualExpression ( left, right ) { BinaryExpression.apply(this, arguments); } var proto = StrictEqualExpression.prototype = new BinaryExpression(); proto.constructor = StrictEqualExpression; proto.toString = function ( ) { return [ "(", this.left, " === ", this.right, ")" ].join(""); }; function StrictNotEqualExpression ( left, right ) { BinaryExpression.apply(this, arguments); } var proto = StrictNotEqualExpression.prototype = new BinaryExpression(); proto.constructor = StrictNotEqualExpression; proto.toString = function ( ) { return [ "(", this.left, " !== ", this.right, ")" ].join(""); }; function BitAndExpression ( left, right ) { BinaryExpression.apply(this, arguments); } var proto = BitAndExpression.prototype = new BinaryExpression(); proto.constructor = BitAndExpression; proto.toString = function ( ) { return [ "(", this.left, " & ", this.right, ")" ].join(""); }; function BitXorExpression ( left, right ) { BinaryExpression.apply(this, arguments); } var proto = BitXorExpression.prototype = new BinaryExpression(); proto.constructor = BitXorExpression; proto.toString = function ( ) { return [ "(", this.left, " ^ ", this.right, ")" ].join(""); }; function BitOrExpression ( left, right ) { BinaryExpression.apply(this, arguments); } var proto = BitOrExpression.prototype = new BinaryExpression(); proto.constructor = BitOrExpression; proto.toString = function ( ) { return [ "(", this.left, " | ", this.right, ")" ].join(""); }; function AndExpression ( left, right ) { BinaryExpression.apply(this, arguments); } var proto = AndExpression.prototype = new BinaryExpression(); proto.constructor = AndExpression; proto.toString = function ( ) { return [ "(", this.left, " && ", this.right, ")" ].join(""); }; function OrExpression ( left, right ) { BinaryExpression.apply(this, arguments); } var proto = OrExpression.prototype = new BinaryExpression(); proto.constructor = OrExpression; proto.toString = function ( ) { return [ "(", this.left, " || ", this.right, ")" ].join(""); }; function ConditionalExpression ( c, t, f ) { this.cond = c; // Expression this.texp = t; // Expression this.fexp = f; // Expression } var proto = ConditionalExpression.prototype = new Expression(); proto.constructor = ConditionalExpression; proto.toString = function ( ) { return [ "(", this.cond, " ? ", this.texp, " : ", this.fexp, ")" ].join(""); }; proto.containsFunctionCall = function ( ) { return this.cond.containsFunctionCall() || this.texp.containsFunctionCall() || this.fexp.containsFunctionCall(); }; proto.hasSideEffect = function ( ) { return this.cond.hasSideEffect() || this.texp.hasSideEffect() || this.fexp.hasSideEffect(); }; function AssignExpression ( left, right ) { // This is kind of interface. It just represents a set of classes. BinaryExpression.apply(this, arguments); } var proto = AssignExpression.prototype = new BinaryExpression(); proto.constructor = AssignExpression; proto.hasSideEffect = function ( ) { return true; }; function SimpleAssignExpression ( left, right ) { AssignExpression.apply(this, arguments); } var proto = SimpleAssignExpression.prototype = new AssignExpression(); proto.constructor = SimpleAssignExpression; proto.toString = function ( ) { return [ "(", this.left, " = ", this.right, ")" ].join(""); }; function MulAssignExpression ( left, right ) { AssignExpression.apply(this, arguments); } var proto = MulAssignExpression.prototype = new AssignExpression(); proto.constructor = MulAssignExpression; proto.toString = function ( ) { return [ "(", this.left, " *= ", this.right, ")" ].join(""); }; function DivAssignExpression ( left, right ) { AssignExpression.apply(this, arguments); } var proto = DivAssignExpression.prototype = new AssignExpression(); proto.constructor = DivAssignExpression; proto.toString = function ( ) { return [ "(", this.left, " /= ", this.right, ")" ].join(""); }; function ModAssignExpression ( left, right ) { AssignExpression.apply(this, arguments); } var proto = ModAssignExpression.prototype = new AssignExpression(); proto.constructor = ModAssignExpression; proto.toString = function ( ) { return [ "(", this.left, " %= ", this.right, ")" ].join(""); }; function AddAssignExpression ( left, right ) { AssignExpression.apply(this, arguments); } var proto = AddAssignExpression.prototype = new AssignExpression(); proto.constructor = AddAssignExpression; proto.toString = function ( ) { return [ "(", this.left, " += ", this.right, ")" ].join(""); }; function SubAssignExpression ( left, right ) { AssignExpression.apply(this, arguments); } var proto = SubAssignExpression.prototype = new AssignExpression(); proto.constructor = SubAssignExpression; proto.toString = function ( ) { return [ "(", this.left, " -= ", this.right, ")" ].join(""); }; function LShiftAssignExpression ( left, right ) { AssignExpression.apply(this, arguments); } var proto = LShiftAssignExpression.prototype = new AssignExpression(); proto.constructor = LShiftAssignExpression; proto.toString = function ( ) { return [ "(", this.left, " <<= ", this.right, ")" ].join(""); }; function RShiftAssignExpression ( left, right ) { AssignExpression.apply(this, arguments); } var proto = RShiftAssignExpression.prototype = new AssignExpression(); proto.constructor = RShiftAssignExpression; proto.toString = function ( ) { return [ "(", this.left, " >>= ", this.right, ")" ].join(""); }; function URShiftAssignExpression ( left, right ) { AssignExpression.apply(this, arguments); } var proto = URShiftAssignExpression.prototype = new AssignExpression(); proto.constructor = URShiftAssignExpression; proto.toString = function ( ) { return [ "(", this.left, " >>>= ", this.right, ")" ].join(""); }; function BitAndAssignExpression ( left, right ) { AssignExpression.apply(this, arguments); } var proto = BitAndAssignExpression.prototype = new AssignExpression(); proto.constructor = BitAndAssignExpression; proto.toString = function ( ) { return [ "(", this.left, " &= ", this.right, ")" ].join(""); }; function BitXorAssignExpression ( left, right ) { AssignExpression.apply(this, arguments); } var proto = BitXorAssignExpression.prototype = new AssignExpression(); proto.constructor = BitXorAssignExpression; proto.toString = function ( ) { return [ "(", this.left, " ^= ", this.right, ")" ].join(""); }; function BitOrAssignExpression ( left, right ) { AssignExpression.apply(this, arguments); } var proto = BitOrAssignExpression.prototype = new AssignExpression(); proto.constructor = BitOrAssignExpression; proto.toString = function ( ) { return [ "(", this.left, " |= ", this.right, ")" ].join(""); }; function CommaExpression ( left, right ) { BinaryExpression.apply(this, arguments); } var proto = CommaExpression.prototype = new BinaryExpression(); proto.constructor = CommaExpression; proto.toString = function ( ) { return [ "(", this.left, ", ", this.right, ")" ].join(""); }; return { StrictEqualExpression: StrictEqualExpression, BooleanLiteral: BooleanLiteral, OrExpression: OrExpression, NotExpression: NotExpression, ThisExpression: ThisExpression, BitAndAssignExpression: BitAndAssignExpression, DivExpression: DivExpression, BracketAccessor: BracketAccessor, CommaExpression: CommaExpression, BitAndExpression: BitAndExpression, MulExpression: MulExpression, EqualExpression: EqualExpression, CallExpression: CallExpression, FunctionExpression: FunctionExpression, Elision: Elision, PostIncExpression: PostIncExpression, InstanceofExpression: InstanceofExpression, NullLiteral: NullLiteral, BitXorAssignExpression: BitXorAssignExpression, URShiftExpression: URShiftExpression, ConditionalExpression: ConditionalExpression, Identifier: Identifier, UnaryExpression: UnaryExpression, BitOrAssignExpression: BitOrAssignExpression, DivAssignExpression: DivAssignExpression, VoidExpression: VoidExpression, TypeofExpression: TypeofExpression, NewExpression: NewExpression, MulAssignExpression: MulAssignExpression, BinaryExpression: BinaryExpression, TrueLiteral: TrueLiteral, AssignExpression: AssignExpression, SubExpression: SubExpression, PreDecExpression: PreDecExpression, RegExpLiteral: RegExpLiteral, DeleteExpression: DeleteExpression, FalseLiteral: FalseLiteral, BitNotExpression: BitNotExpression, GreaterEqualExpression: GreaterEqualExpression, LessEqualExpression: LessEqualExpression, ModExpression: ModExpression, StringLiteral: StringLiteral, LShiftAssignExpression: LShiftAssignExpression, SubAssignExpression: SubAssignExpression, LShiftExpression: LShiftExpression, ModAssignExpression: ModAssignExpression, URShiftAssignExpression: URShiftAssignExpression, NegExpression: NegExpression, PosExpression: PosExpression, AddAssignExpression: AddAssignExpression, ArrayInitializer: ArrayInitializer, LessThanExpression: LessThanExpression, NumberLiteral: NumberLiteral, StrictNotEqualExpression: StrictNotEqualExpression, RShiftExpression: RShiftExpression, InExpression: InExpression, BitOrExpression: BitOrExpression, AndExpression: AndExpression, PostDecExpression: PostDecExpression, ObjectInitializer: ObjectInitializer, RShiftAssignExpression: RShiftAssignExpression, Expression: Expression, DotAccessor: DotAccessor, Literal: Literal, SimpleAssignExpression: SimpleAssignExpression, BitXorExpression: BitXorExpression, AddExpression: AddExpression, GreaterThanExpression: GreaterThanExpression, NotEqualExpression: NotEqualExpression, PreIncExpression: PreIncExpression }; }(); } } }.call(null) ) { this.Concurrent.Thread.Compiler.StrictEqualExpression = StrictEqualExpression; this.Concurrent.Thread.Compiler.BooleanLiteral = BooleanLiteral; this.Concurrent.Thread.Compiler.OrExpression = OrExpression; this.Concurrent.Thread.Compiler.NotExpression = NotExpression; this.Concurrent.Thread.Compiler.ThisExpression = ThisExpression; this.Concurrent.Thread.Compiler.BitAndAssignExpression = BitAndAssignExpression; this.Concurrent.Thread.Compiler.DivExpression = DivExpression; this.Concurrent.Thread.Compiler.BracketAccessor = BracketAccessor; this.Concurrent.Thread.Compiler.CommaExpression = CommaExpression; this.Concurrent.Thread.Compiler.BitAndExpression = BitAndExpression; this.Concurrent.Thread.Compiler.MulExpression = MulExpression; this.Concurrent.Thread.Compiler.EqualExpression = EqualExpression; this.Concurrent.Thread.Compiler.CallExpression = CallExpression; this.Concurrent.Thread.Compiler.FunctionExpression = FunctionExpression; this.Concurrent.Thread.Compiler.Elision = Elision; this.Concurrent.Thread.Compiler.PostIncExpression = PostIncExpression; this.Concurrent.Thread.Compiler.InstanceofExpression = InstanceofExpression; this.Concurrent.Thread.Compiler.NullLiteral = NullLiteral; this.Concurrent.Thread.Compiler.BitXorAssignExpression = BitXorAssignExpression; this.Concurrent.Thread.Compiler.URShiftExpression = URShiftExpression; this.Concurrent.Thread.Compiler.ConditionalExpression = ConditionalExpression; this.Concurrent.Thread.Compiler.Identifier = Identifier; this.Concurrent.Thread.Compiler.UnaryExpression = UnaryExpression; this.Concurrent.Thread.Compiler.BitOrAssignExpression = BitOrAssignExpression; this.Concurrent.Thread.Compiler.DivAssignExpression = DivAssignExpression; this.Concurrent.Thread.Compiler.VoidExpression = VoidExpression; this.Concurrent.Thread.Compiler.TypeofExpression = TypeofExpression; this.Concurrent.Thread.Compiler.NewExpression = NewExpression; this.Concurrent.Thread.Compiler.MulAssignExpression = MulAssignExpression; this.Concurrent.Thread.Compiler.BinaryExpression = BinaryExpression; this.Concurrent.Thread.Compiler.TrueLiteral = TrueLiteral; this.Concurrent.Thread.Compiler.AssignExpression = AssignExpression; this.Concurrent.Thread.Compiler.SubExpression = SubExpression; this.Concurrent.Thread.Compiler.PreDecExpression = PreDecExpression; this.Concurrent.Thread.Compiler.RegExpLiteral = RegExpLiteral; this.Concurrent.Thread.Compiler.DeleteExpression = DeleteExpression; this.Concurrent.Thread.Compiler.FalseLiteral = FalseLiteral; this.Concurrent.Thread.Compiler.BitNotExpression = BitNotExpression; this.Concurrent.Thread.Compiler.GreaterEqualExpression = GreaterEqualExpression; this.Concurrent.Thread.Compiler.LessEqualExpression = LessEqualExpression; this.Concurrent.Thread.Compiler.ModExpression = ModExpression; this.Concurrent.Thread.Compiler.StringLiteral = StringLiteral; this.Concurrent.Thread.Compiler.LShiftAssignExpression = LShiftAssignExpression; this.Concurrent.Thread.Compiler.SubAssignExpression = SubAssignExpression; this.Concurrent.Thread.Compiler.LShiftExpression = LShiftExpression; this.Concurrent.Thread.Compiler.ModAssignExpression = ModAssignExpression; this.Concurrent.Thread.Compiler.URShiftAssignExpression = URShiftAssignExpression; this.Concurrent.Thread.Compiler.NegExpression = NegExpression; this.Concurrent.Thread.Compiler.PosExpression = PosExpression; this.Concurrent.Thread.Compiler.AddAssignExpression = AddAssignExpression; this.Concurrent.Thread.Compiler.ArrayInitializer = ArrayInitializer; this.Concurrent.Thread.Compiler.LessThanExpression = LessThanExpression; this.Concurrent.Thread.Compiler.NumberLiteral = NumberLiteral; this.Concurrent.Thread.Compiler.StrictNotEqualExpression = StrictNotEqualExpression; this.Concurrent.Thread.Compiler.RShiftExpression = RShiftExpression; this.Concurrent.Thread.Compiler.InExpression = InExpression; this.Concurrent.Thread.Compiler.BitOrExpression = BitOrExpression; this.Concurrent.Thread.Compiler.AndExpression = AndExpression; this.Concurrent.Thread.Compiler.PostDecExpression = PostDecExpression; this.Concurrent.Thread.Compiler.ObjectInitializer = ObjectInitializer; this.Concurrent.Thread.Compiler.RShiftAssignExpression = RShiftAssignExpression; this.Concurrent.Thread.Compiler.Expression = Expression; this.Concurrent.Thread.Compiler.DotAccessor = DotAccessor; this.Concurrent.Thread.Compiler.Literal = Literal; this.Concurrent.Thread.Compiler.SimpleAssignExpression = SimpleAssignExpression; this.Concurrent.Thread.Compiler.BitXorExpression = BitXorExpression; this.Concurrent.Thread.Compiler.AddExpression = AddExpression; this.Concurrent.Thread.Compiler.GreaterThanExpression = GreaterThanExpression; this.Concurrent.Thread.Compiler.NotEqualExpression = NotEqualExpression; this.Concurrent.Thread.Compiler.PreIncExpression = PreIncExpression; } }).call(null); (function(){ if ( !this.Concurrent || (typeof this.Concurrent != 'object' && typeof this.Concurrent != 'function') ) this.Concurrent = new Object(); if ( !this.Concurrent.Thread || (typeof this.Concurrent.Thread != 'object' && typeof this.Concurrent.Thread != 'function') ) this.Concurrent.Thread = new Object(); if ( !this.Concurrent.Thread.Compiler || (typeof this.Concurrent.Thread.Compiler != 'object' && typeof this.Concurrent.Thread.Compiler != 'function') ) this.Concurrent.Thread.Compiler = new Object(); if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Cons || (typeof this.Data.Cons != 'object' && typeof this.Data.Cons != 'function') ) this.Data.Cons = new Object(); if ( this.Concurrent.Thread.Compiler.Statement === undefined ) this.Concurrent.Thread.Compiler.Statement = undefined; if ( this.Concurrent.Thread.Compiler.EmptyStatement === undefined ) this.Concurrent.Thread.Compiler.EmptyStatement = undefined; if ( this.Concurrent.Thread.Compiler.Block === undefined ) this.Concurrent.Thread.Compiler.Block = undefined; if ( this.Concurrent.Thread.Compiler.ExpStatement === undefined ) this.Concurrent.Thread.Compiler.ExpStatement = undefined; if ( this.Concurrent.Thread.Compiler.VarStatement === undefined ) this.Concurrent.Thread.Compiler.VarStatement = undefined; if ( this.Concurrent.Thread.Compiler.IfStatement === undefined ) this.Concurrent.Thread.Compiler.IfStatement = undefined; if ( this.Concurrent.Thread.Compiler.IfElseStatement === undefined ) this.Concurrent.Thread.Compiler.IfElseStatement = undefined; if ( this.Concurrent.Thread.Compiler.DoWhileStatement === undefined ) this.Concurrent.Thread.Compiler.DoWhileStatement = undefined; if ( this.Concurrent.Thread.Compiler.WhileStatement === undefined ) this.Concurrent.Thread.Compiler.WhileStatement = undefined; if ( this.Concurrent.Thread.Compiler.ForStatement === undefined ) this.Concurrent.Thread.Compiler.ForStatement = undefined; if ( this.Concurrent.Thread.Compiler.ForVarStatement === undefined ) this.Concurrent.Thread.Compiler.ForVarStatement = undefined; if ( this.Concurrent.Thread.Compiler.ForInStatement === undefined ) this.Concurrent.Thread.Compiler.ForInStatement = undefined; if ( this.Concurrent.Thread.Compiler.ForInVarStatement === undefined ) this.Concurrent.Thread.Compiler.ForInVarStatement = undefined; if ( this.Concurrent.Thread.Compiler.ForEachStatement === undefined ) this.Concurrent.Thread.Compiler.ForEachStatement = undefined; if ( this.Concurrent.Thread.Compiler.ForEachVarStatement === undefined ) this.Concurrent.Thread.Compiler.ForEachVarStatement = undefined; if ( this.Concurrent.Thread.Compiler.ContinueStatement === undefined ) this.Concurrent.Thread.Compiler.ContinueStatement = undefined; if ( this.Concurrent.Thread.Compiler.BreakStatement === undefined ) this.Concurrent.Thread.Compiler.BreakStatement = undefined; if ( this.Concurrent.Thread.Compiler.ReturnStatement === undefined ) this.Concurrent.Thread.Compiler.ReturnStatement = undefined; if ( this.Concurrent.Thread.Compiler.WithStatement === undefined ) this.Concurrent.Thread.Compiler.WithStatement = undefined; if ( this.Concurrent.Thread.Compiler.SwitchStatement === undefined ) this.Concurrent.Thread.Compiler.SwitchStatement = undefined; if ( this.Concurrent.Thread.Compiler.CaseClause === undefined ) this.Concurrent.Thread.Compiler.CaseClause = undefined; if ( this.Concurrent.Thread.Compiler.DefaultClause === undefined ) this.Concurrent.Thread.Compiler.DefaultClause = undefined; if ( this.Concurrent.Thread.Compiler.ThrowStatement === undefined ) this.Concurrent.Thread.Compiler.ThrowStatement = undefined; if ( this.Concurrent.Thread.Compiler.TryCatchStatement === undefined ) this.Concurrent.Thread.Compiler.TryCatchStatement = undefined; if ( this.Concurrent.Thread.Compiler.TryFinallyStatement === undefined ) this.Concurrent.Thread.Compiler.TryFinallyStatement = undefined; if ( this.Concurrent.Thread.Compiler.TryCatchFinallyStatement === undefined ) this.Concurrent.Thread.Compiler.TryCatchFinallyStatement = undefined; if ( this.Concurrent.Thread.Compiler.TryCatchListStatement === undefined ) this.Concurrent.Thread.Compiler.TryCatchListStatement = undefined; if ( this.Concurrent.Thread.Compiler.TryCatchListFinallyStatement === undefined ) this.Concurrent.Thread.Compiler.TryCatchListFinallyStatement = undefined; if ( this.Concurrent.Thread.Compiler.CatchGuard === undefined ) this.Concurrent.Thread.Compiler.CatchGuard = undefined; if ( this.Concurrent.Thread.Compiler.FunctionDeclaration === undefined ) this.Concurrent.Thread.Compiler.FunctionDeclaration = undefined; with ( function(){ with ( Data.Cons ) { with ( Concurrent.Thread.Compiler ) { return function () { var VERSION ; var NAMESPACE; /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Concurrent.Thread code. * * The Initial Developer of the Original Code is * Daisuke Maki. * Portions created by the Initial Developer are Copyright (C) 2006-2007 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ NAMESPACE = 'Concurrent.Thread.Compiler'; function Statement ( labels, lineno, source ) { // This is kind of abstract class. this.labels = labels; // array of Identifier # labels directly qualifying this statement this.lineno = lineno; // Number (optional) # line no. this.source = source; // String (optional) # file-name, URL, ...etc } Statement.prototype.toString = function ( ) { Kit.codeBug(); }; // kind of final protected method. // Use this like: labelsToString.call(obj, arg0, arg1 ...) function labelsToString ( ) { var buf = []; for ( var i=0; i < this.labels.length; i++ ) { buf.push(this.labels[i], ": "); } return buf.join(""); } function EmptyStatement ( labels, lineno, source ) { Statement.call(this, labels, lineno, source); } var proto = EmptyStatement.prototype = new Statement(); proto.constructor = EmptyStatement; proto.toString = function ( ) { return labelsToString.call(this) + ";"; }; function Block ( labels, body, lineno, source ) { Statement.call(this, labels, lineno, source); this.body = body; // cons-list of Statement } var proto = Block.prototype = new Statement(); proto.constructor = Block; proto.toString = function ( ) { var buf = [labelsToString.call(this), "{"]; this.body.forEach(function( it ){ buf.push(it); }); buf.push("}"); return buf.join("\n"); }; function ExpStatement ( labels, exp, lineno, source ) { Statement.call(this, labels, lineno, source); this.exp = exp; // Expression } var proto = ExpStatement.prototype = new Statement(); proto.constructor = ExpStatement; proto.toString = function ( ) { return labelsToString.call(this) + String(this.exp) + ";"; }; proto.containsFunctionCall = function ( ) { return this.exp.containsFunctionCall(); }; function VarStatement ( labels, decls, lineno, source ) { Statement.call(this, labels, lineno, source); this.decls = decls; // array of {id: Identifier, exp: Expression or null} } var proto = VarStatement.prototype = new Statement(); proto.constructor = VarStatement; proto.toString = function ( ) { var buf = []; for ( var i=0; i < this.decls.length; i++ ) { if ( this.decls[i].exp ) { buf.push( [ this.decls[i].id, "=", this.decls[i].exp ].join("") ); } else { buf.push( this.decls[i].id ); } } return [ labelsToString.call(this), "var ", buf.join(", "), ";", ].join(""); }; proto.containsFunctionCall = function ( ) { for ( var i=0; i < this.decls.length; i++ ) { if ( this.decls[i].exp && this.decls[i].exp.containsFunctionCall() ) { return true; } } return false; }; function IfStatement ( labels, cond, body, lineno, source ) { Statement.call(this, labels, lineno, source); this.cond = cond; // Expression this.body = body; // Statement } var proto = IfStatement.prototype = new Statement(); proto.constructor = IfStatement; proto.toString = function ( ) { return [ labelsToString.call(this), "if (", this.cond, ") ", this.body ].join(""); }; function IfElseStatement ( labels, cond, tbody, fbody, lineno, source ) { Statement.call(this, labels, lineno, source); this.cond = cond; // Expression this.tbody = tbody; // Statement this.fbody = fbody; // Statement } var proto = IfElseStatement.prototype = new Statement(); proto.constructor = IfElseStatement; proto.toString = function ( ) { return [ labelsToString.call(this), "if (", this.cond, ") ", this.tbody, "\n", "else ", this.fbody ].join(""); }; function DoWhileStatement ( labels, body, cond, lineno, source ) { Statement.call(this, labels, lineno, source); this.body = body; // Statement this.cond = cond; // Expression } var proto = DoWhileStatement.prototype = new Statement(); proto.constructor = DoWhileStatement; proto.toString = function ( ) { return [ labelsToString.call(this), "do ", this.body, " while (", this.cond, ");" ].join(""); }; function WhileStatement ( labels, cond, body, lineno, source ) { Statement.call(this, labels, lineno, source); this.cond = cond; // Expression this.body = body; // Statement } var proto = WhileStatement.prototype = new Statement(); proto.constructor = WhileStatement; proto.toString = function ( ) { return [ labelsToString.call(this), "while (", this.cond, ") ", this.body ].join(""); }; function ForStatement ( labels, init, cond, incr, body, lineno, source ) { Statement.call(this, labels, lineno, source); this.init = init; // Expression or null this.cond = cond; // Expression or null this.incr = incr; // Expression or null this.body = body; // Statement } var proto = ForStatement.prototype = new Statement(); proto.constructor = ForStatement; proto.toString = function ( ) { return [ labelsToString.call(this), "for (", this.init ? this.init : "", "; ", this.cond ? this.cond : "", "; ", this.incr ? this.incr : "", ") ", this.body ].join(""); }; function ForVarStatement ( labels, decls, cond, incr, body, lineno, source ) { Statement.call(this, labels, lineno, source); this.decls = decls; // array of {id: Identifier, exp: Expression or null} this.cond = cond; // Expression or null this.incr = incr; // Expression or null this.body = body; // Statement } var proto = ForVarStatement.prototype = new Statement(); proto.constructor = ForVarStatement; proto.toString = function ( ) { return [ labelsToString.call(this), "for (", (this.decls.length ? new VarStatement([], this.decls) : ";"), " ", this.cond ? this.cond : "", "; ", this.incr ? this.incr : "", ") ", this.body ].join(""); }; function ForInStatement ( labels, lhs, exp, body, lineno, source ) { Statement.call(this, labels, lineno, source); this.lhs = lhs; // Identifier or DotAccessor or BracketAccessor this.exp = exp; // Expression this.body = body; // Statement } var proto = ForInStatement.prototype = new Statement(); proto.constructor = ForInStatement; proto.toString = function ( ) { return [ labelsToString.call(this), "for (", this.lhs, " in ", this.exp, ") ", this.body ].join(""); }; function ForInVarStatement ( labels, decl, exp, body, lineno, source ) { Statement.call(this, labels, lineno, source); this.decl = decl; // {id: Identifier, exp: Expression or null} this.exp = exp; // Expression this.body = body; // Statement } var proto = ForInVarStatement.prototype = new Statement(); proto.constructor = ForInVarStatement; proto.toString = function ( ) { return [ labelsToString.call(this), "for ( var ", this.decl.exp ? String(this.decl.id) + "=" + String(this.decl.exp) : String(this.decl.id), " in ", this.exp, ") ", this.body ].join(""); }; // Mozilla extention "for each ( ... in ... )" function ForEachStatement ( labels, lhs, exp, body, lineno, source ) { Statement.call(this, labels, lineno, source); this.lhs = lhs; // Identifier or DotAccessor or BracketAccessor this.exp = exp; // Expression this.body = body; // Statement } var proto = ForEachStatement.prototype = new Statement(); proto.constructor = ForEachStatement; proto.toString = function ( ) { return [ labelsToString.call(this), "for each (", this.lhs, " in ", this.exp, ") ", this.body ].join(""); }; function ForEachVarStatement ( labels, decl, exp, body, lineno, source ) { Statement.call(this, labels, lineno, source); this.decl = decl; // {id: Identifier, exp: Expression or null} this.exp = exp; // Expression this.body = body; // Statement } var proto = ForEachVarStatement.prototype = new Statement(); proto.constructor = ForEachVarStatement; proto.toString = function ( ) { return [ labelsToString.call(this), "for each ( var ", this.decl.exp ? String(this.decl.id) + "=" + String(this.decl.exp) : String(this.decl.id), " in ", this.exp, ") ", this.body ].join(""); }; function ContinueStatement ( labels, target, lineno, source ) { Statement.call(this, labels, lineno, source); this.target = target; // Identifier or null } var proto = ContinueStatement.prototype = new Statement(); proto.constructor = ContinueStatement; proto.toString = function ( ) { var buf = [labelsToString.call(this), "continue"]; if ( this.target ) buf.push(" ", this.target); buf.push(";"); return buf.join(""); }; function BreakStatement ( labels, target, lineno, source ) { Statement.call(this, labels, lineno, source); this.target = target; // Identifier or null } var proto = BreakStatement.prototype = new Statement(); proto.constructor = BreakStatement; proto.toString = function ( ) { var buf = [labelsToString.call(this), "break"]; if ( this.target ) buf.push(" ", this.target); buf.push(";"); return buf.join(""); }; function ReturnStatement ( labels, exp, lineno, source ) { Statement.call(this, labels, lineno, source); this.exp = exp; // Expression or null } var proto = ReturnStatement.prototype = new Statement(); proto.constructor = ReturnStatement; proto.toString = function ( ) { return [ labelsToString.call(this), "return ", this.exp ? this.exp : "", ";" ].join(""); }; function WithStatement ( labels, exp, body, lineno, source ) { Statement.call(this, labels, lineno, source); this.exp = exp; // Expression this.body = body; // Statement } var proto = WithStatement.prototype = new Statement(); proto.constructor = WithStatement; proto.toString = function ( ) { return [ "with (", this.exp, ") ", this.body ].join(""); }; function SwitchStatement ( labels, exp, clauses, lineno, source ) { Statement.call(this, labels, lineno, source); this.exp = exp; // Expression this.clauses = clauses; // cons-list of (CaseClause or DefaultClause) } var proto = SwitchStatement.prototype = new Statement(); proto.constructor = SwitchStatement; proto.toString = function ( ) { var buf = [ "switch ( ", this.exp, ") {\n"]; this.clauses.forEach(function( it ){ buf.push(it, "\n"); }); buf.push("}"); return buf.join(""); }; function CaseClause ( exp, body, lineno, source ) { this.exp = exp; // Expression this.body = body; // cons-list of Statement this.lineno = lineno; // Number (optional) this.source = source; // String (optional) } CaseClause.prototype.toString = function ( ) { var buf = ["case ", this.exp, ":\n"]; this.body.forEach(function( it ){ buf.push(it, "\n"); }); return buf.join(""); }; function DefaultClause ( body, lineno, source ) { this.body = body; // cons-list of Statement this.lineno = lineno; // Number (optional) this.source = source; // String (optional) } DefaultClause.prototype.toString = function ( ) { var buf = ["default:\n"]; this.body.forEach(function( it ){ buf.push(it, "\n"); }); return buf.join(""); }; function ThrowStatement ( labels, exp, lineno, source ) { Statement.call(this, labels, lineno, source); this.exp = exp; // Expression } var proto = ThrowStatement.prototype = new Statement(); proto.constructor = ThrowStatement; proto.toString = function ( ) { return [ labelsToString.call(this), "throw ", this.exp, ";" ].join(""); }; function TryCatchStatement ( labels, tryBlock, variable, catchBlock, lineno, source ) { Statement.call(this, labels, lineno, source); this.tryBlock = tryBlock; // Block this.variable = variable; // Identifier this.catchBlock = catchBlock; // Block } var proto = TryCatchStatement.prototype = new Statement(); proto.constructor = TryCatchStatement; proto.toString = function ( ) { return [ labelsToString.call(this), "try ", this.tryBlock, "\n", "catch (", this.variable, ") ", this.catchBlock ].join(""); }; function TryFinallyStatement ( labels, tryBlock, finallyBlock, lineno, source ) { Statement.call(this, labels, lineno, source); this.tryBlock = tryBlock; // Block this.finallyBlock = finallyBlock; // Block } var proto = TryFinallyStatement.prototype = new Statement(); proto.constructor = TryFinallyStatement; proto.toString = function ( ) { return [ labelsToString.call(this), "try ", this.tryBlock, "\n", "finally ", this.finallyBlock ].join(""); }; function TryCatchFinallyStatement ( labels, tryBlock, variable, catchBlock, finallyBlock, lineno, source ) { Statement.call(this, labels, lineno, source); this.tryBlock = tryBlock; // Block this.variable = variable; // Identifier this.catchBlock = catchBlock; // Block this.finallyBlock = finallyBlock; // Block } var proto = TryCatchFinallyStatement.prototype = new Statement(); proto.constructor = TryCatchFinallyStatement; proto.toString = function ( ) { return [ labelsToString.call(this), "try ", this.tryBlock, "\n", "catch (", this.variable, ") ", this.catchBlock, "\n", "finally ", this.finallyBlock ].join(""); }; function TryCatchListStatement ( labels, tryBlock, catchList, lineno, source ) { Statement.call(this, labels, lineno, source); this.tryBlock = tryBlock; // Block this.catchList = catchList; // cons-list of CatchGuard } var proto = TryCatchListStatement.prototype = new Statement(); proto.constructor = TryCatchListStatement; proto.toString = function ( ) { var buf = [ labelsToString.call(this), "try ", this.tryBlock, "\n" ]; this.catchList.forEach(function( it ){ buf.push(it); }); return buf.join(""); }; function TryCatchListFinallyStatement ( labels, tryBlock, catchList, finallyBlock, lineno, source ) { Statement.call(this, labels, lineno, source); this.tryBlock = tryBlock; // Block this.catchList = catchList; // cons-list of CatchGuard this.finallyBlock = finallyBlock; // Block } var proto = TryCatchListFinallyStatement.prototype = new Statement(); proto.constructor = TryCatchListFinallyStatement; proto.toString = function ( ) { var buf = [ labelsToString.call(this), "try ", this.tryBlock, "\n" ]; this.catchList.forEach(function( it ){ buf.push(it); }); buf.push("finally ", this.finallyBlock); return buf.join(""); }; function CatchGuard ( variable, cond, block, lineno, source ) { this.variable = variable; // Identifier this.cond = cond; // Expression or null (null means this is default catch clause) this.block = block; // Block this.lineno = lineno; // Number (optional) this.source = source; // String (optional) } CatchGuard.prototype.toString = function ( ) { var buf = ["catch ( ", this.variable]; if ( this.cond ) buf.push(" if ", this.cond); buf.push(" )", this.block); return buf.join(""); }; function FunctionDeclaration ( labels, name, params, body, lineno, source ) { Statement.call(this, labels, lineno, source); this.name = name; // Identifier this.params = params; // array of Identifier this.body = body; // cons-list of Statement } var proto = FunctionDeclaration.prototype = new Statement(); proto.constructor = FunctionDeclaration; proto.toString = function ( ) { var buf = [ "function ", this.name, " (", this.params.join(", "), ") {\n" ]; this.body.forEach(function( it ){ buf.push(it, "\n"); }); buf.push("}"); return buf.join(""); }; return { CatchGuard: CatchGuard, Block: Block, IfStatement: IfStatement, FunctionDeclaration: FunctionDeclaration, ForVarStatement: ForVarStatement, IfElseStatement: IfElseStatement, TryFinallyStatement: TryFinallyStatement, TryCatchFinallyStatement: TryCatchFinallyStatement, ThrowStatement: ThrowStatement, ForEachStatement: ForEachStatement, EmptyStatement: EmptyStatement, TryCatchStatement: TryCatchStatement, WithStatement: WithStatement, ExpStatement: ExpStatement, ReturnStatement: ReturnStatement, Statement: Statement, ForInVarStatement: ForInVarStatement, BreakStatement: BreakStatement, TryCatchListStatement: TryCatchListStatement, DoWhileStatement: DoWhileStatement, ForInStatement: ForInStatement, DefaultClause: DefaultClause, VarStatement: VarStatement, ContinueStatement: ContinueStatement, TryCatchListFinallyStatement: TryCatchListFinallyStatement, WhileStatement: WhileStatement, SwitchStatement: SwitchStatement, ForEachVarStatement: ForEachVarStatement, CaseClause: CaseClause, ForStatement: ForStatement }; }(); } } }.call(null) ) { this.Concurrent.Thread.Compiler.CatchGuard = CatchGuard; this.Concurrent.Thread.Compiler.Block = Block; this.Concurrent.Thread.Compiler.IfStatement = IfStatement; this.Concurrent.Thread.Compiler.FunctionDeclaration = FunctionDeclaration; this.Concurrent.Thread.Compiler.ForVarStatement = ForVarStatement; this.Concurrent.Thread.Compiler.IfElseStatement = IfElseStatement; this.Concurrent.Thread.Compiler.TryFinallyStatement = TryFinallyStatement; this.Concurrent.Thread.Compiler.TryCatchFinallyStatement = TryCatchFinallyStatement; this.Concurrent.Thread.Compiler.ThrowStatement = ThrowStatement; this.Concurrent.Thread.Compiler.ForEachStatement = ForEachStatement; this.Concurrent.Thread.Compiler.EmptyStatement = EmptyStatement; this.Concurrent.Thread.Compiler.TryCatchStatement = TryCatchStatement; this.Concurrent.Thread.Compiler.WithStatement = WithStatement; this.Concurrent.Thread.Compiler.ExpStatement = ExpStatement; this.Concurrent.Thread.Compiler.ReturnStatement = ReturnStatement; this.Concurrent.Thread.Compiler.Statement = Statement; this.Concurrent.Thread.Compiler.ForInVarStatement = ForInVarStatement; this.Concurrent.Thread.Compiler.BreakStatement = BreakStatement; this.Concurrent.Thread.Compiler.TryCatchListStatement = TryCatchListStatement; this.Concurrent.Thread.Compiler.DoWhileStatement = DoWhileStatement; this.Concurrent.Thread.Compiler.ForInStatement = ForInStatement; this.Concurrent.Thread.Compiler.DefaultClause = DefaultClause; this.Concurrent.Thread.Compiler.VarStatement = VarStatement; this.Concurrent.Thread.Compiler.ContinueStatement = ContinueStatement; this.Concurrent.Thread.Compiler.TryCatchListFinallyStatement = TryCatchListFinallyStatement; this.Concurrent.Thread.Compiler.WhileStatement = WhileStatement; this.Concurrent.Thread.Compiler.SwitchStatement = SwitchStatement; this.Concurrent.Thread.Compiler.ForEachVarStatement = ForEachVarStatement; this.Concurrent.Thread.Compiler.CaseClause = CaseClause; this.Concurrent.Thread.Compiler.ForStatement = ForStatement; } }).call(null); (function(){ if ( !this.Concurrent || (typeof this.Concurrent != 'object' && typeof this.Concurrent != 'function') ) this.Concurrent = new Object(); if ( !this.Concurrent.Thread || (typeof this.Concurrent.Thread != 'object' && typeof this.Concurrent.Thread != 'function') ) this.Concurrent.Thread = new Object(); if ( !this.Concurrent.Thread.Compiler || (typeof this.Concurrent.Thread.Compiler != 'object' && typeof this.Concurrent.Thread.Compiler != 'function') ) this.Concurrent.Thread.Compiler = new Object(); if ( this.Concurrent.Thread.Compiler.IdentifierMap === undefined ) this.Concurrent.Thread.Compiler.IdentifierMap = undefined; with ( function(){ with ( Concurrent.Thread.Compiler ) { return function () { var VERSION ; var NAMESPACE; /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Concurrent.Thread code. * * The Initial Developer of the Original Code is * Daisuke Maki. * Portions created by the Initial Developer are Copyright (C) 2006-2007 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ NAMESPACE = 'Concurrent.Thread.Compiler'; var hasOwnProperty = Object.prototype.hasOwnProperty; function IdentifierMap ( ) { this._map = {}; } var proto = IdentifierMap.prototype; proto.clone = function clone ( ) { var c = new IdentifierMap(); for ( var i in this._map ) { if ( hasOwnProperty.call(this._map, i) ) c._map[i] = this._map[i]; } return c; }; proto.exists = function ( /* variable arguments */ ) { for ( var i=0; i < arguments.length; i++ ) { var key = arguments[i]; if ( !(key instanceof Identifier) ) throw new TypeError("arguments[" + i + "] is not of type Identifier"); if ( !hasOwnProperty.call(this._map, key.valueOf()) ) return false; } return true; }; proto.get = function ( k ) { if ( !(k instanceof Identifier) ) throw new TypeError("arguments[0] is not of type Identifier"); var s = k.valueOf(); if ( !hasOwnProperty.call(this._map, s) ) return undefined; return this._map[s].value; }; proto.put = function ( k, v ) { if ( !(k instanceof Identifier) ) throw new TypeError("arguments[0] is not of type Identifier"); this._map[k.valueOf()] = {id: k, value: v}; }; proto.remove = function ( k ) { if ( !(k instanceof Identifier) ) throw new TypeError("arguments[0] is not of type Identifier"); return delete this._map[k.valueOf()]; }; proto.keys = function ( ) { var set = new IdentifierSet(); for ( var i in this._map ) { if ( hasOwnProperty.call(this._map, i) ) set.add(this._map[i].id); } return set; }; proto.values = function ( ) { var vals = []; for ( var i in this._map ) { if ( hasOwnProperty.call(this._map, i) ) vals.push(this._map[i].value); } return vals; }; return { IdentifierMap: IdentifierMap }; }(); } }.call(null) ) { this.Concurrent.Thread.Compiler.IdentifierMap = IdentifierMap; } }).call(null); (function(){ if ( !this.Concurrent || (typeof this.Concurrent != 'object' && typeof this.Concurrent != 'function') ) this.Concurrent = new Object(); if ( !this.Concurrent.Thread || (typeof this.Concurrent.Thread != 'object' && typeof this.Concurrent.Thread != 'function') ) this.Concurrent.Thread = new Object(); if ( !this.Concurrent.Thread.Compiler || (typeof this.Concurrent.Thread.Compiler != 'object' && typeof this.Concurrent.Thread.Compiler != 'function') ) this.Concurrent.Thread.Compiler = new Object(); if ( this.Concurrent.Thread.Compiler.TokenStream === undefined ) this.Concurrent.Thread.Compiler.TokenStream = undefined; with ( function(){ with ( Concurrent.Thread.Compiler ) { return function () { var VERSION = '0.0.0'; var NAMESPACE; /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Rhino code, released * May 6, 1999. * * The Initial Developer of the Original Code is * Netscape Communications Corporation. * Portions created by the Initial Developer are Copyright (C) 1997-1999 * the Initial Developer. All Rights Reserved. * * Contributor(s): * Roger Lawrence * Mike McCabe * Igor Bukanov * Ethan Hugg * Terry Lucas * Milen Nankov * Daisuke Maki * * Alternatively, the contents of this file may be used under the terms of * the GNU General Public License Version 2 or later (the "GPL"), in which * case the provisions of the GPL are applicable instead of those above. If * you wish to allow use of your version of this file only under the terms of * the GPL and not to allow others to use your version of this file under the * MPL, indicate your decision by deleting the provisions above and replacing * them with the notice and other provisions required by the GPL. If you do * not delete the provisions above, a recipient may use your version of this * file under either the MPL or the GPL. * * ***** END LICENSE BLOCK ***** */ /** * This file is based on the file TokenStream.java in Rhino 1.6R5. */ NAMESPACE = 'Concurrent.Thread.Compiler'; /* * For chars - because we need something out-of-range * to check. (And checking EOF by exception is annoying.) * Fortunatelly, U+FFFF is guaranteed not to be assigned * for any character. * Note distinction from EOF token type! */ var EOF_CHAR = String.fromCharCode(0xFFFF); function TokenStream( parser, sourceString, lineno ) { this.parser = parser; this.sourceString = String(sourceString); this.sourceEnd = this.sourceString.length; this.sourceCursor = 0; // stuff other than whitespace since start of line this.dirtyLine = false; this.string = ""; this.stringBuffer = []; this.ungetBuffer = []; this.hitEOF = false; this.lineStart = 0; this.lineno = Number(lineno) || 1; this.lineEndChar = undefined; // for xml tokenizer this.xmlIsAttribute = false; this.xmlIsTagContent = false; this.xmlOpenTagsCount = 0; } var proto = TokenStream.prototype; /* This function uses the cached op, string and number fields in * TokenStream; if getToken has been called since the passed token * was scanned, the op or string printed may be incorrect. */ proto.tokenToString = function ( token ) { if (Token.printTrees) { var name = Token.name(token); switch ( token ) { case Token.STRING: case Token.REGEXP: case Token.NAME: return name + " `" + this.string + "'"; case Token.NUMBER: return "NUMBER " + this.number; } return name; } return ""; }; function isKeyword ( s ) { return Token.EOF != stringToKeyword(s); } var strIdMap = { "break" : Token.BREAK, "case" : Token.CASE, "catch" : Token.CATCH, "continue" : Token.CONTINUE, "default" : Token.DEFAULT, "delete" : Token.DELPROP, "do" : Token.DO, "else" : Token.ELSE, "export" : Token.EXPORT, "false" : Token.FALSE, "finally" : Token.FINALLY, "for" : Token.FOR, "function" : Token.FUNCTION, "if" : Token.IF, "in" : Token.IN, "instanceof" : Token.INSTANCEOF, "new" : Token.NEW, "null" : Token.NULL, "return" : Token.RETURN, "switch" : Token.SWITCH, "this" : Token.THIS, "throw" : Token.THROW, "true" : Token.TRUE, "try" : Token.TRY, "typeof" : Token.TYPEOF, "var" : Token.VAR, "void" : Token.VOID, "while" : Token.WHILE, "with" : Token.WITH, // Future Reserved Words "abstract" : Token.RESERVED, "boolean" : Token.RESERVED, "byte" : Token.RESERVED, "char" : Token.RESERVED, "class" : Token.RESERVED, "const" : Token.RESERVED, "debugger" : Token.RESERVED, "double" : Token.RESERVED, "enum" : Token.RESERVED, "extends" : Token.RESERVED, "final" : Token.RESERVED, "float" : Token.RESERVED, "goto" : Token.RESERVED, "implements" : Token.RESERVED, "import" : Token.IMPORT, "int" : Token.RESERVED, "interface" : Token.RESERVED, "long" : Token.RESERVED, "native" : Token.RESERVED, "package" : Token.RESERVED, "private" : Token.RESERVED, "protected" : Token.RESERVED, "public" : Token.RESERVED, "short" : Token.RESERVED, "static" : Token.RESERVED, "super" : Token.RESERVED, "synchronized" : Token.RESERVED, "throws" : Token.RESERVED, "transient" : Token.RESERVED, "volatile" : Token.RESERVED }; function stringToKeyword ( name ) { return strIdMap.hasOwnProperty(name) ? strIdMap[name] : Token.EOF; } proto.getLineno = function ( ) { return this.lineno; }; proto.getString = function ( ) { return this.string; }; proto.eof = function ( ) { return this.hitEOF; }; proto.getToken = function ( ) { var c; retry: for (;;) { // Eat whitespace, possibly sensitive to newlines. for (;;) { c = this.getChar(); if ( c === EOF_CHAR ) { return Token.EOF; } else if ( c === '\n' ) { this.dirtyLine = false; return Token.EOL; } else if ( !isSpace(c) ) { if ( c !== '-' ) { this.dirtyLine = true; } break; } } // identifier/keyword/instanceof? // watch out for starting with a var identifierStart = false; var isUnicodeEscapeStart = false; if ( c === '\\' ) { c = this.getChar(); if ( c === 'u' ) { identifierStart = true; isUnicodeEscapeStart = true; this.stringBuffer = ["\\u"]; } else { identifierStart = false; this.ungetChar(c); c = '\\'; } } else if ( isIdentifierStart(c) ) { identifierStart = true; this.stringBuffer = [c]; } if ( identifierStart ) { var containsEscape = isUnicodeEscapeStart; for (;;) { if ( isUnicodeEscapeStart ) { // strictly speaking we should probably push-back // all the bad characters if the uXXXX // sequence is malformed. But since there isn't a // correct context(is there?) for a bad Unicode // escape sequence in an identifier, we can report // an error here. for ( var i=0; i != 4; ++i ) { c = this.getChar(); if ( isHexDigit(c) ) { this.addToString(c); } else { this.parser.addError("msg.invalid.escape"); return Token.ERROR; } } isUnicodeEscapeStart = false; } else { c = this.getChar(); if (c == '\\') { c = this.getChar(); if (c == 'u') { this.addToString("\\u"); isUnicodeEscapeStart = true; containsEscape = true; } else { this.parser.addError("msg.illegal.character"); return Token.ERROR; } } else { if ( !isIdentifierPart(c) ) break; this.addToString(c); } } } this.ungetChar(c); var str = this.getStringFromBuffer(); if ( !containsEscape ) { // OPT we shouldn't have to make a string to // check if it's a keyword. // Return the corresponding token if it's a keyword var result = stringToKeyword(str); if ( result != Token.EOF ) return result; } this.string = str; return Token.NAME; } // is it a number? if ( isDigit(c) || (c==='.' && isDigit(this.peekChar())) ) { this.stringBuffer = []; var base = 10; if ( c === '0' ) { this.addToString('0'); c = this.getChar(); if ( c === 'x' || c === 'X' ) { this.addToString(c); base = 16; c = this.getChar(); } else if ( isDigit(c) ) { base = 8; } } if ( base === 16 ) { while ( isHexDigit(c) ) { this.addToString(c); c = this.getChar(); } } else { while ( isDigit(c) ) { /* * We permit 08 and 09 as decimal numbers, which * makes our behavior a superset of the ECMA * numeric grammar. We might not always be so * permissive, so we warn about it. */ if ( base === 8 && (c==='8' || c==='9') ) { this.parser.addWarning("msg.bad.octal.literal", c == '8' ? "8" : "9"); base = 10; } this.addToString(c); c = this.getChar(); } } if ( base === 10 ) { if ( c === '.' ) { do { this.addToString(c); c = this.getChar(); } while ( isDigit(c) ); } if ( c === 'e' || c === 'E' ) { this.addToString(c); c = this.getChar(); if ( c === '+' || c === '-' ) { this.addToString(c); c = this.getChar(); } if ( !isDigit(c) ) { this.parser.addError("msg.missing.exponent"); return Token.ERROR; } do { this.addToString(c); c = this.getChar(); } while ( isDigit(c) ); } } this.ungetChar(c); this.string = this.getStringFromBuffer(); return Token.NUMBER; } // is it a string? if ( c === '"' || c === "'" ) { var quoteChar = c; this.stringBuffer = [c]; c = this.getChar(); while ( c !== quoteChar ) { if ( c === '\n' || c === EOF_CHAR ) { this.ungetChar(c); this.parser.addError("msg.unterminated.string.lit"); return Token.ERROR; } if ( c === '\\' ) { this.addToString('\\'); c = this.getChar(); if ( c === '\n' ) { // Remove line terminator after escape to follow // SpiderMonkey and C/C++ // But, issue warning since ECMA262-3 does not allow that. this.parser.addWarning("msg.unsafe.string.lit"); } else { this.addToString(c); } } else { this.addToString(c); } c = this.getChar(); } this.addToString(quoteChar); this.string = this.getStringFromBuffer(); return Token.STRING; } switch ( c.charCodeAt(0) ) { case 0x3B: // ';' return Token.SEMI; case 0x5B: // '[' return Token.LB; case 0x5D: // ']' return Token.RB; case 0x7B: // '{' return Token.LC; case 0x7D: // '}' return Token.RC; case 0x28: // '(' return Token.LP; case 0x29: // ')' return Token.RP; case 0x2C: // ',' return Token.COMMA; case 0x3F: // '?' return Token.HOOK; case 0x40: // '@' return Token.XMLATTR; case 0x3A: // ':' if ( this.matchChar(':') ) { return Token.COLONCOLON; } else { return Token.COLON; } case 0x2E: // '.' if ( this.matchChar('.') ) { return Token.DOTDOT; } else if ( this.matchChar('(') ) { return Token.DOTQUERY; } else { return Token.DOT; } case 0x7C: // '|' if ( this.matchChar('|') ) { return Token.OR; } else if ( this.matchChar('=') ) { return Token.ASSIGN_BITOR; } else { return Token.BITOR; } case 0x5E: // '^' if ( this.matchChar('=') ) { return Token.ASSIGN_BITXOR; } else { return Token.BITXOR; } case 0x26: // '&' if ( this.matchChar('&') ) { return Token.AND; } else if ( this.matchChar('=') ) { return Token.ASSIGN_BITAND; } else { return Token.BITAND; } case 0x3D: // '=' if ( this.matchChar('=') ) { if ( this.matchChar('=') ) { return Token.SHEQ; } else { return Token.EQ; } } else { return Token.ASSIGN; } case 0x21: // '!' if ( this.matchChar('=') ) { if ( this.matchChar('=') ) { return Token.SHNE; } else { return Token.NE; } } else { return Token.NOT; } case 0x3C: // '<' /* NB:treat HTML begin-comment as comment-till-eol */ if ( this.matchChar('!') ) { if ( this.matchChar('-') ) { if ( this.matchChar('-') ) { this.skipLine(); continue retry; } this.ungetChar('-'); } this.ungetChar('!'); } if ( this.matchChar('<') ) { if ( this.matchChar('=') ) { return Token.ASSIGN_LSH; } else { return Token.LSH; } } else { if ( this.matchChar('=') ) { return Token.LE; } else { return Token.LT; } } case 0x3E: // '>' if ( this.matchChar('>') ) { if ( this.matchChar('>') ) { if ( this.matchChar('=') ) { return Token.ASSIGN_URSH; } else { return Token.URSH; } } else { if ( this.matchChar('=') ) { return Token.ASSIGN_RSH; } else { return Token.RSH; } } } else { if ( this.matchChar('=') ) { return Token.GE; } else { return Token.GT; } } case 0x2A: // '*' if ( this.matchChar('=') ) { return Token.ASSIGN_MUL; } else { return Token.MUL; } case 0x2F: // '/' // is it a // comment? if ( this.matchChar('/') ) { this.skipLine(); continue retry; } else if ( this.matchChar('*') ) { for (;;) { c = this.getChar(); if ( c === EOF_CHAR ) { this.parser.addError("msg.unterminated.comment"); return Token.ERROR; } else if ( c === '*' ) { c = this.getChar(); if ( c === '/' ) { continue retry; } } } } else if ( this.matchChar('=') ) { return Token.ASSIGN_DIV; } else { return Token.DIV; } case 0x25: // '%' if ( this.matchChar('=') ) { return Token.ASSIGN_MOD; } else { return Token.MOD; } case 0x7E: // '~' return Token.BITNOT; case 0x2B: // '+' if ( this.matchChar('=') ) { return Token.ASSIGN_ADD; } else if ( this.matchChar('+') ) { return Token.INC; } else { return Token.ADD; } case 0x2D: // '-' if ( this.matchChar('=') ) { c = Token.ASSIGN_SUB; } else if ( this.matchChar('-') ) { if ( !this.dirtyLine ) { // treat HTML end-comment after possible whitespace // after line start as comment-untill-eol if ( this.matchChar('>')) { this.skipLine(); continue retry; } } c = Token.DEC; } else { c = Token.SUB; } this.dirtyLine = true; return c; default: parser.addError("msg.illegal.character"); return Token.ERROR; } } }; /** * Parser calls the method when it gets / or /= in literal context. */ proto.readRegExp = function ( startToken ) { if ( startToken === Token.ASSIGN_DIV ) { // Miss-scanned /= this.stringBuffer = ["/="]; } else if ( startToken === Token.DIV ) { this.stringBuffer = ["/"]; } else { Kit.codeBug(); } var c; while ( (c = this.getChar()) !== '/' ) { if ( c === '\n' || c === EOF_CHAR ) { this.ungetChar(c); throw this.parser.reportError("msg.unterminated.re.lit"); } if ( c === '\\' ) { this.addToString(c); c = this.getChar(); } this.addToString(c); } this.addToString("/"); while ( isIdentifierPart(c = this.getChar()) ) { this.addToString(c); } this.ungetChar(c); this.string = this.getStringFromBuffer(); } proto.isXMLAttribute = function ( ) { return this.xmlIsAttribute; }; proto.getFirstXMLToken = function ( ) { this.xmlOpenTagsCount = 0; this.xmlIsAttribute = false; this.xmlIsTagContent = false; this.ungetChar('<'); return this.getNextXMLToken(); }; proto.getNextXMLToken = function ( ) { this.stringBuffer = []; // remember the XML for ( var c=this.getChar(); c !== EOF_CHAR; c=this.getChar() ) { if ( this.xmlIsTagContent ) { switch ( c.charCodeAt(0) ) { case 0x3E: // '>' this.addToString('>'); this.xmlIsTagContent = false; this.xmlIsAttribute = false; break; case 0x2F: // '/' this.addToString('/'); if ( this.matchChar('>') ) { this.addToString('>'); this.xmlIsTagContent = false; this.xmlOpenTagsCount--; } break; case 0x7B: // '{' this.ungetChar('{'); this.string = this.getStringFromBuffer(); return Token.XML; case 0x27: // "'" case 0x22: // '"' this.addToString(c); if ( !this.readQuotedString(c) ) return Token.ERROR; break; case 0x3D: // '=' this.addToString('='); this.xmlIsAttribute = true; break; case 0x20: // ' ' case 0x09: // '\t' // case 0x0D: // '\r' CR never comes here because of the implementation of getChar(). case 0x0A: // '\n' this.addToString(c); break; default: this.addToString(c); this.xmlIsAttribute = false; break; } if ( !this.xmlIsTagContent && this.xmlOpenTagsCount === 0 ) { this.string = this.getStringFromBuffer(); return Token.XMLEND; } } else { switch ( c.charCodeAt(0) ) { case 0x3C: // '<' this.addToString('<'); c = this.getChar(); switch ( c.charCodeAt(0) ) { case 0x21: // '!' this.addToString('!'); c = this.getChar(); switch ( c.charCodeAt(0) ) { case 0x2D: // '-' if ( this.getChar() === '-' ) { this.addToString('--'); if ( !this.readXmlComment() ) return Token.ERROR; } else { this.parser.addError("msg.XML.bad.form"); return Token.ERROR; } break; case 0x5B: // '[' if ( this.getChar() === 'C' && this.getChar() === 'D' && this.getChar() === 'A' && this.getChar() === 'T' && this.getChar() === 'A' && this.getChar() === '[' ) { this.addToString('[CDATA['); if ( !this.readCDATA() ) return Token.ERROR; } else { this.parser.addError("msg.XML.bad.form"); return Token.ERROR; } break; default: this.ungetChar(c); if( !this.readEntity() ) return Token.ERROR; break; } break; case 0x3F: // '?' this.addToString('?'); if ( !this.readPI() ) return Token.ERROR; break; case 0x2F: // '/' // End tag this.addToString('/'); if ( this.xmlOpenTagsCount === 0 ) { this.parser.addError("msg.XML.bad.form"); return Token.ERROR; } this.xmlIsTagContent = true; this.xmlOpenTagsCount--; break; default: // Start tag this.ungetChar(c); this.xmlIsTagContent = true; this.xmlOpenTagsCount++; break; } break; case 0x7B: // '{' this.ungetChar('{'); this.string = this.getStringFromBuffer(); return Token.XML; default: this.addToString(c); break; } } } this.parser.addError("msg.XML.bad.form"); return Token.ERROR; }; proto.readQuotedString = function ( quote ) { for ( var c=this.getChar(); c !== EOF_CHAR; c=this.getChar() ) { this.addToString(c); if ( c === quote ) return true; } parser.addError("msg.XML.bad.form"); return false; }; proto.readXmlComment = function ( ) { for ( var c=this.getChar(); c !== EOF_CHAR; ) { this.addToString(c); if ( c === '-' && this.matchChar('-') ) { this.addToString('-'); if ( this.matchChar('>') ) { this.addToString('>'); return true; } else { // Strictly, XMLComment MUST NOT include the sequence "--". // So, if the program execution is here, the source is // syntactically wrong, according to ECMA367. However, we // allow the sequence here, so that our syntax is super-set // of the specification. c = '-'; continue; } } c = this.getChar(); } this.parser.addError("msg.XML.bad.form"); return false; }; proto.readCDATA = function ( ) { for ( var c=this.getChar(); c !== EOF_CHAR; ) { this.addToString(c); if ( c === ']' && this.matchChar(']') ) { this.addToString(']'); if ( this.matchChar('>') ) { this.addToString('>'); return true; } else { c = ']'; continue; } } c = this.getChar(); } this.parser.addError("msg.XML.bad.form"); return false; }; proto.readEntity = function ( ) { var declTags = 1; for ( var c=this.getChar(); c !== EOF_CHAR; c=this.getChar() ) { this.addToString(c); switch ( c ) { case '<': declTags++; break; case '>': declTags--; if ( declTags === 0 ) return true; break; } } this.parser.addError("msg.XML.bad.form"); return false; }; proto.readPI = function ( ) { for ( var c=this.getChar(); c !== EOF_CHAR; c=this.getChar() ) { this.addToString(c); if ( c === '?' && this.matchChar('>') ) { this.addToString('>'); return true; } } this.parser.addError("msg.XML.bad.form"); return false; }; proto.getStringFromBuffer = function ( ) { return this.stringBuffer.join(""); }; proto.addToString = function ( /* variable arguments */ ) { this.stringBuffer.push.apply(this.stringBuffer, arguments); }; proto.ungetChar = function ( c ) { // can not unread past across line boundary if ( this.ungetBuffer.length && this.ungetBuffer[this.ungetBuffer.length-1] == '\n') Kit.codeBug(); this.ungetBuffer.push(c); }; proto.matchChar = function ( test ) { var c = this.getChar(); if ( c === test ) { return true; } else { this.ungetChar(c); return false; } }; proto.peekChar = function ( ) { var c = this.getChar(); this.ungetChar(c); return c; }; proto.getChar = function ( ) { if ( this.ungetBuffer.length ) return this.ungetBuffer.pop(); for ( ;; ) { if ( this.sourceCursor == this.sourceEnd ) { this.hitEOF = true; return EOF_CHAR; } var c = this.sourceString.charAt(this.sourceCursor++); if ( this.lineEndChar ) { if ( this.lineEndChar == '\r' && c == '\n') { this.lineEndChar = '\n'; continue; } this.lineEndChar = undefined; this.lineStart = this.sourceCursor - 1; this.lineno++; } if ( isLineTerminator(c) ) { this.lineEndChar = c; c = '\n'; } if ( isFormatChar(c) ) { continue; } return c; } }; proto.skipLine = function ( ) { // skip to end of line var c; while ((c=this.getChar()) != EOF_CHAR && c != '\n') { } this.ungetChar(c); }; proto.getOffset = function ( ) { var n = this.sourceCursor - this.lineStart; if ( this.lineEndChar ) { --n; } return n; }; proto.getLine = function ( ) { var lineEnd = this.sourceCursor; if ( this.lineEndChar ) { --lineEnd; } else { for (; lineEnd != this.sourceEnd; ++lineEnd) { var c = this.sourceString.charAt(lineEnd); if ( isLineTerminator(c) ) { break; } } } return this.sourceString.substring(this.lineStart, lineEnd); }; return { TokenStream: TokenStream }; }(); } }.call(null) ) { this.Concurrent.Thread.Compiler.TokenStream = TokenStream; } }).call(null); (function(){ if ( !this.Concurrent || (typeof this.Concurrent != 'object' && typeof this.Concurrent != 'function') ) this.Concurrent = new Object(); if ( !this.Concurrent.Thread || (typeof this.Concurrent.Thread != 'object' && typeof this.Concurrent.Thread != 'function') ) this.Concurrent.Thread = new Object(); if ( !this.Concurrent.Thread.Compiler || (typeof this.Concurrent.Thread.Compiler != 'object' && typeof this.Concurrent.Thread.Compiler != 'function') ) this.Concurrent.Thread.Compiler = new Object(); if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Cons || (typeof this.Data.Cons != 'object' && typeof this.Data.Cons != 'function') ) this.Data.Cons = new Object(); if ( this.Concurrent.Thread.Compiler.CssConvert === undefined ) this.Concurrent.Thread.Compiler.CssConvert = undefined; with ( function(){ with ( Data.Cons ) { with ( Concurrent.Thread.Compiler ) { return function () { var VERSION ; var NAMESPACE; /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Concurrent.Thread code. * * The Initial Developer of the Original Code is * Daisuke Maki. * Portions created by the Initial Developer are Copyright (C) 2006-2007 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ NAMESPACE = 'Concurrent.Thread.Compiler'; var Css = "Concurrent.Thread.Compiler.CssConvert"; function CssConvert ( func ) { return func[Css](); } Statement.prototype[Css] = function ( ) { Kit.codeBug("unimplemented '" + Css + "' method for: " + this); }; EmptyStatement.prototype[Css] = function ( ) { return this; }; Block.prototype[Css] = function ( ) { var head = last = cons(null, nil()); for ( var c=this.body; !c.isNil(); c=c.cdr ) { last = last.cdr = cons(c.car[Css](), last.cdr); } return new Block(this.labels, head.cdr, this.lineno, this.source); }; ExpStatement.prototype[Css] = function ( ) { return new ExpStatement(this.labels, this.exp[Css](), this.lineno, this.source); }; VarStatement.prototype[Css] = function ( ) { var decls = []; for ( var i=0; i < this.decls.length; i++ ) { decls[i] = { id : this.decls[i].id, exp: this.decls[i].exp ? this.decls[i].exp[Css]() : null }; } return new VarStatement(this.labels, decls, this.lineno, this.source); }; IfStatement.prototype[Css] = function ( ) { return new IfStatement(this.labels, this.cond[Css](), this.body[Css](), this.lineno, this.source); }; IfElseStatement.prototype[Css] = function ( ) { return new IfElseStatement(this.labels, this.cond[Css](), this.tbody[Css](), this.fbody[Css](), this.lineno, this.source); }; DoWhileStatement.prototype[Css] = function ( ) { return new DoWhileStatement(this.labels, this.body[Css](), this.cond[Css](), this.lineno, this.source); }; WhileStatement.prototype[Css] = function ( ) { return new WhileStatement(this.labels, this.cond[Css](), this.body[Css](), this.lineno, this.source); }; ForStatement.prototype[Css] = function ( ) { return new ForStatement( this.labels, this.init ? this.init[Css]() : null, this.cond ? this.cond[Css]() : null, this.incr ? this.incr[Css]() : null, this.body[Css](), this.lineno, this.source ); }; ForVarStatement.prototype[Css] = function ( ) { var decls = []; for ( var i=0; i < this.decls.length; i++ ) { decls[i] = { id : this.decls[i].id, exp: this.decls[i].exp ? this.decls[i].exp[Css]() : null }; } return new ForVarStatement( this.labels, decls, this.cond ? this.cond[Css]() : null, this.incr ? this.incr[Css]() : null, this.body[Css](), this.lineno, this.source ); }; ForInStatement.prototype[Css] = function ( ) { return new ForInStatement(this.labels, this.lhs[Css](), this.exp[Css](), this.body[Css](), this.lineno, this.source); }; ForInVarStatement.prototype[Css] = function ( ) { var decl = { id : this.decl.id, exp: this.decl.exp ? this.decl.exp[Css]() : null }; return new ForInVarStatement(this.labels, decl, this.exp[Css](), this.body[Css](), this.lineno, this.source); }; ForEachStatement.prototype[Css] = function ( ) { return new ForEachStatement(this.labels, this.lhs[Css](), this.exp[Css](), this.body[Css](), this.lineno, this.source); }; ForEachVarStatement.prototype[Css] = function ( ) { var decl = { id : this.decl.id, exp: this.decl.exp ? this.decl.exp[Css]() : null }; return new ForEachVarStatement(this.labels, decl, this.exp[Css](), this.body[Css](), this.lineno, this.source); }; ContinueStatement.prototype[Css] = function ( ) { return this; }; BreakStatement.prototype[Css] = function ( ) { return this; }; ReturnStatement.prototype[Css] = function ( ) { if ( !this.exp ) return this; return new ReturnStatement(this.labels, this.exp[Css](), this.lineno, this.source); }; WithStatement.prototype[Css] = function ( ) { return new WithStatement(this.labels, this.exp[Css](), this.body[Css](), this.lineno, this.source); }; SwitchStatement.prototype[Css] = function ( ) { var head = last = cons(null, nil()); for ( var c=this.clauses; !c.isNil(); c=c.cdr ) { last = last.cdr = cons(c.car[Css](), last.cdr); } return new SwitchStatement(this.labels, this.exp[Css](), head.cdr, this.lineno, this.source); }; CaseClause.prototype[Css] = function ( ) { var head = last = cons(null, nil()); for ( var c=this.body; !c.isNil(); c=c.cdr ) { last = last.cdr = cons(c.car[Css](), last.cdr); } return new CaseClause(this.exp[Css](), head.cdr, this.lineno, this.source); }; DefaultClause.prototype[Css] = function ( ) { var head = last = cons(null, nil()); for ( var c=this.body; !c.isNil(); c=c.cdr ) { last = last.cdr = cons(c.car[Css](), last.cdr); } return new DefaultClause(head.cdr, this.lineno, this.source); }; ThrowStatement.prototype[Css] = function ( ) { return new ThrowStatement(this.labels, this.exp[Css](), this.lineno, this.source); }; TryCatchStatement.prototype[Css] = function ( ) { return new TryCatchStatement(this.labels, this.tryBlock[Css](), this.variable, this.catchBlock[Css](), this.lineno, this.source); }; TryFinallyStatement.prototype[Css] = function ( ) { return new TryFinallyStatement(this.labels, this.tryBlock[Css](), this.finallyBlock[Css](), this.lineno, this.source); }; TryCatchFinallyStatement.prototype[Css] = function ( ) { return new TryCatchFinallyStatement(this.labels, this.tryBlock[Css](), this.variable, this.catchBlock[Css](), this.finallyBlock[Css](), this.lineno, this.source); }; TryCatchListStatement.prototype[Css] = function ( ) { if ( this.catchList.isNil() ) { // no more catch-guard var block = this.tryBlock[Css](); block.labels = this.labels; return block; } else if ( this.catchList.car.cond ) { // one or more qualified catch-guard var guard = this.catchList.car; return new TryCatchStatement( this.labels, this.tryBlock[Css](), guard.variable, new Block([], list( new IfElseStatement( [], guard.cond[Css](), guard.block[Css](), (new TryCatchListStatement( [], new Block([], list(new ThrowStatement([], guard.variable))), this.catchList.cdr, this.catchList.cdr.lineno, this.cdr.cdr.source ))[Css](), guard.lineno, guard.source ) )) ); } else { // (only one) default catch-guard var guard = this.catchList.car; return new TryCatchStatement(this.labels, this.tryBlock[Css](), guard.variable, guard.block[Css](), this.lineno, this.source); } }; TryCatchListFinallyStatement.prototype[Css] = function ( ) { return new TryFinallyStatement( this.labels, new Block([], list( (new TryCatchListStatement([], this.tryBlock, this.catchList, this.lineno, this.source ))[Css]() ), this.lineno, this.source), this.finallyBlock[Css](), this.lineno, this.source ); }; FunctionDeclaration.prototype[Css] = function ( ) { var head = last = cons(null, nil()); for ( var c=this.body; !c.isNil(); c=c.cdr ) { last = last.cdr = cons(c.car[Css](), last.cdr); } return new FunctionDeclaration(this.labels, this.name, this.params, head.cdr, this.lineno, this.source); }; Expression.prototype[Css] = Statement.prototype[Css]; UnaryExpression.prototype[Css] = function ( ) { return new this.constructor( this.exp[Css]() ); }; BinaryExpression.prototype[Css] = function ( ) { return new this.constructor(this.left[Css](), this.right[Css]()); }; Literal.prototype[Css] = Identifier.prototype[Css] = ThisExpression.prototype[Css] = Elision.prototype[Css] = function ( ) { return this; }; ArrayInitializer.prototype[Css] = function ( ) { var elems = []; for ( var i=0; i < this.elems.length; i++ ) { elems[i] = this.elems[i][Css](); } return new ArrayInitializer(elems); }; ObjectInitializer.prototype[Css] = function ( ) { var pairs = []; for ( var i=0; i < this.pairs.length; i++ ) { pairs[i] = {prop:this.pairs[i].prop, exp:this.pairs[i].exp[Css]()}; } return new ObjectInitializer(pairs); }; FunctionExpression.prototype[Css] = function ( ) { var head = last = cons(null, nil()); for ( var c=this.body; !c.isNil(); c=c.cdr ) { last = last.cdr = cons(c.car[Css](), last.cdr); } return new FunctionExpression(this.name, this.params, head.cdr); }; DotAccessor.prototype[Css] = function ( ) { return new DotAccessor(this.base[Css](), this.prop); }; NewExpression.prototype[Css] = CallExpression.prototype[Css] = function ( ) { var args = []; for ( var i=0; i < this.args.length; i++ ) { args[i] = this.args[i][Css](); } return new this.constructor(this.func[Css](), args); }; ConditionalExpression.prototype[Css] = function ( ) { return new ConditionalExpression(this.cond[Css](), this.texp[Css](), this.fexp[Css]()); }; return { CssConvert: CssConvert }; }(); } } }.call(null) ) { this.Concurrent.Thread.Compiler.CssConvert = CssConvert; } }).call(null); (function(){ if ( !this.Concurrent || (typeof this.Concurrent != 'object' && typeof this.Concurrent != 'function') ) this.Concurrent = new Object(); if ( !this.Concurrent.Thread || (typeof this.Concurrent.Thread != 'object' && typeof this.Concurrent.Thread != 'function') ) this.Concurrent.Thread = new Object(); if ( !this.Concurrent.Thread.Compiler || (typeof this.Concurrent.Thread.Compiler != 'object' && typeof this.Concurrent.Thread.Compiler != 'function') ) this.Concurrent.Thread.Compiler = new Object(); if ( !this.Concurrent.Thread.Compiler.IntermediateLanguage || (typeof this.Concurrent.Thread.Compiler.IntermediateLanguage != 'object' && typeof this.Concurrent.Thread.Compiler.IntermediateLanguage != 'function') ) this.Concurrent.Thread.Compiler.IntermediateLanguage = new Object(); if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Cons || (typeof this.Data.Cons != 'object' && typeof this.Data.Cons != 'function') ) this.Data.Cons = new Object(); if ( !this.Data.Cons.Util || (typeof this.Data.Cons.Util != 'object' && typeof this.Data.Cons.Util != 'function') ) this.Data.Cons.Util = new Object(); if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Cons || (typeof this.Data.Cons != 'object' && typeof this.Data.Cons != 'function') ) this.Data.Cons = new Object(); if ( this.Concurrent.Thread.Compiler.IntermediateLanguage.Function === undefined ) this.Concurrent.Thread.Compiler.IntermediateLanguage.Function = undefined; if ( this.Concurrent.Thread.Compiler.IntermediateLanguage.Block === undefined ) this.Concurrent.Thread.Compiler.IntermediateLanguage.Block = undefined; if ( this.Concurrent.Thread.Compiler.IntermediateLanguage.GotoBlock === undefined ) this.Concurrent.Thread.Compiler.IntermediateLanguage.GotoBlock = undefined; if ( this.Concurrent.Thread.Compiler.IntermediateLanguage.CallBlock === undefined ) this.Concurrent.Thread.Compiler.IntermediateLanguage.CallBlock = undefined; if ( this.Concurrent.Thread.Compiler.IntermediateLanguage.NewBlock === undefined ) this.Concurrent.Thread.Compiler.IntermediateLanguage.NewBlock = undefined; if ( this.Concurrent.Thread.Compiler.IntermediateLanguage.Statement === undefined ) this.Concurrent.Thread.Compiler.IntermediateLanguage.Statement = undefined; if ( this.Concurrent.Thread.Compiler.IntermediateLanguage.ExpStatement === undefined ) this.Concurrent.Thread.Compiler.IntermediateLanguage.ExpStatement = undefined; if ( this.Concurrent.Thread.Compiler.IntermediateLanguage.CondStatement === undefined ) this.Concurrent.Thread.Compiler.IntermediateLanguage.CondStatement = undefined; if ( this.Concurrent.Thread.Compiler.IntermediateLanguage.RecvStatement === undefined ) this.Concurrent.Thread.Compiler.IntermediateLanguage.RecvStatement = undefined; if ( this.Concurrent.Thread.Compiler.IntermediateLanguage.EnumStatement === undefined ) this.Concurrent.Thread.Compiler.IntermediateLanguage.EnumStatement = undefined; with ( function(){ with ( Data.Cons.Util ) { with ( Data.Cons ) { with ( Concurrent.Thread.Compiler.IntermediateLanguage ) { return function () { var VERSION = '0.0.0'; var NAMESPACE; /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Concurrent.Thread code. * * The Initial Developer of the Original Code is * Daisuke Maki. * Portions created by the Initial Developer are Copyright (C) 2006-2007 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ NAMESPACE = 'Concurrent.Thread.Compiler.IntermediateLanguage'; function Function ( name, params, vars, body, start ) { this.name = name; // Identifier | Null this.params = params; // [Identifier] this.vars = vars; // [Identifier] this.body = body; // this.start = start; // Block } Function.prototype.toString = function ( ) { return [ "function ", this.name, "( ", this.params.join(", "), " ) {\n", " var ", this.vars.join(", "), ";\n", this.body.join("\n").replace(/^/mg, " "), "\n}" ].join(""); }; var block_id = 0; function Block ( scopes, body, target, exception ) { this.id = "label" + block_id++; this.scopes = scopes; // [Expression] this.body = body; // this.target = target; // Block | "return" | "throw" this.exception = exception; // Block | "return" | "throw" } var proto = Block.prototype; proto.toString = function ( ) { Kit.codeBug('"toString" is not implemented for ', this.constructor); }; proto.appendStatement = function ( /* variable arguments */ ) { var args = arguments; if ( this.body.isNil() ) { this.body = cons(arguments[0], this.body); args = Array.prototype.slice.call(arguments, 1, arguments.length); } else { adder(this.body).apply(null, args); } }; proto.prependStatement = function ( /* variable arguments */ ) { for ( var i=arguments.length-1; i >= 0; i-- ) { this.body = cons(arguments[i], this.body); } }; function stringify ( b ) { if ( b instanceof Block ) { return b.id; } else { return '"' + b + '"'; } } function GotoBlock ( scopes, body, arg, target, exception ) { Block.call(this, scopes, body, target, exception); this.arg = arg; } var proto = GotoBlock.prototype = new Block(); proto.constructor = GotoBlock; proto.toString = function ( ) { return [ this.id, "([", this.scopes.join(", "), "], ", stringify(this.exception), "): {\n", this.body.join("\n").replace(/^/mg, " "), "\n", " goto ", this.arg, " -> ", stringify(this.target), "\n", "}" ].join(""); }; function CallBlock ( scopes, body, this_val, func, args, target, exception ) { Block.call(this, scopes, body, target, exception); this.this_val = this_val; // Expression this.func = func; // Expression this.args = args; // [Expression] } var proto = CallBlock.prototype = new Block(); proto.constructor = CallBlock; proto.toString = function ( ) { return [ this.id, "([", this.scopes.join(", "), "], ", stringify(this.exception), "): {\n", this.body.join("\n").replace(/^/mg, " "), "\n", " call ", this.this_val, ".", this.func, "(", this.args.join(", "), ") -> ", stringify(this.target), "\n", "}" ].join(""); }; function NewBlock ( scopes, body, func, args, target, exception ) { Block.call(this, scopes, body, target, exception); this.func = func; // Expression this.args = args; // [Expression] } var proto = NewBlock.prototype = new Block(); proto.constructor = NewBlock; proto.toString = function ( ) { return [ this.id, "([", this.scopes.join(", "), "], ", stringify(this.exception), "): {\n", this.body.join("\n").replace(/^/mg, " "), "\n", " new ", this.func, "(", this.args.join(", "), ") -> ", stringify(this.target), "\n", "}" ].join(""); }; function Statement ( ) { // This is kind of interface. } Statement.prototype.toString = function ( ) { Kit.codeBug('"toString" is not implemented for ', this.constructor); }; function ExpStatement ( e ) { this.exp = e; // Expression } var proto = ExpStatement.prototype = new Statement(); proto.constructor = ExpStatement; proto.toString = function ( ) { return this.exp + ";"; }; function CondStatement ( c, t ) { this.cond = c; // Expression this.target = t; // Block } var proto = CondStatement.prototype = new Statement(); proto.constructor = CondStatement; proto.toString = function ( ) { return [ "if ", this.cond, " -> ", stringify(this.target), ";" ].join(""); }; function RecvStatement ( a ) { this.assignee = a; // Identifier | DotAccessor | BracketAccessor } var proto = RecvStatement.prototype = new Statement(); proto.constructor = RecvStatement; proto.toString = function ( ) { return [ "recv ", this.assignee, ";" ].join(""); }; function EnumStatement ( e, a ) { this.exp = e; // Expression this.assignee = a; // Identifier | DotAccessor | BracketAccessor } var proto = EnumStatement.prototype = new Statement(); proto.constructor = EnumStatement; proto.toString = function ( ) { return [ "enum ", this.assignee, " <- ", this.exp, ";" ].join(""); }; return { Block: Block, RecvStatement: RecvStatement, GotoBlock: GotoBlock, Function: Function, NewBlock: NewBlock, ExpStatement: ExpStatement, CallBlock: CallBlock, EnumStatement: EnumStatement, Statement: Statement, CondStatement: CondStatement }; }(); } } } }.call(null) ) { this.Concurrent.Thread.Compiler.IntermediateLanguage.Block = Block; this.Concurrent.Thread.Compiler.IntermediateLanguage.RecvStatement = RecvStatement; this.Concurrent.Thread.Compiler.IntermediateLanguage.GotoBlock = GotoBlock; this.Concurrent.Thread.Compiler.IntermediateLanguage.Function = Function; this.Concurrent.Thread.Compiler.IntermediateLanguage.NewBlock = NewBlock; this.Concurrent.Thread.Compiler.IntermediateLanguage.ExpStatement = ExpStatement; this.Concurrent.Thread.Compiler.IntermediateLanguage.CallBlock = CallBlock; this.Concurrent.Thread.Compiler.IntermediateLanguage.EnumStatement = EnumStatement; this.Concurrent.Thread.Compiler.IntermediateLanguage.Statement = Statement; this.Concurrent.Thread.Compiler.IntermediateLanguage.CondStatement = CondStatement; } }).call(null); (function(){ if ( !this.Concurrent || (typeof this.Concurrent != 'object' && typeof this.Concurrent != 'function') ) this.Concurrent = new Object(); if ( !this.Concurrent.Thread || (typeof this.Concurrent.Thread != 'object' && typeof this.Concurrent.Thread != 'function') ) this.Concurrent.Thread = new Object(); if ( !this.Concurrent.Thread.Compiler || (typeof this.Concurrent.Thread.Compiler != 'object' && typeof this.Concurrent.Thread.Compiler != 'function') ) this.Concurrent.Thread.Compiler = new Object(); if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Cons || (typeof this.Data.Cons != 'object' && typeof this.Data.Cons != 'function') ) this.Data.Cons = new Object(); if ( !this.Concurrent || (typeof this.Concurrent != 'object' && typeof this.Concurrent != 'function') ) this.Concurrent = new Object(); if ( !this.Concurrent.Thread || (typeof this.Concurrent.Thread != 'object' && typeof this.Concurrent.Thread != 'function') ) this.Concurrent.Thread = new Object(); if ( this.Concurrent.Thread.Compiler.CuConvert === undefined ) this.Concurrent.Thread.Compiler.CuConvert = undefined; with ( function(){ with ( Data.Cons ) { with ( Concurrent.Thread ) { with ( Concurrent.Thread.Compiler ) { return function () { var VERSION ; var NAMESPACE; /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Concurrent.Thread code. * * The Initial Developer of the Original Code is * Daisuke Maki. * Portions created by the Initial Developer are Copyright (C) 2006-2007 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ NAMESPACE = 'Concurrent.Thread.Compiler'; ///@require Concurrent.Thread.Compiler.Expression ///@require Concurrent.Thread.Compiler.Statement ///@require Concurrent.Thread.Compiler.IdentifierMap var IL = Concurrent.Thread.Compiler.IntermediateLanguage; function CuConvert ( func ) { // "map" below actually represents context of conversion. // Essentially, it maps old-block-ID => optimized-block. But, if the // value of a key is of type Array, it means that the block idenfied // with the ID is currently in process of the conversion (that means // "target" link is cyclic), and that each element of the array is a // GotoBlock whose "target" property is to be overwritten with the // optimized version of the block identified with old-block-ID. var map = {}; func.body.forEach(function( it ){ if ( !map.hasOwnProperty(it.id) ) { unify_block(it, map); } }); func.body = nil(); for ( var i in map ) { if ( map.hasOwnProperty(i) ){ var block = map[i]; replace_target(block, "exception", map); block.body.forEach(function( it ){ if ( it instanceof IL.CondStatement ) { replace_target(it, "target", map); } }); func.body = cons(map[i], func.body); } } func.start = map[func.start.id]; return func; } function unify_block ( block, map ) { map[block.id] = []; var next = block.target; if ( next instanceof IL.Block ) { if ( map.hasOwnProperty(next.id) ) { if ( map[next.id] instanceof Array ) { map[next.id].push(block); } else { block.target = map[next.id]; } } else { block.target = unify_block(next, map); } } var unified; if ( can_unify(block) ) { next = block.target; switch ( next.constructor ) { case IL.GotoBlock: unified = new IL.GotoBlock(next.scopes, next.body, next.arg, next.target, next.exception); break; case IL.CallBlock: unified = new IL.CallBlock(next.scopes, next.body, next.this_val, next.func, next.args, next.target, next.exception); break; case IL.NewBlock: unified = new IL.NewBlock(next.scopes, next.body, next.func, next.args, next.target, next.exception); break; default: throw new Error("Concurrent.Thread.Compiler.CuConvert: internal error"); } unified.body = concat_list(block.body, next.body); if ( unified.target instanceof IL.Block && map.hasOwnProperty(unified.target.id) && map[unified.target.id] instanceof Array ) { map[unified.target.id].push(unified); } } else { unified = block; } map[block.id].forEach(function( it ){ it.target = unified; }); map[block.id] = unified; return unified; } function can_unify ( block ) { if ( !(block instanceof IL.GotoBlock) ) return false; var next = block.target; if ( !(next instanceof IL.Block) ) return false; if ( block === next ) return false; if ( block.exception !== next.exception ) return false; if ( block.scopes.length !== next.scopes.length ) return false; var length = block.exception.length; for ( var i=0; i < length; i++ ) { if ( block.scopes[i] !== next.scopes[i] ) return false; } return true; } function replace_target ( base, prop, map ) { var target = base[prop]; if ( target === "return" || target === "throw" ) { return; } if ( !(target instanceof IL.Block) ) { throw new Error(NAMESPACE + ".CuConvert: internal error - `" + target + "' is not of type IntermediateLanguage.Block"); } var target_id = target.id; if ( map.hasOwnProperty(target_id) ) { base[prop] = map[target_id]; } } function concat_list ( x, y ) { return concat_list_aux(x, concat_list_aux(nil(), y)); } function concat_list_aux ( list, acc ) { if ( list.isNil() ) { return acc; } else { return cons(list.car, concat_list_aux(list.cdr, acc)); } } return { CuConvert: CuConvert }; }(); } } } }.call(null) ) { this.Concurrent.Thread.Compiler.CuConvert = CuConvert; } }).call(null); (function(){ if ( !this.Concurrent || (typeof this.Concurrent != 'object' && typeof this.Concurrent != 'function') ) this.Concurrent = new Object(); if ( !this.Concurrent.Thread || (typeof this.Concurrent.Thread != 'object' && typeof this.Concurrent.Thread != 'function') ) this.Concurrent.Thread = new Object(); if ( !this.Concurrent.Thread.Compiler || (typeof this.Concurrent.Thread.Compiler != 'object' && typeof this.Concurrent.Thread.Compiler != 'function') ) this.Concurrent.Thread.Compiler = new Object(); if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Cons || (typeof this.Data.Cons != 'object' && typeof this.Data.Cons != 'function') ) this.Data.Cons = new Object(); if ( !this.Data.Cons.Util || (typeof this.Data.Cons.Util != 'object' && typeof this.Data.Cons.Util != 'function') ) this.Data.Cons.Util = new Object(); if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Cons || (typeof this.Data.Cons != 'object' && typeof this.Data.Cons != 'function') ) this.Data.Cons = new Object(); if ( this.Concurrent.Thread.Compiler.CzConvert === undefined ) this.Concurrent.Thread.Compiler.CzConvert = undefined; with ( function(){ with ( Data.Cons.Util ) { with ( Data.Cons ) { with ( Concurrent.Thread.Compiler ) { return function () { var VERSION ; var NAMESPACE; /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Concurrent.Thread code. * * The Initial Developer of the Original Code is * Daisuke Maki. * Portions created by the Initial Developer are Copyright (C) 2006-2007 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ NAMESPACE = 'Concurrent.Thread.Compiler'; var IL = Concurrent.Thread.Compiler.IntermediateLanguage; var Cz = "$Concurrent_Thread_Compiler_CzConvert"; var PREFIX = "$Concurrent_Thread_"; var var_this = new Identifier(PREFIX+"this"); var var_args = new Identifier(PREFIX+"arguments"); var var_cont = new Identifier(PREFIX+"continuation"); var var_self = new Identifier(PREFIX+"self"); var var_compiled = new Identifier(PREFIX+"compiled"); var var_intermediate = new Identifier(PREFIX+"intermediate"); var name_arguments = new Identifier("arguments"); var name_prototype = new Identifier("prototype"); var name_apply = new Identifier("apply"); var name_procedure = new Identifier("procedure"); var name_this_val = new Identifier("this_val"); var name_exception = new Identifier("exception"); var var_null_function = new Identifier(PREFIX+"null_function"); var null_function = new FunctionDeclaration([], var_null_function, [], nil()); function CzConvert ( func ) { var body = inner_function(func); return new FunctionExpression( null, [var_this, var_args, var_cont], list( new ReturnStatement([], new CallExpression( new DotAccessor(body, name_apply), [var_this, var_args] ) ) ) ); } var arguments_callee = new DotAccessor(name_arguments, new Identifier("callee")); function inner_function ( func ) { var blocks = func.body.map(function(it){ return it[Cz](); }); blocks = cons( var_declaration(func.vars), cons( null_function, cons( make_assign(var_args, name_arguments), cons( make_assign(arguments_callee, var_self), blocks ) ) ) ); adder(blocks)( make_return(func.start) ); return new FunctionExpression(null, func.params, blocks); } function var_declaration ( vars ) { if ( !vars.length ) return new EmptyStatement([]); var decls = []; vars.forEach(function( it ){ decls.push({ id:it, exp:null }); }); return new VarStatement([], decls); } function make_assign ( lhs, rhs ) { return new ExpStatement( [], new SimpleAssignExpression(lhs, rhs) ); } var var_cont_ex = new DotAccessor(var_cont, name_exception); function target_to_name ( b ) { if ( b instanceof IL.Block ) { return new Identifier(PREFIX + b.id); } else if ( b === "return" ) { return var_cont; } else if ( b === "throw" ) { return var_cont_ex; } else { Kit.codeBug("invalid target"); } } var undefinedExp = new VoidExpression(new Literal(0)); var name_continuation = new Identifier("continuation"); var name_timeout = new Identifier("timeout"); var name_ret_val = new Identifier("ret_val"); function make_return ( continuation, ret_val ) { return new ReturnStatement([], new ObjectInitializer([ { prop: name_continuation, exp: target_to_name(continuation) }, { prop: name_ret_val , exp: ret_val || undefinedExp }, { prop: name_timeout , exp: undefinedExp } ]) ); } var assign_arguments = make_assign(name_arguments, var_args); function make_continuation ( block, body ) { body = new Block([], body); for ( var i=block.scopes.length-1; i >= 0; i-- ) { body = new WithStatement([], block.scopes[i], body); } return new VarStatement([], [{ id : target_to_name(block), exp: new ObjectInitializer([ {prop: name_procedure, exp: new FunctionExpression(null, [var_intermediate], list(assign_arguments, body))}, {prop: name_this_val , exp: new ThisExpression() }, {prop: name_exception, exp: target_to_name(block.exception) } ]) }]); } IL.GotoBlock.prototype[Cz] = function ( ) { var body = this.body.map(function( it ) { return it[Cz](); }); body = cons(null, body); adder(body)( make_return(this.target, this.arg) ); return make_continuation(this, body.cdr); }; var string_object = new StringLiteral('"object"'); var string_function = new StringLiteral('"function"'); IL.CallBlock.prototype[Cz] = function ( ) { var body = this.body.map(function( it ) { return it[Cz](); }); body = cons(null, body); adder(body)( new IfElseStatement([], new AndExpression( this.func, new StrictEqualExpression( new TypeofExpression( new DotAccessor(this.func, var_compiled) ), string_function ) ), new ReturnStatement([], new CallExpression( new DotAccessor(this.func, var_compiled), [ this.this_val, new ArrayInitializer(this.args), target_to_name(this.target) ] ) ), make_return( this.target, new CallExpression(this.func, this.args) ) ) ); return make_continuation(this, body.cdr); }; IL.NewBlock.prototype[Cz] = function ( ) { var body = this.body.map(function( it ) { return it[Cz](); }); body = cons(null, body); /* // Construct the following code-tree. if ( CONSTRUCTOR && typeof CONSTRUCTOR.$Concurrent_Thread_compiled == "function" ) { $Concurrent_Thread_null_function.prototype = CONSTRUCTOR.prototype; $Concurrent_Thread_this = new $Concurrent_Thread_null_function(); return CONSTRUCTOR.$Concurrent_Thread_compiled( $Concurrent_Thread_this, [ARG1, ARG2, ...], { procedure: function($Concurrent_Thread_intermediate){ if ( !($Concurrent_Thread_intermediate && (typeof $Concurrent_Thread_intermediate === "object" || typeof $Concurrent_Thread_intermediate === "function") ) $Concurrent_Thread_intermediate = $Concurrent_Thread_this; $Concurrent_Thread_this = null; // encourages GC return { continuation: CONTINUATION, ret_val : $Concurrent_Thread_intermediate, timeout : void 0 }; }, this_val: this, exception: EXCEPTION } ); } else { return { continuation: CONTINUATION, ret_val : new CONSTRUCTOR(ARG1, ARG2...), timeout : void 0 }; } */ adder(body)( new IfElseStatement([], new AndExpression( this.func, new StrictEqualExpression( new TypeofExpression( new DotAccessor(this.func, var_compiled) ), string_function ) ), new Block([], list( make_assign( new DotAccessor(var_null_function, name_prototype), new DotAccessor(this.func , name_prototype) ), make_assign( var_this, new NewExpression(var_null_function, []) ), new ReturnStatement([], new CallExpression( new DotAccessor(this.func, var_compiled), [ var_this, new ArrayInitializer(this.args), new ObjectInitializer([ {prop: name_procedure, exp: new FunctionExpression(null, [var_intermediate], list( new IfStatement([], new NotExpression( new AndExpression( var_intermediate, new OrExpression( new StrictEqualExpression(new TypeofExpression(var_intermediate), string_object), new StrictEqualExpression(new TypeofExpression(var_intermediate), string_function) ) ) ), make_assign(var_intermediate, var_this) ), make_assign(var_this, new NullLiteral()), make_return(this.target, var_intermediate) ))}, {prop: name_this_val , exp: new ThisExpression()}, {prop: name_exception, exp: target_to_name(this.exception)} ]) ] ) ) ) ), make_return(this.target, new NewExpression(this.func, this.args)) ) ); return make_continuation(this, body.cdr); }; IL.ExpStatement.prototype[Cz] = function ( ) { return new ExpStatement([], this.exp); }; IL.CondStatement.prototype[Cz] = function ( ) { return new IfStatement([], this.cond, make_return(this.target)); }; IL.RecvStatement.prototype[Cz] = function ( ) { return make_assign(this.assignee, var_intermediate); }; var name_push = new Identifier("push"); IL.EnumStatement.prototype[Cz] = function ( ) { return new Block([], list( make_assign(var_this, new ArrayInitializer([])), new ForInStatement([], var_intermediate, this.exp, new ExpStatement([], new CallExpression( new DotAccessor(var_this, name_push), [var_intermediate] ) ) ), make_assign(this.assignee, var_this), make_assign(var_this, new NullLiteral()) )); }; return { CzConvert: CzConvert }; }(); } } } }.call(null) ) { this.Concurrent.Thread.Compiler.CzConvert = CzConvert; } }).call(null); (function(){ if ( !this.Concurrent || (typeof this.Concurrent != 'object' && typeof this.Concurrent != 'function') ) this.Concurrent = new Object(); if ( !this.Concurrent.Thread || (typeof this.Concurrent.Thread != 'object' && typeof this.Concurrent.Thread != 'function') ) this.Concurrent.Thread = new Object(); if ( !this.Concurrent.Thread.Compiler || (typeof this.Concurrent.Thread.Compiler != 'object' && typeof this.Concurrent.Thread.Compiler != 'function') ) this.Concurrent.Thread.Compiler = new Object(); if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Cons || (typeof this.Data.Cons != 'object' && typeof this.Data.Cons != 'function') ) this.Data.Cons = new Object(); if ( !this.Data.Cons.Util || (typeof this.Data.Cons.Util != 'object' && typeof this.Data.Cons.Util != 'function') ) this.Data.Cons.Util = new Object(); if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Error || (typeof this.Data.Error != 'object' && typeof this.Data.Error != 'function') ) this.Data.Error = new Object(); if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Cons || (typeof this.Data.Cons != 'object' && typeof this.Data.Cons != 'function') ) this.Data.Cons = new Object(); if ( !this.Concurrent || (typeof this.Concurrent != 'object' && typeof this.Concurrent != 'function') ) this.Concurrent = new Object(); if ( !this.Concurrent.Thread || (typeof this.Concurrent.Thread != 'object' && typeof this.Concurrent.Thread != 'function') ) this.Concurrent.Thread = new Object(); if ( this.Concurrent.Thread.Compiler.CfConvert === undefined ) this.Concurrent.Thread.Compiler.CfConvert = undefined; if ( this.Concurrent.Thread.Compiler.CyclicExceptionHandlerError === undefined ) this.Concurrent.Thread.Compiler.CyclicExceptionHandlerError = undefined; with ( function(){ with ( Data.Cons.Util ) { with ( Data.Cons ) { with ( Data.Error ) { with ( Concurrent.Thread ) { with ( Concurrent.Thread.Compiler ) { return function () { var VERSION ; var NAMESPACE; /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Concurrent.Thread code. * * The Initial Developer of the Original Code is * Daisuke Maki. * Portions created by the Initial Developer are Copyright (C) 2006-2007 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ NAMESPACE = 'Concurrent.Thread.Compiler'; var IL = Concurrent.Thread.Compiler.IntermediateLanguage; var Cf = "$Concurrent_Thread_Compiler_Cf"; function CfConvert ( func ) { var cache = new IdentifierMap(); var start = CfTarget(func.start, cache); var cache2 = new IdentifierMap(); cache.values().forEach(function( it ){ cache2.put(new Identifier(it.id), it); }); var body = cons(null, nil()); append = adder(body); cacheToList(cache2).forEach(function( it ){ return append(cache2.get(it)); }); return new IL.Function(func.name, func.params, func.vars, body.cdr, start); } function cacheToList ( cache ) { // Resolves exception-dependency and sort blocks in valid order. var blocks = []; var depends = new IdentifierMap(); cache.values().forEach(function( it ){ blocks.push(it); depends.put( new Identifier(it.id), it.exception instanceof IL.Block ? new Identifier(it.exception.id) : undefined ); }); return check_cyclic(depends); } var CyclicExceptionHandlerError = Error.extend( function ( $super, message ) { $super(message); }, {name: NAMESPACE + ".CyclicExceptionHandlerError"} ); function check_cyclic ( depends ) { var ok = {}; function traverse ( id, path ) { if ( ok[id] ) return "OK"; var next = depends.get(id); if ( !next ) { ok[id] = true; path.push(id); return "OK"; } path.forEach(function( it ){ if ( it.valueOf() == id.valueOf() ) { throw new CyclicExceptionHandlerError("cyclic exception handler: " + path.concat([id]).join(" -> ")); } }); path.push(id); traverse(next, path); ok[id] = true; return "OK"; } var result = []; depends.keys().forEach(function( it ){ var path = []; traverse(it, path); result = path.concat(result); }); return result.reverse(); } function CfTarget ( b, cache ) { if ( b === "return" || b === "throw" ) return b; if ( cache.get(new Identifier(b.id)) ) return cache.get(new Identifier(b.id)); return b[Cf](cache); } IL.GotoBlock.prototype[Cf] = function ( cache ) { var block = new IL.GotoBlock(); cache.put(new Identifier(this.id), block); block.scopes = this.scopes.map(function( it ){ return it[Cf](cache); }); block.body = this.body.map(function( it ){ return it[Cf](cache); }); block.arg = this.arg[Cf](cache); block.target = CfTarget(this.target, cache); block.exception = CfTarget(this.exception, cache); return block; }; IL.CallBlock.prototype[Cf] = function ( cache ) { var block = new IL.CallBlock(); cache.put(new Identifier(this.id), block); block.scopes = this.scopes.map(function( it ){ return it[Cf](cache); }); block.body = this.body.map(function( it ){ return it[Cf](cache); }); block.this_val = this.this_val[Cf](cache); block.func = this.func[Cf](cache); block.args = this.args.map(function( it ){ return it[Cf](cache); }); block.target = CfTarget(this.target, cache); block.exception = CfTarget(this.exception, cache); return block; }; IL.NewBlock.prototype[Cf] = function ( cache ) { var block = new IL.NewBlock(); cache.put(new Identifier(this.id), block); block.scopes = this.scopes.map(function( it ){ return it[Cf](cache); }); block.body = this.body.map(function( it ){ return it[Cf](cache); }); block.func = this.func[Cf](cache); block.args = this.args.map(function( it ){ return it[Cf](cache); }); block.target = CfTarget(this.target, cache); block.exception = CfTarget(this.exception, cache); return block; }; IL.ExpStatement.prototype[Cf] = function ( cache ) { return new IL.ExpStatement( this.exp[Cf](cache) ); }; IL.CondStatement.prototype[Cf] = function ( cache ) { return new IL.CondStatement( this.cond[Cf](cache), CfTarget(this.target, cache) ); }; IL.RecvStatement.prototype[Cf] = function ( cache ) { return new IL.RecvStatement( this.assignee[Cf](cache) ); }; IL.EnumStatement.prototype[Cf] = function ( cache ) { return new IL.EnumStatement( this.exp[Cf](cache), this.assignee[Cf](cache) ); }; Expression.prototype[Cf] = function ( cache ) { return this; }; UnaryExpression.prototype[Cf] = function ( cache ) { return new this.constructor(this.exp[Cf](cache)); }; BinaryExpression.prototype[Cf] = function ( cache ) { return new this.constructor(this.left[Cf](cache), this.right[Cf](cache)); }; ArrayInitializer.prototype[Cf] = function ( cache ) { return new ArrayInitializer(this.elems.map(function( it ){ return it[Cf](cache); })); }; FunctionExpression.prototype[Cf] = function ( cache ) { return prepareTree(this); }; ObjectInitializer.prototype[Cf] = function ( cache ) { return new ObjectInitializer(this.pairs.map(function( it ){ return { prop: it.prop, exp: it.exp[Cf](cache) }; })); }; DotAccessor.prototype[Cf] = function ( cache ) { return new DotAccessor(this.base[Cf](cache), this.prop); }; ConditionalExpression.prototype[Cf] = function ( cache ) { return new ConditionalExpression( this.cond[Cf](cache), this.texp[Cf](cache), this.fexp[Cf](cache) ); }; return { CfConvert: CfConvert, CyclicExceptionHandlerError: CyclicExceptionHandlerError }; }(); } } } } } }.call(null) ) { this.Concurrent.Thread.Compiler.CfConvert = CfConvert; this.Concurrent.Thread.Compiler.CyclicExceptionHandlerError = CyclicExceptionHandlerError; } }).call(null); (function(){ if ( !this.Concurrent || (typeof this.Concurrent != 'object' && typeof this.Concurrent != 'function') ) this.Concurrent = new Object(); if ( !this.Concurrent.Thread || (typeof this.Concurrent.Thread != 'object' && typeof this.Concurrent.Thread != 'function') ) this.Concurrent.Thread = new Object(); if ( !this.Concurrent.Thread.Compiler || (typeof this.Concurrent.Thread.Compiler != 'object' && typeof this.Concurrent.Thread.Compiler != 'function') ) this.Concurrent.Thread.Compiler = new Object(); if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Error || (typeof this.Data.Error != 'object' && typeof this.Data.Error != 'function') ) this.Data.Error = new Object(); if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Cons || (typeof this.Data.Cons != 'object' && typeof this.Data.Cons != 'function') ) this.Data.Cons = new Object(); if ( this.Concurrent.Thread.Compiler.Parser === undefined ) this.Concurrent.Thread.Compiler.Parser = undefined; with ( function(){ with ( Data.Cons ) { with ( Data ) { with ( Data.Error ) { with ( Concurrent.Thread.Compiler ) { return function () { var VERSION = '0.0.0'; var NAMESPACE; /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Rhino code, released * May 6, 1999. * * The Initial Developer of the Original Code is * Netscape Communications Corporation. * Portions created by the Initial Developer are Copyright (C) 1997-1999 * the Initial Developer. All Rights Reserved. * * Contributor(s): * Mike Ang * Igor Bukanov * Yuh-Ruey Chen * Ethan Hugg * Terry Lucas * Mike McCabe * Milen Nankov * Daisuke Maki * * Alternatively, the contents of this file may be used under the terms of * the GNU General Public License Version 2 or later (the "GPL"), in which * case the provisions of the GPL are applicable instead of those above. If * you wish to allow use of your version of this file only under the terms of * the GPL and not to allow others to use your version of this file under the * MPL, indicate your decision by deleting the provisions above and replacing * them with the notice and other provisions required by the GPL. If you do * not delete the provisions above, a recipient may use your version of this * file under either the MPL or the GPL. * * ***** END LICENSE BLOCK ***** */ /** * This file is based on the file Parser.java in Rhino 1.6R5. */ NAMESPACE = 'Concurrent.Thread.Compiler'; // TokenInformation flags : flaggedTokenBuffer stores them together // with token type var CLEAR_TI_MASK = 0xFFFF; // mask to clear token information bits var TI_AFTER_EOL = 1 << 16; // first token of the source line var TI_CHECK_LABEL = 1 << 17; // indicates to check for label // Exception to unwind var ParserException = Exception.extend( function($super, message){ $super(message); }, { name: NAMESPACE + ".ParserException" } ); // Exception to return statement-label function LabelException ( label ) { this.label = label; // Identifier } // default error reporter var defaultReporter = new ErrorReporter(); defaultReporter.error = function ( message, line, lineSource, lineOffset ) { throw new SyntaxError("(" + line + ", " + lineOffset + "): " + message + "\nline: " + lineSource); }; function Parser ( errorReporter ) { this.errorReporter = errorReporter instanceof ErrorReporter ? errorReporter : defaultReporter; this.ts = undefined; // TokenStream this.source = undefined; // String # file-name, URL, ...etc this.flaggedTokenBuffer = null; // Stack this.syntaxErrorCount = 0; this.nestingOfFunction = 0; // The following are per function variables and should be saved/restored // during function parsing. this.nestingOfLoop = 0; this.nestingOfSwitch = 0; this.allLabelSet = null; // contains all labels in current scope this.loopLabelSet = null; // contains only labels qualifying IterationStatement in current scope } var proto = Parser.prototype; proto.getMessage = function ( messageId /* optional args */ ) { //!! fake implementation return messageId; }; proto.addWarning = function ( messageId /* optional args */ ) { this.errorReporter.warning(this.getMessage.apply(this, arguments), this.ts.getLineno() , this.ts.getLine() , this.ts.getOffset() ); }; proto.addError = function ( messageId /* optional args */ ) { ++this.syntaxErrorCount; this.errorReporter.error(this.getMessage.apply(this, arguments), this.ts.getLineno() , this.ts.getLine() , this.ts.getOffset() ); }; proto.reportError = function ( messageId /* optional args */ ) { this.addError.apply(this, arguments); // Throw a ParserException exception to unwind the recursive descent // parse. throw new ParserException(); }; proto.peekToken = function ( ) { var tt; if ( this.flaggedTokenBuffer.isEmpty() ) { tt = this.ts.getToken(); if ( tt === Token.EOL ) { do { tt = this.ts.getToken(); } while ( tt === Token.EOL ); tt |= TI_AFTER_EOL; } this.flaggedTokenBuffer.push(tt); } else { tt = this.flaggedTokenBuffer.peek(); } return tt & CLEAR_TI_MASK; }; proto.peekFlaggedToken = function ( ) { this.peekToken(); return this.flaggedTokenBuffer.peek(); }; proto.consumeToken = function ( ) { this.flaggedTokenBuffer.pop(); }; proto.nextToken = function ( ) { var tt = this.peekToken(); this.consumeToken(); return tt; }; proto.nextFlaggedToken = function ( ) { this.peekToken(); var ttFlagged = this.flaggedTokenBuffer.peek(); this.consumeToken(); return ttFlagged; }; proto.matchToken = function ( toMatch ) { if ( this.peekToken() !== toMatch ) return false; this.consumeToken(); return true; }; proto.peekTokenOrEOL = function ( ) { var tt = this.peekToken(); // Check for last peeked token flags if ( this.flaggedTokenBuffer.peek() & TI_AFTER_EOL ) return Token.EOL; return tt; }; // Since we need to backtrack to properly parse "default xml namespace" // in switch-statement. proto.ungetToken = function ( token ) { this.flaggedTokenBuffer.push(token); }; proto.setCheckForLabel = function ( ) { var tt = this.flaggedTokenBuffer.pop(); if ( (tt & CLEAR_TI_MASK) !== Token.NAME ) throw Kit.codeBug(); this.flaggedTokenBuffer.push(tt | TI_CHECK_LABEL); }; proto.mustMatchToken = function ( toMatch, messageId /* optional args */ ) { if ( !this.matchToken(toMatch) ) { var args = []; for ( var i=1; i < arguments.length; i++ ) args.push(arguments[i]); this.reportError.apply(this, args); } }; proto.eof = function ( ) { return this.ts.eof(); }; proto.insideFunction = function ( ) { return this.nestingOfFunction !== 0; }; proto.insideLoop = function ( ) { return this.nestingOfLoop !== 0; }; proto.enterLoop = function ( labels ) { for ( var i=0; i < labels.length; i++ ) this.loopLabelSet.add(labels[i]); this.nestingOfLoop++; }; proto.exitLoop = function ( labels ) { for ( var i=0; i < labels.length; i++ ) this.loopLabelSet.remove(labels[i]); this.nestingOfLoop--; }; proto.parse = function ( sourceString, lineno, source ) { this.ts = new TokenStream(this, sourceString, lineno); this.source = source; // optional this.flaggedTokenBuffer = new Stack(); this.syntaxErrorCount = 0; this.nestingOfFunction = 0; this.nestingOfLoop = 0; this.nestingOfSwitch = 0; this.allLabelSet = new IdentifierSet(); this.loopLabelSet = new IdentifierSet(); try { var body = this.statements(); this.mustMatchToken(Token.EOF, "msg.syntax"); } catch ( e ) { if ( e instanceof ParserException ) { // Ignore it. } else { // Maybe stack overflow. //!!fake implementation throw e; } } if ( this.syntaxErrorCount ) { var msg = "msg.got.syntax.errors"; this.addError(msg); throw new SyntaxError(this.getMessage("msg.got.syntax.errors")); } this.ts = null; // It helps GC return body; }; proto.statements = function ( ) { var head, cell; cell = head = cons(null, nil()); bodyLoop: for (;;) { var n; switch ( this.peekToken() ) { case Token.ERROR: case Token.EOF: case Token.RC: break bodyLoop; case Token.FUNCTION: // save the stack this.consumeToken(); n = this.functionDecl([]); break; default: n = this.statement(); break; } cell = cell.cdr = cons(n, cell.cdr); } return head.cdr; }; proto.functionDecl = function ( labels ) { var baseLineno = this.ts.getLineno(); // line number where source starts this.mustMatchToken(Token.NAME, "msg.no.func.name"); var name = new Identifier(this.ts.getString()); var params = this.parameterList(); var body = this.functionBody(); return new FunctionDeclaration(labels, name, params, body, baseLineno, this.source); }; proto.functionExpr = function ( ) { var name = null; if ( this.matchToken(Token.NAME) ) name = new Identifier(this.ts.getString()); var params = this.parameterList(); var body = this.functionBody(); return new FunctionExpression(name, params, body); }; proto.parameterList = function ( ) { this.mustMatchToken(Token.LP, "msg.no.paren.parms"); if ( this.matchToken(Token.RP) ) return []; var params = []; var exists = new IdentifierSet(); do { this.mustMatchToken(Token.NAME, "msg.no.parm"); var p = new Identifier(this.ts.getString()); if ( exists.contains(p) ) this.addWarning("msg.dup.parms", s); params.push(p); exists.add(p); } while ( this.matchToken(Token.COMMA) ); this.mustMatchToken(Token.RP, "msg.no.paren.after.parms"); return params; }; proto.functionBody = function ( ) { this.mustMatchToken(Token.LC, "msg.no.brace.body"); var saveAllLabel = this.allLabelSet; var saveLoopLabel = this.loopLabelSet; var saveLoop = this.nestingOfLoop; var saveSwitch = this.nestingOfSwitch; this.allLabelSet = new IdentifierSet(); this.loopLabelSet = new IdentifierSet(); this.nestingOfLoop = 0; this.nestingOfSwitch = 0; this.nestingOfFunction++; try { var body = this.statements(); } catch ( e ) { if ( e instanceof ParserException ) { // Ignore it } else { throw e; } } finally { this.allLabelSet = saveAllLabel; this.loopLabelSet = saveLoopLabel; this.nestingOfLoop = saveLoop; this.nestingOfSwitch = saveSwitch; this.nestingOfFunction--; } this.mustMatchToken(Token.RC, "msg.no.brace.after.body"); return body; }; proto.statement = function ( ) { try { var n = this.statementHelper([]); if ( n != null ) return n; } catch ( e ) { if ( e instanceof ParserException ) { // Ignore it. } else { throw e; } } // skip to end of statement guessingStatementEnd: for (;;) { var tt = this.peekTokenOrEOL(); this.consumeToken(); switch ( tt ) { case Token.ERROR: case Token.EOF: case Token.EOL: case Token.SEMI: break guessingStatementEnd; } } return null; }; proto.statementHelper = function ( labels ) { var statement = null; switch ( this.peekToken() ) { case Token.IF: { this.consumeToken(); var lineno = this.ts.getLineno(); var cond = this.condition(); var tstat = this.statement(); if ( this.matchToken(Token.ELSE) ) { return new IfElseStatement(labels, cond, tstat, this.statement(), lineno, this.source); } else { return new IfStatement(labels, cond, tstat, lineno, this.source); } } case Token.SWITCH: { this.consumeToken(); var lineno = this.ts.getLineno(); this.mustMatchToken(Token.LP, "msg.no.paren.switch"); var exp = this.expr(false); this.mustMatchToken(Token.RP, "msg.no.paren.after.switch"); this.mustMatchToken(Token.LC, "msg.no.brace.switch"); var switchStatement = new SwitchStatement(labels, exp, nil(), lineno, this.source); var clauses = cons(nil(), nil()); var last = clauses; this.nestingOfSwitch++; try { var hasDefault = false; switchLoop: for (;;) { var lineno = this.ts.getLineno(); var caseExpression; switch ( this.nextToken() ) { case Token.RC: break switchLoop; case Token.CASE: caseExpression = this.expr(false); this.mustMatchToken(Token.COLON, "msg.no.colon.case"); break; case Token.DEFAULT: if ( hasDefault ) this.reportError("msg.double.switch.default"); hasDefault = true; caseExpression = null; this.mustMatchToken(Token.COLON, "msg.no.colon.case"); break; default: this.reportError("msg.bad.switch"); break switchLoop; } var c = caseExpression ? new CaseClause(caseExpression, this.statementsInSwitch(), lineno, this.source) : new DefaultClause(this.statementsInSwitch(), lineno, this.source); last = last.cdr = cons(c, last.cdr); } } finally { this.nestingOfSwitch--; } switchStatement.clauses = clauses.cdr; return switchStatement; } case Token.WHILE: { this.consumeToken(); var lineno = this.ts.getLineno(); this.enterLoop(labels); try { return new WhileStatement(labels, this.condition(), this.statement(), lineno, this.source); } finally { this.exitLoop(labels); } } case Token.DO: { this.consumeToken(); var lineno = this.ts.getLineno(); this.enterLoop(labels); try { var body = this.statement(); } finally { this.exitLoop(labels); } this.mustMatchToken(Token.WHILE, "msg.no.while.do"); var cond = this.condition(); // Always auto-insert semicon to follow SpiderMonkey: // It is required by EMAScript but is ignored by the rest of // world, see bug 238945 this.matchToken(Token.SEMI); return new DoWhileStatement(labels, body, cond, lineno, this.source); } case Token.FOR: { this.consumeToken(); var lineno = this.ts.getLineno(); var init; // init is also foo in 'foo in Object' var cond; // cond is also object in 'foo in Object' var incr = null; var body; var isForEach = false; var isForIn = false; var isVar = false; // See if this is a for each () instead of just a for () if ( this.matchToken(Token.NAME) ) { if ( this.ts.getString() === "each" ) { isForEach = true; } else { this.reportError("msg.no.paren.for"); } } this.mustMatchToken(Token.LP, "msg.no.paren.for"); var tt = this.peekToken(); if ( tt === Token.SEMI ) { init = null; } else { if ( tt === Token.VAR ) { // set init to a var list or initial this.consumeToken(); // consume the 'var' token init = this.variables(true); isVar = true; } else { init = this.expr(true); } } if ( this.matchToken(Token.IN) ) { isForIn = true; // 'cond' is the object over which we're iterating cond = this.expr(false); } else { // ordinary for loop this.mustMatchToken(Token.SEMI, "msg.no.semi.for"); if ( this.peekToken() === Token.SEMI ) { // no loop condition cond = null; } else { cond = this.expr(false); } this.mustMatchToken(Token.SEMI, "msg.no.semi.for.cond"); if ( this.peekToken() === Token.RP ) { incr = null; } else { incr = this.expr(false); } } this.mustMatchToken(Token.RP, "msg.no.paren.for.ctrl"); this.enterLoop(labels); try { body = this.statement(); } finally { this.exitLoop(labels); } if ( !isForIn ) { // Although SpiderMonkey doesn't allow "for each ( ...; ...; ... )", // Rhino1.6R5 allowed it. We follow Rhino's position here. if ( isVar ) return new ForVarStatement(labels, init, cond, incr, body, lineno, this.source); else return new ForStatement(labels, init, cond, incr, body, lineno, this.source); } else { if ( isVar ) { // Check if init (var declarations) contains only one. if ( init.length != 1 ) this.reportError("msg.mult.index"); if ( isForEach ) return new ForEachVarStatement(labels, init[0], cond, body, lineno, this.source); else return new ForInVarStatement(labels, init[0], cond, body, lineno, this.source); } else { // Check if init (an expression left-hand-side of "in") has lvalue. if ( !init.hasLvalue() ) this.reportError("msg.bad.for.in.lhs"); if ( isForEach ) return new ForEachStatement(labels, init, cond, body, lineno, this.source); else return new ForInStatement(labels, init, cond, body, lineno, this.source); } } } case Token.TRY: { this.consumeToken(); var lineno = this.ts.getLineno(); // Although ECMA262-3 requires a block here, Rhino1.6R5 allows any kind of statement. // We follow Rhino's style, but issue warning when a statement is not a block. var tryBlock = this.statement(); if ( !(tryBlock instanceof Block) ) { this.addWarning("msg.no.brace.tryblock"); tryBlock = new Block([], cons(tryBlock, nil()), tryBlock.lineno, tryBlock.source); } var catchList; var cell = catchList = cons(null, nil()); var sawDefaultCatch = false; var peek = this.peekToken(); if ( peek === Token.CATCH ) { while ( this.matchToken(Token.CATCH) ) { if ( sawDefaultCatch ) this.reportError("msg.catch.unreachable"); var line = this.ts.getLineno(); this.mustMatchToken(Token.LP, "msg.no.paren.catch"); this.mustMatchToken(Token.NAME, "msg.bad.catchcond"); var variable = new Identifier(this.ts.getString()); var cond = null; if ( this.matchToken(Token.IF) ) { cond = this.expr(false); } else { sawDefaultCatch = true; } this.mustMatchToken(Token.RP, "msg.bad.catchcond"); this.mustMatchToken(Token.LC, "msg.no.brace.catchblock"); var block = new Block([], this.statements(), line, this.source); this.mustMatchToken(Token.RC, "msg.no.brace.after.body"); var clause = new CatchGuard(variable, cond, block, line, this.source); cell = cell.cdr = cons(clause, cell.cdr); } } else if ( peek !== Token.FINALLY ) { this.mustMatchToken(Token.FINALLY, "msg.try.no.catchfinally"); } catchList = catchList.cdr; var finallyBlock = null; if ( this.matchToken(Token.FINALLY) ) { // Rhino also allows any kind of statement here. finallyBlock = this.statement(); if ( !(finallyBlock instanceof Block) ) { this.addWarning("msg.no.brace.finallyblock"); finallyBlock = new Block([], cons(finallyBlock, nil()), finallyBlock.lineno, finallyBlock.source); } } return finallyBlock ? new TryCatchListFinallyStatement(labels, tryBlock, catchList, finallyBlock, lineno, this.source) : new TryCatchListStatement(labels, tryBlock, catchList, lineno, this.source); } case Token.THROW: { this.consumeToken(); if ( this.peekTokenOrEOL() === Token.EOL ) { // ECMAScript does not allow new lines before throw expression, // see bug 256617 this.reportError("msg.bad.throw.eol"); } var lineno = this.ts.getLineno(); statement = new ThrowStatement(labels, this.expr(false), lineno, this.source); break; } case Token.BREAK: { this.consumeToken(); var lineno = this.ts.getLineno(); var target = this.matchJumpLabelName(Token.BREAK); if ( target == null ) { if ( !this.nestingOfLoop && !this.nestingOfSwitch ) this.reportError("msg.bad.break"); } statement = new BreakStatement(labels, target, lineno, this.source); break; } case Token.CONTINUE: { this.consumeToken(); var lineno = this.ts.getLineno(); var target = this.matchJumpLabelName(Token.CONTINUE); if ( target == null ) { if ( !this.nestingOfLoop ) reportError("msg.continue.outside"); } statement = new ContinueStatement(labels, target, lineno, this.source); break; } case Token.WITH: { this.consumeToken(); var lineno = this.ts.getLineno(); this.mustMatchToken(Token.LP, "msg.no.paren.with"); var exp = this.expr(false); this.mustMatchToken(Token.RP, "msg.no.paren.after.with"); var body = this.statement(); return new WithStatement(labels, exp, body, lineno, this.source); } case Token.VAR: { this.consumeToken(); statement = new VarStatement(labels, this.variables(false), lineno, this.source); break; } case Token.RETURN: { if ( !this.insideFunction() ) this.reportError("msg.bad.return"); this.consumeToken(); var lineno = this.ts.getLineno(); var exp; /* This is ugly, but we don't want to require a semicolon. */ switch ( this.peekTokenOrEOL() ) { case Token.SEMI: case Token.RC: case Token.EOF: case Token.EOL: case Token.ERROR: exp = null; break; default: exp = this.expr(false); } statement = new ReturnStatement(labels, exp, lineno, this.source); break; } case Token.LC: this.consumeToken(); var block = new Block(labels, this.statements(), lineno, this.source); this.mustMatchToken(Token.RC, "msg.no.brace.block"); return block; case Token.ERROR: // Fall thru, to have a node for error recovery to work on case Token.SEMI: this.consumeToken(); return new EmptyStatement(labels, lineno, this.source); case Token.FUNCTION: { this.consumeToken(); return this.functionDecl(labels); } case Token.DEFAULT: { this.consumeToken(); this.reportError("msg.XML.not.available"); } case Token.NAME: { var lineno = this.ts.getLineno(); this.setCheckForLabel(); try { statement = new ExpStatement(labels, this.expr(false), lineno, this.source); } catch ( e ) { if ( e instanceof LabelException ) { // Label found! if ( this.allLabelSet.contains(e.label) ) this.reportError("msg.dup.label"); this.allLabelSet.add(e.label); labels.push(e.label); try { statement = this.statementHelper(labels); } finally { this.allLabelSet.remove(e.label); } return statement; } else { throw e; } } break; } default: { var lineno = this.ts.getLineno(); statement = new ExpStatement(labels, this.expr(false), lineno, this.source); break; } } switch ( this.peekTokenOrEOL() ) { case Token.SEMI: // Consume ';' as a part of statement this.consumeToken(); break; case Token.ERROR: case Token.EOF: case Token.EOL: case Token.RC: // Autoinsert ; break; default: // Report error if no EOL or autoinsert ; otherwise this.reportError("msg.no.semi.stmt"); } return statement; }; proto.condition = function ( ) { this.mustMatchToken(Token.LP, "msg.no.paren.cond"); var exp = this.expr(false); this.mustMatchToken(Token.RP, "msg.no.paren.after.cond"); if ( exp instanceof SimpleAssignExpression ) this.addWarning("msg.assign.cond"); return exp; }; // match a NAME; return null if no match. proto.matchJumpLabelName = function ( token ) { if ( this.peekTokenOrEOL() !== Token.NAME ) return null; var label = new Identifier(this.ts.getString()); this.consumeToken(); switch ( token ) { case Token.CONTINUE: if ( !this.loopLabelSet.contains(label) ) { this.reportError("msg.undef.label"); } break; case Token.BREAK: if ( !this.allLabelSet.contains(label) ) { this.reportError("msg.undef.label"); } break; default: throw Kit.codeBug(); } return label; }; proto.statementsInSwitch = function ( ) { var head, cell; head = cell = cons(null, nil()); clauseLoop: for (;;) { switch ( this.peekToken() ) { case Token.ERROR: case Token.EOF: case Token.RC: case Token.CASE: break clauseLoop; case Token.DEFAULT: this.consumeToken(); var tt = this.peekToken(); this.ungetToken(Token.DEFAULT); if ( tt === Token.COLON ) break clauseLoop; // fall thru default: cell = cell.cdr = cons(this.statement(), cell.cdr); } } return head.cdr; }; proto.variables = function ( inForInit ) { var decls = []; for (;;) { this.mustMatchToken(Token.NAME, "msg.bad.var"); var name = new Identifier(this.ts.getString()); var init = this.matchToken(Token.ASSIGN) ? this.assignExpr(inForInit) : null; decls.push({id: name, exp: init}); if ( !this.matchToken(Token.COMMA) ) break; } return decls; }; proto.expr = function ( inForInit ) { var exp = this.assignExpr(inForInit); while ( this.matchToken(Token.COMMA) ) { exp = new CommaExpression(exp, this.assignExpr(inForInit)); } return exp; }; proto.assignExpr = function ( inForInit ) { var exp = this.condExpr(inForInit); var tt = this.peekToken(); if ( tt < Token.FIRST_ASSIGN || Token.LAST_ASSIGN < tt ) return exp; if ( !exp.hasLvalue() ) this.reportError("msg.bad.assign.left"); switch ( this.nextToken() ) { case Token.ASSIGN: return new SimpleAssignExpression(exp, this.assignExpr(inForInit)); case Token.ASSIGN_BITOR: return new BitOrAssignExpression(exp, this.assignExpr(inForInit)); case Token.ASSIGN_BITXOR: return new BitXorAssignExpression(exp, this.assignExpr(inForInit)); case Token.ASSIGN_BITAND: return new BitAndAssignExpression(exp, this.assignExpr(inForInit)); case Token.ASSIGN_LSH: return new LShiftAssignExpression(exp, this.assignExpr(inForInit)); case Token.ASSIGN_RSH: return new RShiftAssignExpression(exp, this.assignExpr(inForInit)); case Token.ASSIGN_URSH: return new URShiftAssignExpression(exp, this.assignExpr(inForInit)); case Token.ASSIGN_ADD: return new AddAssignExpression(exp, this.assignExpr(inForInit)); case Token.ASSIGN_SUB: return new SubAssignExpression(exp, this.assignExpr(inForInit)); case Token.ASSIGN_MUL: return new MulAssignExpression(exp, this.assignExpr(inForInit)); case Token.ASSIGN_DIV: return new DivAssignExpression(exp, this.assignExpr(inForInit)); case Token.ASSIGN_MOD: return new ModAssignExpression(exp, this.assignExpr(inForInit)); default: throw Kit.codeBug(); } }; proto.condExpr = function ( inForInit ) { var exp = this.orExpr(inForInit); if ( !this.matchToken(Token.HOOK) ) return exp; var ifTrue = this.assignExpr(false); this.mustMatchToken(Token.COLON, "msg.no.colon.cond"); var ifFalse = this.assignExpr(inForInit); return new ConditionalExpression(exp, ifTrue, ifFalse); }; proto.orExpr = function ( inForInit ) { var exp = this.andExpr(inForInit); while ( this.matchToken(Token.OR) ) { exp = new OrExpression(exp, this.andExpr(inForInit)); } return exp; }; proto.andExpr = function ( inForInit ) { var exp = this.bitOrExpr(inForInit); while ( this.matchToken(Token.AND) ) { exp = new AndExpression(exp, this.bitOrExpr(inForInit)); } return exp; }; proto.bitOrExpr = function ( inForInit ) { var exp = this.bitXorExpr(inForInit); while ( this.matchToken(Token.BITOR) ) { exp = new BitOrExpression(exp, this.bitXorExpr(inForInit)); } return exp; }; proto.bitXorExpr = function ( inForInit ) { var exp = this.bitAndExpr(inForInit); while ( this.matchToken(Token.BITXOR) ) { exp = new BitXorExpression(exp, this.bitAndExpr(inForInit)); } return exp; }; proto.bitAndExpr = function ( inForInit ) { var exp = this.eqExpr(inForInit); while ( this.matchToken(Token.BITAND) ) { exp = new BitAndExpression(exp, this.eqExpr(inForInit)); } return exp; }; proto.eqExpr = function ( inForInit ) { var exp = this.relExpr(inForInit); for (;;) { var constructor; switch ( this.peekToken() ) { case Token.EQ: constructor = EqualExpression; break; case Token.NE: constructor = NotEqualExpression; break; case Token.SHEQ: constructor = StrictEqualExpression; break; case Token.SHNE: constructor = StrictNotEqualExpression; break; default: return exp; } this.consumeToken(); exp = new constructor(exp, this.relExpr(inForInit)); } }; proto.relExpr = function ( inForInit ) { var exp = this.shiftExpr(); for (;;) { var constructor; switch ( this.peekToken() ) { case Token.IN: if ( inForInit ) return exp; constructor = InExpression; break; case Token.INSTANCEOF: constructor = InstanceofExpression; break; case Token.LE: constructor = LessEqualExpression; break; case Token.LT: constructor = LessThanExpression; break; case Token.GE: constructor = GreaterEqualExpression; break; case Token.GT: constructor = GreaterThanExpression; break; default: return exp; } this.consumeToken(); exp = new constructor(exp, this.shiftExpr()); } }; proto.shiftExpr = function ( ) { var exp = this.addExpr(); for (;;) { var constructor; switch ( this.peekToken() ) { case Token.LSH: constructor = LShiftExpression; break; case Token.RSH: constructor = RShiftExpression; break; case Token.URSH: constructor = URShiftExpression; break; default: return exp; } this.consumeToken(); exp = new constructor(exp, this.addExpr()); } }; proto.addExpr = function ( ) { var exp = this.mulExpr(); for (;;) { var constructor; switch ( this.peekToken() ) { case Token.ADD: constructor = AddExpression; break; case Token.SUB: constructor = SubExpression; break; default: return exp; } this.consumeToken(); exp = new constructor(exp, this.mulExpr()); } }; proto.mulExpr = function ( ) { var exp = this.unaryExpr(); for (;;) { var constructor; switch ( this.peekToken() ) { case Token.MUL: constructor = MulExpression; break; case Token.DIV: constructor = DivExpression; break; case Token.MOD: constructor = ModExpression; break; default: return exp; } this.consumeToken(); exp = new constructor(exp, this.unaryExpr()); } }; proto.unaryExpr = function ( ) { var constructor; var needLvalue = null; switch( this.peekToken() ) { case Token.VOID: constructor = VoidExpression; break; case Token.NOT: constructor = NotExpression; break; case Token.BITNOT: constructor = BitNotExpression; break; case Token.TYPEOF: constructor = TypeofExpression; break; case Token.ADD: constructor = PosExpression; break; case Token.SUB: constructor = NegExpression; break; case Token.INC: constructor = PreIncExpression; needLvalue = "msg.bad.incr"; break; case Token.DEC: constructor = PreDecExpression; needLvalue = "msg.bad.decr"; break; case Token.DELPROP: constructor = DeleteExpression; break; default: var exp = this.memberExpr(true); // Don't look across a newline boundary for a postfix incop. switch ( this.peekTokenOrEOL() ) { case Token.INC: if ( !exp.hasLvalue() ) this.reportError("msg.bad.incr"); this.consumeToken(); return new PostIncExpression(exp); case Token.DEC: if ( !exp.hasLvalue() ) this.reportError("msg.bad.decr"); this.consumeToken(); return new PostDecExpression(exp); default: return exp; } } this.consumeToken(); var exp = this.unaryExpr(); if ( needLvalue && !exp.hasLvalue() ) this.reportError(needLvalue); return new constructor(exp); }; proto.argumentList = function ( ) { if ( this.matchToken(Token.RP) ) return []; var args = []; do { args.push( this.assignExpr(false) ); } while ( this.matchToken(Token.COMMA) ); this.mustMatchToken(Token.RP, "msg.no.paren.arg"); return args; }; proto.memberExpr = function ( allowCallSyntax ) { var base; if ( this.matchToken(Token.NEW) ) { var func = this.memberExpr(false); var args = this.matchToken(Token.LP) ? this.argumentList() : []; base = new NewExpression(func, args); } else { base = this.primaryExpr(); } return this.memberExprTail(allowCallSyntax, base); } proto.memberExprTail = function ( allowCallSyntax, base ) { tailLoop: for (;;) { switch ( this.peekToken() ) { case Token.DOTDOT: this.reportError("msg.XML.not.available"); case Token.DOT: { this.consumeToken(); switch ( this.nextToken() ) { case Token.NAME: base = new DotAccessor(base, new Identifier(this.ts.getString())); break; case Token.MUL: this.reportError("msg.XML.not.available"); case Token.XMLATTR: this.reportError("msg.XML.not.available"); default: this.reportError("msg.no.name.after.dot"); } } break; case Token.DOTQUERY: this.reportError("msg.XML.not.available"); case Token.LB: this.consumeToken(); base = new BracketAccessor(base, this.expr(false)); this.mustMatchToken(Token.RB, "msg.no.bracket.index"); break; case Token.LP: if ( !allowCallSyntax ) break tailLoop; this.consumeToken(); base = new CallExpression(base, this.argumentList()); break; default: break tailLoop; } } return base; }; proto.primaryExpr = function ( ) { var exp; var ttFlagged = this.nextFlaggedToken(); var tt = ttFlagged & CLEAR_TI_MASK; switch ( tt ) { case Token.FUNCTION: return this.functionExpr(); case Token.LB: { var elems = []; elemLoop: for (;;) { switch ( this.peekToken() ) { case Token.RB: this.consumeToken(); break elemLoop; case Token.COMMA: while ( this.matchToken(Token.COMMA) ) { elems.push(new Elision()); } break; default: elems.push(this.assignExpr(false)); if ( this.matchToken(Token.COMMA) ) { continue elemLoop; } else if ( this.matchToken(Token.RB) ) { break elemLoop; } else { this.reportError("msg.no.bracket.arg"); } } } return new ArrayInitializer(elems); } case Token.LC: { var pairs = []; commaloop: do { var prop; switch ( this.peekToken() ) { case Token.NAME: this.consumeToken(); prop = new Identifier(this.ts.getString()); break; case Token.STRING: this.consumeToken(); prop = new StringLiteral(this.ts.getString()); break; case Token.NUMBER: this.consumeToken(); prop = new NumberLiteral(this.ts.getString()); break; case Token.RC: // trailing comma is OK. break commaloop; default: this.reportError("msg.bad.prop"); break commaloop; } this.mustMatchToken(Token.COLON, "msg.no.colon.prop"); pairs.push({prop:prop, exp:this.assignExpr(false)}); } while ( this.matchToken(Token.COMMA) ); this.mustMatchToken(Token.RC, "msg.no.brace.prop"); return new ObjectInitializer(pairs); } case Token.LP: var exp = this.expr(false); this.mustMatchToken(Token.RP, "msg.no.paren"); return exp; case Token.XMLATTR: this.reportError("msg.XML.not.available"); case Token.NAME: var name = new Identifier(this.ts.getString()); if ( ttFlagged & TI_CHECK_LABEL ) { if ( this.matchToken(Token.COLON) ) throw new LabelException(name); } return name; case Token.NUMBER: return new NumberLiteral(this.ts.getString()); case Token.STRING: return new StringLiteral(this.ts.getString()); case Token.DIV: case Token.ASSIGN_DIV: // Got / or /= which should be treated as regexp in fact this.ts.readRegExp(tt); return new RegExpLiteral(this.ts.getString()); case Token.NULL: return new NullLiteral(); case Token.THIS: return new ThisExpression(); case Token.TRUE: return new TrueLiteral(); case Token.FALSE: return new FalseLiteral(); case Token.RESERVED: this.reportError("msg.reserved.id"); break; case Token.ERROR: /* the scanner or one of its subroutines reported the error. */ break; case Token.EOF: this.reportError("msg.unexpected.eof"); break; default: this.reportError("msg.syntax"); break; } return null; // should never reach here } return { Parser: Parser }; }(); } } } } }.call(null) ) { this.Concurrent.Thread.Compiler.Parser = Parser; } }).call(null); (function(){ if ( !this.Concurrent || (typeof this.Concurrent != 'object' && typeof this.Concurrent != 'function') ) this.Concurrent = new Object(); if ( !this.Concurrent.Thread || (typeof this.Concurrent.Thread != 'object' && typeof this.Concurrent.Thread != 'function') ) this.Concurrent.Thread = new Object(); if ( !this.Concurrent.Thread.Compiler || (typeof this.Concurrent.Thread.Compiler != 'object' && typeof this.Concurrent.Thread.Compiler != 'function') ) this.Concurrent.Thread.Compiler = new Object(); if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Functional || (typeof this.Data.Functional != 'object' && typeof this.Data.Functional != 'function') ) this.Data.Functional = new Object(); if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Cons || (typeof this.Data.Cons != 'object' && typeof this.Data.Cons != 'function') ) this.Data.Cons = new Object(); if ( this.Concurrent.Thread.Compiler.CsConvert === undefined ) this.Concurrent.Thread.Compiler.CsConvert = undefined; with ( function(){ with ( Data.Functional ) { with ( Data.Cons ) { with ( Concurrent.Thread.Compiler ) { return function () { var VERSION = '0.0.0'; var NAMESPACE; /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Concurrent.Thread code. * * The Initial Developer of the Original Code is * Daisuke Maki. * Portions created by the Initial Developer are Copyright (C) 2006-2007 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ NAMESPACE = 'Concurrent.Thread.Compiler'; var IL = Concurrent.Thread.Compiler.IntermediateLanguage; var Cs = "Concurrent.Thread.Compiler.CsConvert"; var STACK_VAR = "$Concurrent_Thread_stack"; var undefinedExp = new VoidExpression(new NumberLiteral(0)); var emptyLabel = new Identifier(""); function isStackVar ( v ) { return v instanceof Identifier && v.valueOf().match(/^$Concurrent_Thread_stack/); } function Context ( ) { this.stackVars = []; this.contBreak = new IdentifierMap(); this.contContinue = new IdentifierMap(); this.contReturn = "return"; this.contThrow = "throw"; this.scopes = []; } var proto = Context.prototype; proto.getStackVar = function ( n ) { n = Math.floor(n); if ( isNaN(n) || n < 0 ) Kit.codeBug("must be integer greater than zero"); for ( var i=this.stackVars.length; i <= n; i++ ) { this.stackVars[i] = new Identifier(STACK_VAR + i); } return this.stackVars[n]; }; proto.putBreakLabels = function ( labels, target ) { if ( !labels.length ) return this.contBreak; var restore = this.contBreak; this.contBreak = this.contBreak.clone(); for ( var i=0; i < labels.length; i++ ) { this.contBreak.put(labels[i], target); } return restore; }; proto.putBreakAndContinueLabels = function ( labels, breakTarget, continueTarget ) { if ( !labels.length ) { return { contBreak : this.contBreak, contContinue: this.contContinue }; } var restore = { contBreak : this.contBreak, contContinue: this.contContinue }; this.contBreak = this.contBreak.clone(); this.contContinue = this.contContinue.clone(); for ( var i=0; i < labels.length; i++ ) { this.contBreak.put(labels[i], breakTarget); this.contContinue.put(labels[i], continueTarget); } return restore; }; proto.getScopes = function ( ) { return this.scopes.slice(0, this.scopes.length); }; proto.pushScope = function ( /* variable args */ ) { return this.scopes.push.apply(this.scopes, arguments); }; proto.popScope = function ( ) { return this.scopes.pop(); }; proto.makeGotoBlock = function ( arg, target ) { return new IL.GotoBlock(this.getScopes(), nil(), arg, target, this.contThrow); }; function CsConvert ( func ) { var context = new Context(); var last_block = new IL.GotoBlock([], nil(), undefinedExp, "return", "throw"); func.body = CsStatements(func.body, list(last_block), context, 0); func.start = func.body.car; func.vars = func.vars.concat(context.stackVars); return func; } function CsStatements ( stmts, follows, ctxt, sttop ) { if ( stmts.isNil() ) return follows; follows = CsStatements(stmts.cdr, follows, ctxt, sttop); return stmts.car[Cs](follows, ctxt, sttop); } function CsReference ( exp, ctxt, sttop, rest ) { // Expression -> Context -> Int -> (Expression -> ) -> if ( exp instanceof DotAccessor ) { var e = new DotAccessor(ctxt.getStackVar(sttop), exp.prop); var follows = rest(e, sttop+1); return exp.base[Cs](follows, ctxt, sttop); } else if ( exp instanceof BracketAccessor ) { var e = new BracketAccessor(ctxt.getStackVar(sttop), ctxt.getStackVar(sttop+1)); var follows = rest(e, sttop+2); follows = exp.right[Cs](follows, ctxt, sttop+1); return exp.left[Cs](follows, ctxt, sttop); } else if ( exp instanceof Identifier ) { return rest(exp, sttop); } else { var follows = rest(ctxt.getStackVar(sttop), sttop+1); return exp[Cs](follows, ctxt, sttop); } } EmptyStatement.prototype[Cs] = function ( follows, ctxt, sttop ) { return follows; }; Block.prototype[Cs] = function ( follows, ctxt, sttop ) { var restore = ctxt.putBreakLabels(this.labels, follows.car); follows = cons( ctxt.makeGotoBlock(undefinedExp, follows.car), follows); try { return CsStatements(this.body, follows, ctxt, sttop); } finally { ctxt.contBreak = restore; } }; ExpStatement.prototype[Cs] = function ( follows, ctxt, sttop ) { return this.exp[Cs](follows, ctxt, sttop, true); }; IfStatement.prototype[Cs] = function ( follows, ctxt, sttop ) { var next_block = follows.car; follows = cons( ctxt.makeGotoBlock(undefinedExp, next_block), follows); var restore = ctxt.putBreakLabels(this.labels, next_block); try { follows = this.body[Cs](follows, ctxt, sttop); follows.car.prependStatement( new IL.CondStatement(new NotExpression(ctxt.getStackVar(sttop)), next_block) ); return this.cond[Cs](follows, ctxt, sttop); } finally { ctxt.contBreak = restore; } }; IfElseStatement.prototype[Cs] = function ( follows, ctxt, sttop ) { var next_block = follows.car; follows = cons( ctxt.makeGotoBlock(undefinedExp, next_block), follows); var restore = ctxt.putBreakLabels(this.labels, next_block); try { follows = this.tbody[Cs](follows, ctxt, sttop); var true_block = follows.car; follows = cons( ctxt.makeGotoBlock(undefinedExp, next_block), follows); follows = this.fbody[Cs](follows, ctxt, sttop); follows.car.prependStatement( new IL.CondStatement(ctxt.getStackVar(sttop), true_block) ); return this.cond[Cs](follows, ctxt, sttop); } finally { ctxt.contBreak = restore; } }; DoWhileStatement.prototype[Cs] = function ( follows, ctxt, sttop ) { var next_block = follows.car; var first_block = ctxt.makeGotoBlock(undefinedExp, null); follows = cons( ctxt.makeGotoBlock(undefinedExp, next_block), follows ); if ( this.cond.containsFunctionCall() ) { follows.car.prependStatement( new IL.CondStatement(ctxt.getStackVar(sttop), first_block) ); follows = this.cond[Cs](follows, ctxt, sttop); } else { follows.car.prependStatement( new IL.CondStatement(this.cond, first_block) ); } var continue_block = follows.car; follows = cons( ctxt.makeGotoBlock(undefinedExp, follows.car), follows ); var restore = ctxt.putBreakAndContinueLabels(this.labels.concat(emptyLabel), next_block, continue_block); try { follows = this.body[Cs](follows, ctxt, sttop); } finally { ctxt.contBreak = restore.contBreak; ctxt.contContinue = restore.contContinue; } first_block.target = follows.car; return cons( ctxt.makeGotoBlock(undefinedExp, first_block), cons(first_block, follows) ); }; WhileStatement.prototype[Cs] = function ( follows, ctxt, sttop ) { var next_block = follows.car; var first_block = ctxt.makeGotoBlock(undefinedExp, null); follows = cons( ctxt.makeGotoBlock(undefinedExp, first_block), follows ); var restore = ctxt.putBreakAndContinueLabels(this.labels.concat(emptyLabel), next_block, first_block); try { follows = this.body[Cs](follows, ctxt, sttop); } finally { ctxt.contBreak = restore.contBreak; ctxt.contContinue = restore.contContinue; } if ( this.cond.containsFunctionCall() ) { follows.car.prependStatement( new IL.CondStatement(new NotExpression(ctxt.getStackVar(sttop)), next_block) ); follows = this.cond[Cs](follows, ctxt, sttop); } else { follows.car.prependStatement( new IL.CondStatement(new NotExpression(this.cond), next_block) ); } first_block.target = follows.car; return cons( ctxt.makeGotoBlock(undefinedExp, first_block), cons(first_block, follows) ); }; ForStatement.prototype[Cs] = function ( follows, ctxt, sttop ) { var next_block = follows.car; var last_block = ctxt.makeGotoBlock(undefinedExp, null); follows = cons(last_block, follows); if ( this.incr ) follows = this.incr[Cs](follows, ctxt, sttop, true); var incr_block = follows.car; follows = cons( ctxt.makeGotoBlock(undefinedExp, follows.car), follows ); var restore = ctxt.putBreakAndContinueLabels(this.labels.concat(emptyLabel), next_block, incr_block); try { follows = this.body[Cs](follows, ctxt, sttop); } finally { ctxt.contBreak = restore.contBreak; ctxt.contContinue = restore.contContinue; } if ( this.cond ) { if ( this.cond.containsFunctionCall() ) { follows.car.prependStatement( new IL.CondStatement(new NotExpression(ctxt.getStackVar(sttop)), next_block) ); follows = this.cond[Cs](follows, ctxt, sttop); } else { follows.car.prependStatement( new IL.CondStatement(new NotExpression(this.cond), next_block) ); } } last_block.target = follows.car; follows = cons( ctxt.makeGotoBlock(undefinedExp, follows.car), follows ); if ( this.init ) { follows = this.init[Cs](follows, ctxt, sttop, true); } return follows; }; ForInStatement.prototype[Cs] = function ( follows, ctxt, sttop ) { if ( !this.lhs.hasLvalue() ) Kit.codeBug('for-in requires lvalue on the left hand side of "in": ' + this); var next_block = follows.car; var loop_block = ctxt.makeGotoBlock(undefinedExp, null); follows = cons( ctxt.makeGotoBlock(undefinedExp, loop_block), follows ); var restore = ctxt.putBreakAndContinueLabels(this.labels.concat(emptyLabel), next_block, loop_block); try { follows = this.body[Cs](follows, ctxt, sttop+2); } finally { ctxt.contBreak = restore.contBreak; ctxt.contContinue = restore.contContinue; } if ( this.lhs.containsFunctionCall() ) { follows = CsReference(this.lhs, ctxt, sttop+2, function( exp ){ follows.car.prependStatement( make_assign( exp, new BracketAccessor( ctxt.getStackVar(sttop), new PostIncExpression(ctxt.getStackVar(sttop+1)) ) ) ); return follows; }); } else { follows.car.prependStatement( make_assign( this.lhs, new BracketAccessor( ctxt.getStackVar(sttop), new PostIncExpression(ctxt.getStackVar(sttop+1)) ) ) ); } follows.car.prependStatement( new IL.CondStatement( new GreaterEqualExpression( ctxt.getStackVar(sttop+1), new DotAccessor(ctxt.getStackVar(sttop), new Identifier("length")) ), next_block ) ); loop_block.target = follows.car; follows = cons( loop_block, follows ); follows = cons( ctxt.makeGotoBlock(undefinedExp, loop_block), follows ); follows.car.prependStatement( make_assign(ctxt.getStackVar(sttop+1), new NumberLiteral(0)) ); if ( this.exp.containsFunctionCall() ) { follows.car.prependStatement( new IL.EnumStatement(ctxt.getStackVar(sttop), ctxt.getStackVar(sttop)) ); follows = this.exp[Cs](follows, ctxt, sttop); } else { follows.car.prependStatement( new IL.EnumStatement(this.exp, ctxt.getStackVar(sttop)) ); } return follows; }; ContinueStatement.prototype[Cs] = function ( follows, ctxt, sttop ) { return cons( ctxt.makeGotoBlock( undefinedExp, ctxt.contContinue.get( this.target ? this.target : emptyLabel ) ), follows ); }; BreakStatement.prototype[Cs] = function ( follows, ctxt, sttop ) { var restore = ctxt.putBreakLabels(this.labels, follows.car); try { return cons( ctxt.makeGotoBlock( undefinedExp, ctxt.contBreak.get( this.target ? this.target : emptyLabel ) ), follows ); } finally { ctxt.contBreak = restore; } }; ReturnStatement.prototype[Cs] = function ( follows, ctxt, sttop ) { if ( this.exp ) { if ( this.exp.containsFunctionCall() ) { follows = cons( ctxt.makeGotoBlock(ctxt.getStackVar(sttop), ctxt.contReturn), follows ); return this.exp[Cs](follows, ctxt, sttop); } else { return cons( ctxt.makeGotoBlock(this.exp, ctxt.contReturn), follows ); } } else { return cons( ctxt.makeGotoBlock(undefinedExp, ctxt.contReturn), follows ); } }; WithStatement.prototype[Cs] = function ( follows, ctxt, sttop ) { var next_block = follows.car; var restore = ctxt.putBreakLabels(this.labels, next_block); try { ctxt.pushScope(ctxt.getStackVar(sttop)); try { follows = cons( ctxt.makeGotoBlock(undefinedExp, next_block), follows ); follows = this.body[Cs](follows, ctxt, sttop+1); } finally { ctxt.popScope(); } follows = cons( ctxt.makeGotoBlock(undefinedExp, follows.car), follows ); return this.exp[Cs](follows, ctxt, sttop); } finally { ctxt.contBreak = restore; } }; SwitchStatement.prototype[Cs] = function ( follows, ctxt, sttop ) { var next_block = follows.car; var restore = ctxt.putBreakLabels(this.labels.concat(emptyLabel) , next_block); try { var default_target = next_block; var cond_and_target = this.clauses.reverse().map(function( clause ){ follows = cons( ctxt.makeGotoBlock(undefinedExp, follows.car), follows ); follows = CsStatements(clause.body, follows, ctxt, sttop); var clause_block = follows.car; if ( clause instanceof DefaultClause ) { default_target = clause_block; ignore(); } else { return {cond:clause.exp, target:clause_block}; } }); follows = cons( ctxt.makeGotoBlock(undefinedExp, default_target), follows ); cond_and_target.forEach(function( it ){ if ( it.cond.containsFunctionCall() ) { follows.car.prependStatement( new IL.CondStatement( new StrictEqualExpression(ctxt.getStackVar(sttop), ctxt.getStackVar(sttop+1)), it.target ) ); follows = it.cond[Cs](follows, ctxt, sttop+1); } else { follows.car.prependStatement( new IL.CondStatement( new StrictEqualExpression(ctxt.getStackVar(sttop), it.cond), it.target ) ); } }); return this.exp[Cs](follows, ctxt,sttop); } finally { ctxt.contBreak = restore; } }; ThrowStatement.prototype[Cs] = function ( follows, ctxt, sttop ) { if ( this.exp.containsFunctionCall() ) { follows = cons( ctxt.makeGotoBlock(ctxt.getStackVar(sttop), ctxt.contThrow), follows ); return this.exp[Cs](follows, ctxt, sttop); } else { return cons( ctxt.makeGotoBlock(this.exp, ctxt.contThrow), follows ); } }; TryCatchStatement.prototype[Cs] = function ( follows, ctxt, sttop ) { var next_block = follows.car; follows = cons( ctxt.makeGotoBlock(undefinedExp, next_block), follows ); var restore = ctxt.putBreakLabels(this.labels, next_block); try { follows = this.catchBlock[Cs](follows, ctxt, sttop); follows.car.prependStatement( new IL.RecvStatement(this.variable) ); var storeContThrow = ctxt.contThrow; ctxt.contThrow = follows.car; try { follows = cons( ctxt.makeGotoBlock(undefinedExp, next_block), follows ); return this.tryBlock[Cs](follows, ctxt, sttop); } finally { ctxt.contThrow = storeContThrow; } } finally { ctxt.contBreak = restore; } }; TryFinallyStatement.prototype[Cs] = function ( follows, ctxt, sttop ) { var next_block = follows.car; follows = cons( ctxt.makeGotoBlock(undefinedExp, next_block), follows ); var restoreBreak = ctxt.putBreakLabels(this.labels, next_block); try { var self = this; var contBreak = new IdentifierMap(); ctxt.contBreak.keys().forEach(function( label ){ follows = cons( ctxt.makeGotoBlock(undefinedExp, ctxt.contBreak.get(label)), follows ); follows = self.finallyBlock[Cs](follows, ctxt, sttop); contBreak.put(label, follows.car); }); var contContinue = new IdentifierMap(); ctxt.contContinue.keys().forEach(function( label ){ follows = cons( ctxt.makeGotoBlock(undefinedExp, ctxt.contContinue.get(label)), follows ); follows = self.finallyBlock[Cs](follows, ctxt, sttop); contContinue.put(label, follows.car); }); follows = cons( ctxt.makeGotoBlock(ctxt.getStackVar(sttop), ctxt.contReturn), follows ); follows = this.finallyBlock[Cs](follows, ctxt, sttop+1); follows.car.prependStatement( new IL.RecvStatement(ctxt.getStackVar(sttop)) ); var contReturn = follows.car; follows = cons( ctxt.makeGotoBlock(ctxt.getStackVar(sttop), ctxt.contThrow), follows ); follows = this.finallyBlock[Cs](follows, ctxt, sttop+1); follows.car.prependStatement( new IL.RecvStatement(ctxt.getStackVar(sttop)) ); var contThrow = follows.car; follows = cons( ctxt.makeGotoBlock(undefinedExp, next_block), follows ); follows = this.finallyBlock[Cs](follows, ctxt, sttop); var restoreContinue = ctxt.contContinue; var restoreReturn = ctxt.contReturn; var restoreThrow = ctxt.contThrow; ctxt.contBreak = contBreak; ctxt.contContinue = contContinue; ctxt.contReturn = contReturn; ctxt.contThrow = contThrow; try { return this.tryBlock[Cs](follows, ctxt, sttop); } finally { ctxt.contContinue = restoreContinue; ctxt.contReturn = restoreReturn; ctxt.contThrow = restoreThrow; } } finally { ctxt.contBreak = restoreBreak; } }; function make_assign ( left, right ) { return new IL.ExpStatement( new SimpleAssignExpression(left, right) ); } function prepend_exp ( exp, follows, ctxt, sttop, is_void ) { follows.car.prependStatement( is_void ? new IL.ExpStatement(exp) : make_assign(ctxt.getStackVar(sttop), exp) ); return follows; } Expression.prototype[Cs] = function ( follows, ctxt, sttop, is_void ) { return prepend_exp(this, follows, ctxt, sttop, is_void); }; ArrayInitializer.prototype[Cs] = function ( follows, ctxt, sttop, is_void ) { for ( var asis_from=this.elems.length-1; asis_from >= 0; asis_from-- ) { if ( this.elems[asis_from].containsFunctionCall() ) break; } asis_from++; var elems = []; for ( var i=0; i < asis_from; i++ ) { elems[i] = ctxt.getStackVar(sttop+i); } for ( ; i < this.elems.length; i++ ) { elems[i] = this.elems[i]; } follows = prepend_exp(new ArrayInitializer(elems), follows, ctxt, sttop, is_void); for ( var i=asis_from-1; i >= 0; i-- ) { follows = this.elems[i][Cs](follows, ctxt, sttop+i); } return follows; }; ObjectInitializer.prototype[Cs] = function ( follows, ctxt, sttop, is_void ) { for ( var asis_from=this.pairs.length-1; asis_from >= 0; asis_from-- ) { if ( this.pairs[asis_from].exp.containsFunctionCall() ) break; } asis_from++; var pairs = []; for ( var i=0; i < asis_from; i++ ) { pairs[i] = {prop:this.pairs[i].prop, exp:ctxt.getStackVar(sttop+i)}; } for ( ; i < this.pairs.length; i++ ) { pairs[i] = this.pairs[i]; } follows = prepend_exp(new ObjectInitializer(pairs), follows, ctxt, sttop, is_void); for ( var i=asis_from-1; i >= 0; i-- ) { follows = this.pairs[i].exp[Cs](follows, ctxt, sttop+i); } return follows; }; UnaryExpression.prototype[Cs] = function ( follows, ctxt, sttop, is_void ) { if ( this.exp.containsFunctionCall() ) { follows = prepend_exp(new this.constructor(ctxt.getStackVar(sttop)), follows, ctxt, sttop, is_void); return this.exp[Cs](follows, ctxt, sttop); } else { return Expression.prototype[Cs].apply(this, arguments); } }; BinaryExpression.prototype[Cs] = function ( follows, ctxt, sttop, is_void ) { if ( this.right.containsFunctionCall() ) { follows = prepend_exp(new this.constructor(ctxt.getStackVar(sttop), ctxt.getStackVar(sttop+1)), follows, ctxt, sttop, is_void); follows = this.right[Cs](follows, ctxt, sttop+1); return this.left[Cs](follows, ctxt, sttop); } else if ( this.left.containsFunctionCall() ) { follows = prepend_exp(new this.constructor(ctxt.getStackVar(sttop), this.right), follows, ctxt, sttop, is_void); return this.left[Cs](follows, ctxt, sttop); } else { return Expression.prototype[Cs].apply(this, arguments); } }; DotAccessor.prototype[Cs] = function ( follows, ctxt, sttop, is_void ) { if ( this.base.containsFunctionCall() ) { follows = prepend_exp(new DotAccessor(ctxt.getStackVar(sttop), this.prop), follows, ctxt, sttop, is_void); return this.base[Cs](follows, ctxt, sttop); } else { return Expression.prototype[Cs].apply(this, arguments); } }; CallExpression.prototype[Cs] = function ( follows, ctxt, sttop, is_void ) { var self = this; return CsReference(this.func, ctxt, sttop, function ( func, sttop2 ) { for ( var asis_from=self.args.length-1; asis_from >= 0; asis_from-- ) { if ( self.args[asis_from].containsFunctionCall() ) break; } asis_from++; var args = []; for ( var i=0; i < asis_from; i++ ) { args[i] = ctxt.getStackVar(sttop2+i); } for ( ; i < self.args.length; i++ ) { args[i] = self.args[i]; } if ( !is_void ) follows.car.prependStatement( new IL.RecvStatement(ctxt.getStackVar(sttop)) ); follows = cons( new IL.CallBlock( ctxt.getScopes(), nil(), func instanceof DotAccessor ? func.base : func instanceof BracketAccessor ? func.left : new NullLiteral(), func, args, follows.car, ctxt.contThrow ), follows ); for ( var i=asis_from-1; i >= 0; i-- ) { follows = self.args[i][Cs](follows, ctxt, sttop2+i); } return follows; }); }; NewExpression.prototype[Cs] = function ( follows, ctxt, sttop, is_void ) { for ( var asis_from=this.args.length-1; asis_from >= 0; asis_from-- ) { if ( this.args[asis_from].containsFunctionCall() ) break; } asis_from++; var args = []; for ( var i=0; i < asis_from; i++ ) { args[i] = ctxt.getStackVar(sttop+1+i); } for ( ; i < this.args.length; i++ ) { args[i] = this.args[i]; } if ( !is_void ) follows.car.prependStatement( new IL.RecvStatement(ctxt.getStackVar(sttop)) ); follows = cons( new IL.NewBlock( ctxt.getScopes(), nil(), ctxt.getStackVar(sttop), args, follows.car, ctxt.contThrow ), follows ); for ( var i=asis_from-1; i >= 0; i-- ) { follows = this.args[i][Cs](follows, ctxt, sttop+1+i); } this.func[Cs](follows, ctxt, sttop); return follows; }; AssignExpression.prototype[Cs] = function ( follows, ctxt, sttop, is_void ) { var self = this; if ( this.right.containsFunctionCall() ) { return CsReference(this.left, ctxt, sttop, function ( left, sttop2 ) { follows = prepend_exp(new self.constructor(left, ctxt.getStackVar(sttop2)), follows, ctxt, sttop, is_void); return self.right[Cs](follows, ctxt, sttop2); }); } else if ( this.left.containsFunctionCall() ) { return CsReference(this.left, ctxt, sttop, function ( left, sttop2 ) { return prepend_exp(new self.constructor(left, self.right), follows, ctxt, sttop, is_void); }); } else { return Expression.prototype[Cs].apply(this, arguments); } }; AndExpression.prototype[Cs] = function ( follows, ctxt, sttop ) { if ( this.right.containsFunctionCall() ) { var next_block = follows.car; follows = cons( ctxt.makeGotoBlock(undefinedExp, next_block), follows ); follows = this.right[Cs](follows, ctxt, sttop); follows.car.prependStatement( new IL.CondStatement(new NotExpression(ctxt.getStackVar(sttop)), next_block) ); return this.left[Cs](follows, ctxt, sttop); } else if ( this.left.containsFunctionCall() ) { follows.car.prependStatement( make_assign(ctxt.getStackVar(sttop), new AndExpression(ctxt.getStackVar(sttop), this.right)) ); return this.left[Cs](follows, ctxt, sttop); } else { return Expression.prototype[Cs].apply(this, arguments); } }; OrExpression.prototype[Cs] = function ( follows, ctxt, sttop ) { if ( this.right.containsFunctionCall() ) { var next_block = follows.car; follows = cons( ctxt.makeGotoBlock(undefinedExp, next_block), follows ); follows = this.right[Cs](follows, ctxt, sttop); follows.car.prependStatement( new IL.CondStatement(ctxt.getStackVar(sttop), next_block) ); return this.left[Cs](follows, ctxt, sttop); } else if ( this.left.containsFunctionCall() ) { follows.car.prependStatement( make_assign(ctxt.getStackVar(sttop), new OrExpression(ctxt.getStackVar(sttop), this.right)) ); return this.left[Cs](follows, ctxt, sttop); } else { return Expression.prototype[Cs].apply(this, arguments); } }; ConditionalExpression.prototype[Cs] = function ( follows, ctxt, sttop ) { if ( this.texp.containsFunctionCall() || this.fexp.containsFunctionCall() ) { var next_block = follows.car; follows = cons( ctxt.makeGotoBlock(undefinedExp, next_block), follows ); follows = this.texp[Cs](follows, ctxt, sttop); var true_block = follows.car; follows = cons( ctxt.makeGotoBlock(undefinedExp, next_block), follows ); follows = this.fexp[Cs](follows, ctxt, sttop); follows.car.prependStatement(new IL.CondStatement(ctxt.getStackVar(sttop), true_block)); return this.cond[Cs](follows, ctxt, sttop); } else if ( this.cond.containsFunctionCall() ) { follows.car.prependStatement( make_assign(ctxt.getStackVar(sttop), new ConditionalExpression(ctxt.getStackVar(sttop), this.texp, this.fexp)) ); return this.cond[Cs](follows, ctxt, sttop); } else { return Expression.prototype[Cs].apply(this, arguments); } }; return { CsConvert: CsConvert }; }(); } } } }.call(null) ) { this.Concurrent.Thread.Compiler.CsConvert = CsConvert; } }).call(null); (function(){ if ( !this.Concurrent || (typeof this.Concurrent != 'object' && typeof this.Concurrent != 'function') ) this.Concurrent = new Object(); if ( !this.Concurrent.Thread || (typeof this.Concurrent.Thread != 'object' && typeof this.Concurrent.Thread != 'function') ) this.Concurrent.Thread = new Object(); if ( !this.Concurrent.Thread.Compiler || (typeof this.Concurrent.Thread.Compiler != 'object' && typeof this.Concurrent.Thread.Compiler != 'function') ) this.Concurrent.Thread.Compiler = new Object(); if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Cons || (typeof this.Data.Cons != 'object' && typeof this.Data.Cons != 'function') ) this.Data.Cons = new Object(); if ( !this.Data.Cons.Util || (typeof this.Data.Cons.Util != 'object' && typeof this.Data.Cons.Util != 'function') ) this.Data.Cons.Util = new Object(); if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Cons || (typeof this.Data.Cons != 'object' && typeof this.Data.Cons != 'function') ) this.Data.Cons = new Object(); if ( this.Concurrent.Thread.Compiler.CvConvert === undefined ) this.Concurrent.Thread.Compiler.CvConvert = undefined; with ( function(){ with ( Data.Cons.Util ) { with ( Data.Cons ) { with ( Concurrent.Thread.Compiler ) { return function () { var VERSION = '0.0.0'; var NAMESPACE; /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Concurrent.Thread code. * * The Initial Developer of the Original Code is * Daisuke Maki. * Portions created by the Initial Developer are Copyright (C) 2006-2007 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ NAMESPACE = 'Concurrent.Thread.Compiler'; var IL = IntermediateLanguage; var Cv = "$Concurrent_Thread_Compiler_CvConvert"; function CvConvert ( func ) { var vars = new IdentifierSet() function add_vars ( /* variable arguments */ ) { return vars.add.apply(vars, arguments); } var decls = cons(null, nil()); var add_decls = adder(decls); for ( var c=func.body; !c.isNil(); c=c.cdr ) { c.car = c.car[Cv](add_vars, add_decls); } return new IL.Function(func.name, func.params, vars.toArray(), concat(decls, func.body).cdr); } Statement.prototype[Cv] = function ( add_vars, add_decls ) { return this; }; Block.prototype[Cv] = function ( add_vars, add_decls ) { for ( var c=this.body; !c.isNil(); c=c.cdr ) { c.car = c.car[Cv](add_vars, add_decls); } return this; }; VarStatement.prototype[Cv] = function ( add_vars, add_decls ) { var assigns = []; for ( var i=0; i < this.decls.length; i++ ) { add_vars(this.decls[i].id); if ( this.decls[i].exp ) { assigns.push( new SimpleAssignExpression(this.decls[i].id, this.decls[i].exp) ); } } if ( !assigns.length ) { return new EmptyStatement([], this.lineno, this.source); } else { var exp = assigns[0]; for ( var i=1; i < assigns.length; i++ ) { exp = new CommaExpression(exp, assigns[i]); } return new ExpStatement([], exp, this.lineno, this.source); } }; IfStatement.prototype[Cv] = function ( add_vars, add_decls ) { this.body = this.body[Cv](add_vars, add_decls); return this; }; IfElseStatement.prototype[Cv] = function ( add_vars, add_decls ) { this.tbody = this.tbody[Cv](add_vars, add_decls); this.fbody = this.fbody[Cv](add_vars, add_decls); return this; }; DoWhileStatement.prototype[Cv] = IfStatement.prototype[Cv]; WhileStatement.prototype[Cv] = IfStatement.prototype[Cv]; ForStatement.prototype[Cv] = IfStatement.prototype[Cv]; ForVarStatement.prototype[Cv] = function ( add_vars, add_decls ) { var init = (new VarStatement([], this.decls))[Cv](add_vars, add_decls); if ( init instanceof EmptyStatement ) { init = null; } else { init = init.exp; } return new ForStatement(this.labels, init, this.cond, this.incr, this.body[Cv](add_vars, add_decls), this.lineno, this.source); }; ForInStatement.prototype[Cv] = IfStatement.prototype[Cv]; ForInVarStatement.prototype[Cv] = function ( add_vars, add_decls ) { add_vars(this.decl.id); var for_in = new ForInStatement(this.labels, this.decl.id, this.exp, this.body[Cv](add_vars, add_decls), this.lineno, this.source); if ( this.decl.exp ) { return new Block([], list( new ExpStatement([], new SimpleAssignExpression(this.decl.id, this.decl.exp), this.lineno, this.source), for_in ), this.lineno, this.source); } else { return for_in; } }; ForEachStatement.prototype[Cv] = IfStatement.prototype[Cv]; ForEachVarStatement.prototype[Cv] = ForInVarStatement.prototype[Cv]; WithStatement.prototype[Cv] = IfStatement.prototype[Cv]; SwitchStatement.prototype[Cv] = function ( add_vars, add_decls ) { for ( var c=this.clauses; !c.isNil(); c=c.cdr ) { c.car = c.car[Cv](add_vars, add_decls); } return this; }; CaseClause.prototype[Cv] = Block.prototype[Cv]; DefaultClause.prototype[Cv] = Block.prototype[Cv]; TryCatchStatement.prototype[Cv] = function ( add_vars, add_decls ) { add_vars(this.variable); this.tryBlock = this.tryBlock[Cv](add_vars, add_decls); this.catchBlock = this.catchBlock[Cv](add_vars, add_decls); return this; }; TryFinallyStatement.prototype[Cv] = function ( add_vars, add_decls ) { this.tryBlock = this.tryBlock[Cv](add_vars, add_decls); this.finallyBlock = this.finallyBlock[Cv](add_vars, add_decls); return this; }; TryCatchFinallyStatement.prototype[Cv] = function ( add_vars, add_decls ) { add_vars(this.variable); this.tryBlock = this.tryBlock[Cv](add_vars, add_decls); this.catchBlock = this.catchBlock[Cv](add_vars, add_decls); this.finallyBlock = this.finallyBlock[Cv](add_vars, add_decls); return this; }; FunctionDeclaration.prototype[Cv] = function ( add_vars, add_decls ) { add_vars(this.name); add_decls( new ExpStatement( [], new SimpleAssignExpression( this.name, new FunctionExpression(null, this.params, this.body) ), this.lineno, this.source )); return new EmptyStatement([]); }; return { CvConvert: CvConvert }; }(); } } } }.call(null) ) { this.Concurrent.Thread.Compiler.CvConvert = CvConvert; } }).call(null); (function(){ if ( !this.Concurrent || (typeof this.Concurrent != 'object' && typeof this.Concurrent != 'function') ) this.Concurrent = new Object(); if ( !this.Concurrent.Thread || (typeof this.Concurrent.Thread != 'object' && typeof this.Concurrent.Thread != 'function') ) this.Concurrent.Thread = new Object(); if ( !this.Concurrent.Thread.Compiler || (typeof this.Concurrent.Thread.Compiler != 'object' && typeof this.Concurrent.Thread.Compiler != 'function') ) this.Concurrent.Thread.Compiler = new Object(); if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Cons || (typeof this.Data.Cons != 'object' && typeof this.Data.Cons != 'function') ) this.Data.Cons = new Object(); if ( !this.Concurrent || (typeof this.Concurrent != 'object' && typeof this.Concurrent != 'function') ) this.Concurrent = new Object(); if ( !this.Concurrent.Thread || (typeof this.Concurrent.Thread != 'object' && typeof this.Concurrent.Thread != 'function') ) this.Concurrent.Thread = new Object(); if ( this.Concurrent.Thread.compile === undefined ) this.Concurrent.Thread.compile = undefined; if ( this.Concurrent.Thread.CACHE_LIMIT === undefined ) this.Concurrent.Thread.CACHE_LIMIT = undefined; if ( this.Concurrent.Thread.prepare === undefined ) this.Concurrent.Thread.prepare = undefined; if ( this.Concurrent.Thread.prepareTree === undefined ) this.Concurrent.Thread.prepareTree = undefined; with ( function(){ with ( Data.Cons ) { with ( Concurrent.Thread.Compiler ) { with ( Concurrent.Thread ) { return function () { var VERSION = '0.0.0'; var NAMESPACE; /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Concurrent.Thread code. * * The Initial Developer of the Original Code is * Daisuke Maki. * Portions created by the Initial Developer are Copyright (C) 2006-2007 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ NAMESPACE = 'Concurrent.Thread'; var IL = Concurrent.Thread.Compiler.IntermediateLanguage; var PREFIX = "$Concurrent_Thread_"; var var_self = new Identifier(PREFIX + "self"); var var_compiled = new Identifier(PREFIX + "compiled"); function compile ( f ) { return eval(prepare(f)); } CACHE_LIMIT = 50; var prepare_cache = {}; var cache_history = []; function prepare ( f ) { if ( typeof f != "function" ) throw new TypeError("argument must be a function"); f = f.toString(); var c = prepare_cache[f]; if ( c ) return c; c = prepareTree(parseFunction(f)).toString(); while ( cache_history.length >= CACHE_LIMIT && cache_history.length > 0 ) { // avoid endless loop delete prepare_cache[cache_history.shift()]; } if ( CACHE_LIMIT >= 1 ) { prepare_cache[f] = c; cache_history.push(f); } return c; } function parseFunction ( f ) { var stmts = (new Parser()).parse("(" + f + ");"); if ( !(stmts.car instanceof ExpStatement) ) throw new Error("not exp-statement!"); if ( !(stmts.car.exp instanceof FunctionExpression) ) throw new Error("not function-expression!"); return stmts.car.exp; } function prepareTree ( f ) { if ( !(f instanceof FunctionExpression) ) Kit.codeBug("not FunctionalExpression"); var name = f.name; f.name = null; var g = CssConvert(f); g = CvConvert(g); g = CsConvert(g); g = CuConvert(g); g = CfConvert(g); g = CzConvert(g); return new CallExpression( new FunctionExpression(null, [], list( new VarStatement([], [{id:var_self, exp:f}]), name ? new VarStatement([], [{id:name, exp:var_self}]) : new EmptyStatement([]), new ExpStatement([], new SimpleAssignExpression(new DotAccessor(var_self, var_compiled), g)), new ReturnStatement([], var_self) )), [] ); /* Constructs the following structure: "(function(){", " var $Concurrent_Thread_self = ", f, ";", name ? "var " + name + " = " + "$Concurrent_Thread_self;" : "", " $Concurrent_Thread_self.$Concurrent_Thread_compiled = ", func, ";", " return $Concurrent_Thread_self;", "})()" */ } return { compile: compile, prepareTree: prepareTree, prepare: prepare }; }(); } } } }.call(null) ) { this.Concurrent.Thread.compile = compile; this.Concurrent.Thread.prepareTree = prepareTree; this.Concurrent.Thread.prepare = prepare; } }).call(null); (function(){ if ( !this.Concurrent || (typeof this.Concurrent != 'object' && typeof this.Concurrent != 'function') ) this.Concurrent = new Object(); if ( !this.Concurrent.Thread || (typeof this.Concurrent.Thread != 'object' && typeof this.Concurrent.Thread != 'function') ) this.Concurrent.Thread = new Object(); if ( !this.Concurrent.Thread.Compiler || (typeof this.Concurrent.Thread.Compiler != 'object' && typeof this.Concurrent.Thread.Compiler != 'function') ) this.Concurrent.Thread.Compiler = new Object(); with ( function(){ with ( Concurrent.Thread.Compiler ) { return function () { var VERSION ; var NAMESPACE; NAMESPACE = 'Concurrent.Thread.Compiler'; WebBrowser.ScriptExecuter.register("text/x-script.multithreaded-js", function ( src ){ eval(compile(src)).async(null); }); function compile ( src ) { var prog = (new Parser).parse(src); prog = new FunctionExpression(null, [], prog); prog = CssConvert(prog); prog = CvConvert(prog); prog = CsConvert(prog); prog = CfConvert(prog); prog.vars.forEach(function( it ){ // Incredibly, window does not have hasOwnProperty method on IE!! if ( !Object.prototype.hasOwnProperty.call(window, it) ) window[it] = undefined; }); prog.vars = []; prog = CzConvert(prog); return [ "1, function(){", " var $Concurrent_Thread_self = function(){};", " $Concurrent_Thread_self.$Concurrent_Thread_compiled = ", prog, ";", " return $Concurrent_Thread_self;", "}()" ].join(""); } return { }; }(); } }.call(null) ) { } }).call(null); (function(){ if ( !this.Concurrent || (typeof this.Concurrent != 'object' && typeof this.Concurrent != 'function') ) this.Concurrent = new Object(); if ( !this.Concurrent.Thread || (typeof this.Concurrent.Thread != 'object' && typeof this.Concurrent.Thread != 'function') ) this.Concurrent.Thread = new Object(); if ( !this.Concurrent.Thread.Continuation || (typeof this.Concurrent.Thread.Continuation != 'object' && typeof this.Concurrent.Thread.Continuation != 'function') ) this.Concurrent.Thread.Continuation = new Object(); if ( !this.Concurrent || (typeof this.Concurrent != 'object' && typeof this.Concurrent != 'function') ) this.Concurrent = new Object(); if ( !this.Concurrent || (typeof this.Concurrent != 'object' && typeof this.Concurrent != 'function') ) this.Concurrent = new Object(); if ( !this.Concurrent.Thread || (typeof this.Concurrent.Thread != 'object' && typeof this.Concurrent.Thread != 'function') ) this.Concurrent.Thread = new Object(); if ( this.Concurrent.Thread.Generator === undefined ) this.Concurrent.Thread.Generator = undefined; with ( function(){ with ( Concurrent.Thread.Continuation ) { with ( Concurrent ) { with ( Concurrent.Thread ) { return function () { var VERSION = '0.0.0'; var NAMESPACE; /* ***** BEGIN LICENSE BLOCK ***** * Version: MPL 1.1/GPL 2.0/LGPL 2.1 * * The contents of this file are subject to the Mozilla Public License Version * 1.1 (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * http://www.mozilla.org/MPL/ * * Software distributed under the License is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License * for the specific language governing rights and limitations under the * License. * * The Original Code is Concurrent.Thread.Generator module. * * The Initial Developer of the Original Code is * Daisuke Maki. * Portions created by the Initial Developer are Copyright (C) 2008 * the Initial Developer. All Rights Reserved. * * Contributor(s): * * Alternatively, the contents of this file may be used under the terms of * either the GNU General Public License Version 2 or later (the "GPL"), or * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), * in which case the provisions of the GPL or the LGPL are applicable instead * of those above. If you wish to allow use of your version of this file only * under the terms of either the GPL or the LGPL, and not to allow others to * use your version of this file under the terms of the MPL, indicate your * decision by deleting the provisions above and replace them with the notice * and other provisions required by the GPL or the LGPL. If you do not delete * the provisions above, a recipient may use your version of this file under * the terms of any one of the MPL, the GPL or the LGPL. * * ***** END LICENSE BLOCK ***** */ NAMESPACE = 'Concurrent.Thread'; function Generator ( f ) { if ( typeof f != "function" ) throw new TypeError("not a function"); if ( typeof f.$Concurrent_Thread_compiled != "function" ) f = Thread.compile(f); this._mutex = new Mutex(); this._cont_caller = null; this._buf = null; this._got = false; var self = this; var generate = eval(Thread.prepare(function( x ){ self._buf = x; self._got = true; try { self._cont_iter = currentContinuation(); self._cont_caller(); } catch ( e ) { self._cont_iter = null; if ( e instanceof ContinuationCalledException ) { return; // resume iteration } else { throw e; } } // execution never reaches here })); this._cont_iter = eval(Thread.prepare(function(){ f(generate); self._got = false; self._cont_iter = null; // null means that the iteration function has finished self._cont_caller(); })); } var proto = Generator.prototype; proto.hasNext = function ( ) { // This definition is called when generator is used in non-converted context. // The implementation is quite tricky and strongly dependent on the internal // implementation of Concurrent.Thread. if ( !this._mutex.isAcquirable() ) this._mutex.acquire(); // must throw an error if ( this._got ) return true; if ( !this._cont_iter ) return false; var is_called = false; this._cont_caller = eval(Thread.prepare(function(){ is_called = true; Thread.stop(); })); var triplet = Thread.create(this._cont_iter)._triplet; triplet.timeout = void 0; while ( 1 ) { while ( triplet.timeout === void 0 ) { try { triplet = triplet.continuation.procedure.call( triplet.continuation.this_val, triplet.ret_val ); } catch ( e ) { if ( e instanceof NoContinuationException ) { return this._got; } else if ( e instanceof NoExceptionHandlerException ) { throw e.thrown; } else { triplet.continuation = triplet.continuation.exception; triplet.ret_val = e; } } } if ( is_called ) { break; } else { triplet.continuation = triplet.continuation.exception; triplet.ret_val = new Error("can't suspend in non-converted context"); } } this._cont_caller = null; return this._got; }; proto.hasNext.$Concurrent_Thread_compiled = eval(Thread.prepare( function ( ) { this._mutex.acquire(); try { if ( this._got ) return true; if ( !this._cont_iter ) return false; try { this._cont_caller = currentContinuation(); this._cont_iter(); } catch ( e ) { this._cont_caller = null; if ( e instanceof ContinuationCalledException ) { return this._got; } else { throw e; } } } finally { this._mutex.release(); } // execution never reaches here } )).$Concurrent_Thread_compiled; proto.next = eval(Thread.prepare( function ( ) { if ( this.hasNext() ) { var x = this._buf; this._buf = void 0; this._got = false; return x; } else { return void 0; } } )); return { Generator: Generator }; }(); } } } }.call(null) ) { this.Concurrent.Thread.Generator = Generator; } }).call(null); (function(){ if ( !this.WebBrowser || (typeof this.WebBrowser != 'object' && typeof this.WebBrowser != 'function') ) this.WebBrowser = new Object(); if ( !this.WebBrowser.GUI || (typeof this.WebBrowser.GUI != 'object' && typeof this.WebBrowser.GUI != 'function') ) this.WebBrowser.GUI = new Object(); if ( !this.WebBrowser.GUI.Event || (typeof this.WebBrowser.GUI.Event != 'object' && typeof this.WebBrowser.GUI.Event != 'function') ) this.WebBrowser.GUI.Event = new Object(); if ( !this.Concurrent || (typeof this.Concurrent != 'object' && typeof this.Concurrent != 'function') ) this.Concurrent = new Object(); if ( !this.Concurrent || (typeof this.Concurrent != 'object' && typeof this.Concurrent != 'function') ) this.Concurrent = new Object(); if ( !this.Concurrent.Thread || (typeof this.Concurrent.Thread != 'object' && typeof this.Concurrent.Thread != 'function') ) this.Concurrent.Thread = new Object(); if ( !this.Concurrent.Thread.Event || (typeof this.Concurrent.Thread.Event != 'object' && typeof this.Concurrent.Thread.Event != 'function') ) this.Concurrent.Thread.Event = new Object(); if ( !this.Util || (typeof this.Util != 'object' && typeof this.Util != 'function') ) this.Util = new Object(); if ( !this.Util.Arrayize || (typeof this.Util.Arrayize != 'object' && typeof this.Util.Arrayize != 'function') ) this.Util.Arrayize = new Object(); if ( this.Concurrent.Thread.Event.waitFor === undefined ) this.Concurrent.Thread.Event.waitFor = undefined; if ( this.Concurrent.Thread.Event.select === undefined ) this.Concurrent.Thread.Event.select = undefined; with ( function(){ with ( Util.Arrayize ) { with ( WebBrowser.GUI.Event ) { with ( Concurrent ) { with ( Concurrent.Thread.Event ) { return function () { var VERSION = '0.0.0'; var NAMESPACE; NAMESPACE = 'Concurrent.Thread.Event'; var waitFor = eval(Concurrent.Thread.prepare( function waitFor ( target, type, options ) { var arg = {}; for ( var i in options ) arg[i] = options[i]; arg.target = target; arg.type = type; return select(arg); } )); var select = eval(Concurrent.Thread.prepare( function select ( /* variable args */ ) { try { var signal = {}; set_handlers(arrayize(arguments), signal); Concurrent.Thread.stop(); } catch ( e ) { if ( e === signal ) { return signal.event; } else { throw e; } } } )); function set_handlers ( args, signal ) { var self = Concurrent.Thread.self(); args = args.map(function( arg ){ if ( !arg.target || typeof arg.target !== "object" ) { throw new TypeError("not a object: " + target); } return { target : arg.target, type : String(arg.type), useCapture : Boolean(arg.useCapture), preventDefault : Boolean(arg.preventDefault), stopPropagation: Boolean(arg.stopPropagation) }; }); var lsn_ids = args.map(function( arg ){ function handler ( e ) { if ( arg.preventDefault ) e.preventDefault(); if ( arg.stopPropagation ) e.stopPropagation(); lsn_ids.forEach(function( id ){ detach(id); }); // IE invalidates event properties after leaving the event handler. // So, we pass a copy of the current event object (but DO NOT copy its methods). var evt = {}; for ( var i in e ) { if ( typeof e[i] !== "function" ) evt[i] = e[i]; } signal.event = evt; self.notify(signal); } return attach(arg.target, arg.type, handler, arg.useCapture); }); } return { waitFor: waitFor, select: select }; }(); } } } } }.call(null) ) { this.Concurrent.Thread.Event.waitFor = waitFor; this.Concurrent.Thread.Event.select = select; } }).call(null); (function(){ if ( !this.Data || (typeof this.Data != 'object' && typeof this.Data != 'function') ) this.Data = new Object(); if ( !this.Data.Error || (typeof this.Data.Error != 'object' && typeof this.Data.Error != 'function') ) this.Data.Error = new Object(); if ( !this.Concurrent || (typeof this.Concurrent != 'object' && typeof this.Concurrent != 'function') ) this.Concurrent = new Object(); if ( !this.Concurrent || (typeof this.Concurrent != 'object' && typeof this.Concurrent != 'function') ) this.Concurrent = new Object(); if ( !this.Concurrent.Thread || (typeof this.Concurrent.Thread != 'object' && typeof this.Concurrent.Thread != 'function') ) this.Concurrent.Thread = new Object(); if ( !this.Concurrent.Thread.JSON || (typeof this.Concurrent.Thread.JSON != 'object' && typeof this.Concurrent.Thread.JSON != 'function') ) this.Concurrent.Thread.JSON = new Object(); if ( !this.Concurrent.Thread.JSON.RPC || (typeof this.Concurrent.Thread.JSON.RPC != 'object' && typeof this.Concurrent.Thread.JSON.RPC != 'function') ) this.Concurrent.Thread.JSON.RPC = new Object(); if ( !this.JSON || (typeof this.JSON != 'object' && typeof this.JSON != 'function') ) this.JSON = new Object(); if ( !this.Util || (typeof this.Util != 'object' && typeof this.Util != 'function') ) this.Util = new Object(); if ( !this.Util.Arrayize || (typeof this.Util.Arrayize != 'object' && typeof this.Util.Arrayize != 'function') ) this.Util.Arrayize = new Object(); if ( this.Concurrent.Thread.JSON.RPC.bind === undefined ) this.Concurrent.Thread.JSON.RPC.bind = undefined; if ( this.Concurrent.Thread.JSON.RPC.JSONRPCError === undefined ) this.Concurrent.Thread.JSON.RPC.JSONRPCError = undefined; with ( function(){ with ( Data.Error ) { with ( Util.Arrayize ) { with ( JSON ) { with ( Concurrent ) { with ( Concurrent.Thread.JSON.RPC ) { return function () { var VERSION = '0.0.0'; var NAMESPACE; NAMESPACE = 'Concurrent.Thread.JSON.RPC'; function bind ( opts ) { if ( !(opts instanceof Object) ) throw new TypeError("argument for " + NAMESPACE + ".bind must be a hash."); var request = opts.request; if ( request != null ) { if ( !String(request).match(/^(?:GET|POST)$/i) ) throw new Error('"request" option must be "GET" or "POST".'); } else { request = "POST"; } var params = opts.params; if ( params != null ) { if ( !String(params).match(/^(?:Named|Positioned)$/i) ) throw new Error('"params" option must be "Named" or "Positioned".'); } else { params = "Named"; } var body; if ( request.match(/^POST$/i) ) { if ( params.match(/^Named$/i) ) { body = makeNamedPost(opts.url, opts.method); } else { body = makePositionedPost(opts.url, opts.method); } } else { if ( params.match(/^Named$/i) ) { body = makeNamedGet(opts.url, opts.method); } else { body = makePositionedGet(opts.url, opts.method); } } var with_pre; var pre = opts.preprocess; if ( pre != null ) { if ( typeof pre != "function" ) throw new TypeError('"preprocess" option must be function'); with_pre = eval(Thread.prepare(function(){ return body.apply(this, pre.apply(this, arguments)); })); } else { with_pre = body; } var post = opts.postprocess; if ( post != null ) { if ( typeof post != "function" ) throw new TypeError('"preprocess" option must be function'); return eval(Thread.prepare(function(){ return post(with_pre.apply(this, arguments)); })); } else { return with_pre; } } var COMMON_HEADERS = [ 'User-Agent' , 'Concurrent.Thread.JSON.RPC', 'Accept' , 'application/json' ]; var POST_HEADERS = COMMON_HEADERS.concat( 'Content-type', 'application/json' ); function makeNamedPost( url, method ) { return eval(Thread.prepare( function ( /* variable arguments */ ) { var res = Thread.Http.post(url, dump({ version: "1.1", method : method, params : args2params(arguments) }), POST_HEADERS); res = eval("(" + res.responseText + ")"); if ( res.error ) throw new JSONRPCError(res.error); return res.result; } )); }; function makePositionedPost ( url, method ) { return eval(Thread.prepare( function ( /* variable arguments */ ) { var res = Thread.Http.post(url, dump({ version: "1.1", method : method, params : arrayize(arguments) }), POST_HEADERS); res = eval("(" + res.responseText + ")"); if ( res.error ) throw new JSONRPCError(res.error); return res.result; } )); }; function makeNamedGet ( url, method ) { url = url.replace(/\/+$/, "") + "/" + encodeURIComponent(method) + "?"; return eval(Thread.prepare( function ( /* variable arguments */ ) { var res = Thread.Http.get(url + params2query(args2params(arguments)), COMMON_HEADERS); res = eval("(" + res.responseText + ")"); if ( res.error ) throw new JSONRPCError(res.error); return res.result; } )); }; function makePositionedGet ( url, method ) { url = url.replace(/\/+$/, "") + "/" + encodeURIComponent(method) + "?"; return eval(Thread.prepare( function ( /* variable arguments */ ) { arguments[arguments.length] = {}; arguments.length++; var res = Thread.Http.get(url + params2query(args2params(arguments)), COMMON_HEADERS); res = eval("(" + res.responseText + ")"); if ( res.error ) throw new JSONRPCError(res.error); return res.result; } )); }; function args2params ( args ) { var params = {}; if ( args.length ) { var hash = args[args.length-1]; if ( !(hash instanceof Object) ) throw new Error("the last argument must be a hash"); for ( var i in hash ) { if ( hash.hasOwnProperty(i) ) params[i] = hash[i]; } for ( var i=0; i < args.length-1; i++ ) { params[i] = args[i]; } } return params; } function params2query ( params ) { var query = []; for ( var i in params ) { if ( !params.hasOwnProperty(i) ) continue; if ( params[i] instanceof Array ) { var arr = params[i]; for ( var j=0; j < arr.length; j++ ) { query.push(encodeURIComponent(i) + "=" + encodeURIComponent(arr[j])); } } else { query.push(encodeURIComponent(i) + "=" + encodeURIComponent(params[i])); } } return query.join("&"); } var JSONRPCError = Error.extend( function ( $super, e ) { if ( e instanceof Object ) { $super(e.message); for ( var i in e ) this[i] = e[i]; } else { $super(e); } }, {name: NAMESPACE + ".JSONRPCError"} ); return { JSONRPCError: JSONRPCError, bind: bind }; }(); } } } } } }.call(null) ) { this.Concurrent.Thread.JSON.RPC.JSONRPCError = JSONRPCError; this.Concurrent.Thread.JSON.RPC.bind = bind; } }).call(null);