diff --git a/js/narcissus/jsdefs.js b/js/narcissus/jsdefs.js index 4538672dc66e..a20b6d6de068 100644 --- a/js/narcissus/jsdefs.js +++ b/js/narcissus/jsdefs.js @@ -44,10 +44,36 @@ * done by SpiderMonkey. */ -Narcissus = { - options: { version: 185 }, - hostGlobal: this -}; +(function() { + var builderTypes = Object.create(null, { + "default": { value: function() { + return new narcissus.parser.DefaultBuilder; + } }, + "ssa": { value: function() { + return new narcissus.parser.SSABuilder; + } } + }); + + var builderType; + + var narcissus = { + options: { + version: 185, + get builderType() { return builderType }, + set builderType(type) { + var ctor = builderTypes[type]; + + if (!ctor) + throw new Error("expected builder type ('default' or 'ssa'), got " + type); + + builderType = type; + narcissus.definitions.Builder = ctor; + } + }, + hostGlobal: this + }; + Narcissus = narcissus; +})(); Narcissus.definitions = (function() { @@ -270,7 +296,11 @@ Narcissus.definitions = (function() { defineGetter: defineGetter, defineProperty: defineProperty, isNativeCode: isNativeCode, - makePassthruHandler: makePassthruHandler + makePassthruHandler: makePassthruHandler, + Builder: function() { + throw new Error("no Builder type selected"); + } }; }()); +Narcissus.options.builderType = "default"; diff --git a/js/narcissus/jsexec.js b/js/narcissus/jsexec.js index 0ab9b233f420..50dcb9033e6b 100644 --- a/js/narcissus/jsexec.js +++ b/js/narcissus/jsexec.js @@ -85,7 +85,7 @@ Narcissus.interpreter = (function() { x2.callee = x.callee; x2.scope = x.scope; try { - x2.execute(parser.parse(new parser.DefaultBuilder, s)); + x2.execute(parser.parse(new definitions.Builder, s)); return x2.result; } catch (e if e instanceof SyntaxError || isStackOverflow(e)) { /* @@ -119,7 +119,7 @@ Narcissus.interpreter = (function() { // NB: Use the STATEMENT_FORM constant since we don't want to push this // function onto the fake compilation context. - var x = { builder: new parser.DefaultBuilder }; + var x = { builder: new definitions.Builder }; var f = parser.FunctionDefinition(t, x, false, parser.STATEMENT_FORM); var s = {object: global, parent: null}; return newFunction(f,{scope:s}); @@ -1023,7 +1023,7 @@ Narcissus.interpreter = (function() { return s; var x = new ExecutionContext(GLOBAL_CODE); - x.execute(parser.parse(new parser.DefaultBuilder, s, f, l)); + x.execute(parser.parse(new definitions.Builder, s, f, l)); return x.result; } @@ -1059,7 +1059,7 @@ Narcissus.interpreter = (function() { } } - var b = new parser.DefaultBuilder; + var b = new definitions.Builder; var x = new ExecutionContext(GLOBAL_CODE); ExecutionContext.current = x; diff --git a/js/narcissus/jsparse.js b/js/narcissus/jsparse.js index 17eb8effdbd4..6ac2586595cf 100644 --- a/js/narcissus/jsparse.js +++ b/js/narcissus/jsparse.js @@ -2328,6 +2328,9 @@ Narcissus.parser = (function() { parse: parse, Node: Node, DefaultBuilder: DefaultBuilder, + get SSABuilder() { + throw new Error("SSA builder not yet supported"); + }, bindSubBuilders: bindSubBuilders, DECLARED_FORM: DECLARED_FORM, EXPRESSED_FORM: EXPRESSED_FORM, diff --git a/js/src/shell/njs b/js/src/shell/njs index 9f11a8bc21c6..72322629c60a 100755 --- a/js/src/shell/njs +++ b/js/src/shell/njs @@ -35,13 +35,18 @@ if __name__ == '__main__': help='enable interactive shell') op.add_option('-H', '--harmony', dest='js_harmony', action='store_true', help='enable ECMAScript Harmony mode') + op.add_option('-S', '--ssa', dest='js_ssa', action='store_true', + help='enable parse-time SSA construction') (options, args) = op.parse_args() cmd = "" if options.js_harmony: - cmd += 'Narcissus.options={version:"harmony"}; ' + cmd += 'Narcissus.options.version = "harmony"; ' + + if options.js_ssa: + cmd += 'Narcissus.options.builderType = "ssa"; ' if options.js_exps: for exp in options.js_exps: