diff --git a/tools/converter/browserPlatform.js b/tools/converter/browserPlatform.js deleted file mode 100644 index ff9e392bda..0000000000 --- a/tools/converter/browserPlatform.js +++ /dev/null @@ -1,171 +0,0 @@ -// Copyright 2011 by Google, Inc. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. - - -/** - * Each implementation of *Platform.js abstracts the underlying OS and JS - * engine peculiarities. - * - *
The implementation here is for running in many browsers, and so - * should assume the platform may be anything from ES3+Reality - * forward, including somewhat non-conformant implementations. - */ -(function (global) { - "use strict"; - - /////////////////// Development Switches ///////////////// - - var VERBOSE = true; - - // Affects side effecting os operations, - // currently only platform.writeSpawn and platform.mkdir. - var DRY_RUN = false; - - // When converting paths to path strings, should the pathstring be - // relative to the TEST262_ROOT, or should it be relative to the - // current working directory? - var ABSOLUTE_PATHSTR = false; - - //////////////////////////////////////////////////////// - - global.t262 = global.t262 || {}; - - var platform = global.t262.platform = {}; - - var utils = global.t262.utils; - var forEach = utils.forEach; - var map = utils.map; - - // Someday this will be https: - var ABS_ROOT_STR = 'http://test262.ecmascript.org/'; - - var TEST262_ROOT_STR = ABSOLUTE_PATHSTR ? ABS_ROOT : ''; - - var HARNESS_DIR = ['resources', 'scripts', 'global']; - platform.HARNESS_DIR = HARNESS_DIR; - - var CONVERTER_DIR = ['resources', 'scripts', 'global']; - platform.CONVERTER_DIR = CONVERTER_DIR; - - var PLATFORM_PATHS = [ - HARNESS_DIR.concat('jquery-1.4.2.min.js'), - CONVERTER_DIR.concat('utils.js'), - CONVERTER_DIR.concat('v8PosixPlatform.js') - ]; - platform.PLATFORM_PATHS = PLATFORM_PATHS; - - ////////////////// Needed for building and running tests ////////////// - - /** - * - */ - function validatePath(path) { - var pathStr = path.join('/'); - forEach(path, function(segment) { - if (segment === '') { - throw new Error('A path cannot have empty segments: ' + pathStr); - } - if (segment === '/') { - throw new Error('Path insufficiently parsed: ' + pathStr); - } - if (segment === '..') { - throw new Error('Cannot use "..": ' + pathStr); - } - }); - return path; - } - - /** - * Converts a relPath to a relPathStr. - * - * A relPath is an array of filenames relative to some base onto - * which it will be concatenated before use. - */ - function toRelPathStr(relPath) { - validatePath(relPath); - return relPath.join('/'); - } - platform.toRelPathStr = toRelPathStr; - - /** - * Converts a path to a pathStr. - * - * A path is an array of filenames relative to TEST262_ROOT. A - * pathStr is a (possibly fully qualified string) for referring to - * that file on the current platform, according to the operations - * in this *Platform.js file. - */ - function toPathStr(path) { - validatePath(path); - return TEST262_ROOT_STR + path.join('/'); - } - platform.toPathStr = toPathStr; - - /** - * Returns the text found at path, with newlines normalized and - * any initial BOM (Unicode Byte Order Mark) removed. - * - *
Note that sync remote reading is a terrible idea, but that - * the way test262 was designed and it's hard to change after the - * fact. - */ - function getText(path) { - var text; - $.ajax({ - async: false, - url: toPathStr(path), - success: function(s) { text = s; } - }); - text = text.replace(/\r\n/g, '\n').replace(/\r/g, '\n'); - if (text.charCodeAt(0) === 0xfeff) { return text.substring(1); } - return text; - } - platform.getText = getText; - - /** - * How one JavaScript script possibly spawns another and possibly - * redirects its printed form to a chosen file (or resource). - * - *
For example, if !DRY_RUN, then
- * writeSpawn([], 'print(+arguments[0] + +arguments[1]);', ['3', '5']) - *- * should return the string "8" if writeSpawn decides to spawn. - * - * @param scriptPaths An array of path arrays of JavaScript source - * files to be loaded into the spawned JS engine (in addition to - * the spawning platform file) if we are indeed spawning. - * @param opt_src A Program to be evaluated in an environment in - * which "arguments" is bound to the list of strings provided by - * opt_args. If spawned, the result is whatever the program writes - * to its stdout. On platforms (like SES) where this can be a - * safely confining evaluation, it should be. The implementation - * here is not safe. - * @param opt_args A list of strings to be bound to top-level - * 'arguments' both in opt_src and in the possibly spawed scripts. - * @param opt_targetPath A path array naming a file where the - * result of opt_src should be written. In the browser context, the - * result is PUT (or should that be POST), using XHR, to the target - * resource. - * @param opt_spawn_required If truthy, forces spawning. - * @returns If there is a target, then the null string. Otherwise, - * the string result of evaluating opt_src. - */ - function writeSpawn(scriptPaths, - opt_src, - opt_args, - opt_targetPath, - opt_spawn_required, - opt_forceNonStrict) { - "TBD"(); - if (VERBOSE || DRY_RUN) { "TBD"(); } - if (DRY_RUN) { return ''; } - - return "TBD"; - } - platform.writeSpawn = writeSpawn; - - - ////////////////// Only needed for running tests ////////////////////// - - - })(this); diff --git a/tools/converter/convert.js b/tools/converter/convert.js deleted file mode 100644 index 18c27178cf..0000000000 --- a/tools/converter/convert.js +++ /dev/null @@ -1,595 +0,0 @@ -// Copyright 2011 by Google, Inc. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. - - -(function(global) { - "use strict"; - - var t262 = global.t262; - - var platform = t262.platform; - var toRelPathStr = platform.toRelPathStr; - var toPathStr = platform.toPathStr; - var toRelPath = platform.toRelPath; - var toPath = platform.toPath; - - var utils = t262.utils; - var forEach = utils.forEach; - var map = utils.map; - var filter = utils.filter; - var keys = utils.keys; - var trim = utils.trim; - var regExp = utils.regExp; - - var CONTRIB_DIRS = [ - ['external', 'contributions', 'Google', 'sputnik_conformance_modified'], - ['external', 'contributions', 'Microsoft', 'ietc_262modified'] - ]; - - var CONVERTED_DIR = ['test', 'suite']; - - var OUT_DIR = ['website', 'resources', 'scripts', 'testcases2']; - - var CONVERT_PATH = platform.CONVERTER_DIR.concat('convert.js'); - - /** - * Extra in the sense that they are not redundant with the source, - * but add information that should be present in the converted - * source. So not test/suite/SputnikGlobalScope.js, since that is - * actually derived from sources. - */ - var EXTRA_GLOBAL_SCOPE_TESTS = [ - ['external', 'contributions', 'Microsoft', 'ietc_262modified', - 'IETCGlobalScope.js'] - ]; - - /** - * Try prepending this to a relPath if necessary to get an index - * into EXTRA_GLOBAL_SCOPE_TESTS. - */ - var EXTRANEOUS_PREFIXES = ['TestCases']; - - /** - * Prepare for reading in the EXTRA_GLOBAL_SCOPE_TESTS, suppressing - * the "new Array()" that inappropriately still appears in - * IETCGlobalScope.js - */ - global.GlobalScopeTests = global.GlobalScopeTests || {}; - global.EarlyErrorRePat = 'EarlyErrorRePat'; - global.NotEarlyErrorString = 'NotEarlyError'; - -///////////////////////////////////////////////////////////////// - - var headerPattern = /(?:(?:\/\/.*)?\s*\n)*/; - var captureCommentPattern = /\/\*\*?((?:\s|\S)*?)\*\/\s*\n/; - var anyPattern = /(?:\s|\S)*/; - var blanksPattern = /(?:\s|\n)*/; - var captureStrictPattern = /\s*('use strict'|"use strict");/; - - // Should match anything - var testEnvelopePattern = - regExp('^(', headerPattern, - ')(?:', captureCommentPattern, - ')?(', anyPattern, - ')$'); - - var registerPattern = - regExp('^(', anyPattern, '?)(', - /ES5Harness\.registerTest\s*\(\s*\{/, anyPattern, - /\}\s*\)/, ')', - /\s*;?(?:\s|\n)*$/); - - // Matches a named function. Captures both the name and the body. - var captureFuncNameBodyPattern = - regExp(/^function\s+(\w*)\(\s*\)\s*\{/, - '(', anyPattern, ')', - /;?/, blanksPattern, - /\}$/); - - var captureExprBodyPattern = - regExp(/^return\s+/, - '(', anyPattern, '?)', - /;$/); - - var capturePredicatePattern = - regExp(/^if\s+\((.*?)\)\s*\{/, blanksPattern, - /return\s+true;?/, blanksPattern, - /\}$/); - -///////////////////////////////////////////////////////////////// - - /** - * Strip the left margin "*"s that are found in the body of a - * multiline doc-comment like this one. - */ - function stripStars(text) { - return trim(text.replace(/\s*\n\s*\*\s?/g, '\n')); - } - - /** - * Parses the source of a test262 test case file into a JSON - * envelope record. - * - *
The input can be in old sputnik or ietestcenter style, or in - * the canonical test262 style. In all cases, we have an optional - * header, an optional "/*" comment possibly containing properties - * of the form
- * @propName: propValue; - *which populate the test record. This is followed by the - * rest of the text, which is the test itself. In the case of an - * ietestcenter style test, this is followed by a call to - *
ES5Harness\.registerTest
to register a test record.
- */
- function parseTestEnvelope(src, name) {
- var envelope = { testRecord: {} };
- var envelopeMatch = testEnvelopePattern.exec(src);
- if (!envelopeMatch) {
- // Can't happen?
- throw new Error('unrecognized: ' + name);
- }
- envelope.header = trim(envelopeMatch[1]);
- if (envelopeMatch[2]) {
- var propTexts = envelopeMatch[2].split(/\s*\n\s*\*\s*@/);
- // notice side effect by .shift()
- envelope.commentary = stripStars(propTexts.shift()),
- forEach(propTexts, function(propText) {
- var propName = propText.match(/^\w+/)[0];
- var propVal = propText.substring(propName.length);
- // strip optional initial colon or final semicolon.
- // The initial colon is only stripped if it comes immediately
- // after the identifier with no intervening whitespace.
- propVal = propVal.replace(/^:\s*/, '').replace(/;\s*$/, '');
- propVal = stripStars(propVal);
- if (propName in envelope.testRecord) {
- throw new Error('duplicate: ' + propName);
- }
- envelope.testRecord[propName] = propVal;
- });
- }
- envelope.rest = envelopeMatch[3]; // Do not trim
-
- var strictMatch = captureStrictPattern.exec(envelope.rest);
- if (strictMatch) {
- envelope.testRecord.onlyStrict = '';
- // Note: does not remove or alter the "use strict"; directive
- // itself. We also make no use of the captured string so TODO:
- // stop capturing it.
- }
-
- var registerMatch = registerPattern.exec(envelope.rest);
- if (registerMatch) {
- envelope.rest = trim(registerMatch[1]);
- envelope.registerExpr = trim(registerMatch[2]);
- } else if (envelope.rest.indexOf('ES5Harness.registerTest') >= 0) {
- print(' \n--header---\n|' + envelope.header +
- '|\n--rest-----\n|' + envelope.rest +
- '|\n--harness--\n|' + envelope.registerExpr +
- '|\n-----------\n');
- throw new Error('Malformed harness? ' + name);
- }
- return envelope;
- }
-
- /**
- * Given a function that indicates success by returning a truthy
- * value, return the source for a Program that, when evaluated in
- * the environment the function assumes, will behave the same as
- * calling that function in that environment and asserting the
- * truthiness of the result.
- *
- * Programs do not conveniently return any value, even their
- * completion value, so Programs in canonical test262 style instead
- * indicate success simply by completing normally, i.e., without
- * throwing anything. The conversion assumes a one argument
- * runTestCase
function which calls it function
- * argument and throws an indication of test failure iff that
- * function returns a falsy argument.
- *
- *
Unless it specifies otherwise, the Program source may be - * executed strict and/or non-strict, and it may be exeuted within - * the try block of a try/catch or try/catch finally, i.e., as a - * Block rather than as a Program. - */ - function functionToProgramSrc(func) { - var funcSrc = '' + func; - var cfnbMatch = captureFuncNameBodyPattern.exec(funcSrc); - if (!cfnbMatch) { - throw new Error('Could not recognize: "' + funcSrc + '"'); - } - var name = trim(cfnbMatch[1]); - var body = trim(cfnbMatch[2]); - - // Uncomment to look for special cases - // - // var cebMatch = captureExprBodyPattern.exec(body); - // if (cebMatch) { - // return 'assertTruthy(' + trim(cebMatch[1]) + ');'; - // } - // - // var cpMatch = capturePredicatePattern.exec(body); - // if (cpMatch) { - // return 'assertTruthy(' + trim(cpMatch[1]) + ');'; - // } - - // General case - - return funcSrc + '\n' + - 'runTestCase(' + name + ');'; - } - - - /** - * If record[toName] is absent or empty and record[fromName] is - * present, whether empty or not, then set record[toName] to the - * current value of record[fromName] and delete record[fromName] - */ - function transferProp(record, fromName, toName) { - // Note that record[toName] is falsy whether toName is absent or - // empty - if (!record[toName] && fromName in record) { - record[toName] = record[fromName]; - delete record[fromName]; - } - } - - - /** - * Given an ietestcenter style test, this evaluates the - * registration expression in order to gather the test record. - */ - function gatherOne(envelope, name) { - var testRecord = envelope.testRecord; - - var testRecords = []; - - // Evaluating!!!! - platform.evalExprIn(envelope.registerExpr, - { - ES5Harness: { - registerTest: function(testRecord) { - testRecords.push(testRecord); - } - } - }, - 'forceNonStrict'); - - if (testRecords.length !== 1) { - // We may lift this restriction in order to support test - // generators. - throw new Error('not singleton: ' + name); - } - var gatheredTestRecord = testRecords[0]; - forEach(keys(gatheredTestRecord), function(propName) { - if (propName in testRecord && - testRecord[propName] !== gatheredTestRecord[propName]) { - throw new Error('Conflicting "' + propName + '" in ' + name); - } - testRecord[propName] = gatheredTestRecord[propName]; - }); - - if (typeof testRecord.test === 'function') { - testRecord.test = envelope.rest + '\n' + - functionToProgramSrc(testRecord.test); - } - if ('precondition' in testRecord) { - // Only ietestcenter tests currently have preconditions, and they - // plan to drop them. So canonical test262 style omits - // them. - delete testRecord.precondition; - } - - return testRecord; - } - - /** - * Normalizes the properties of testRecord to be the canonical - * test262 style properties, that will be assumed by the new test - * runners. - */ - function normalizeProps(testRecord) { - if (!('onlyStrict' in testRecord) && testRecord.strict === 1) { - testRecord.onlyStrict = ''; - } - if (testRecord.strict === 1) { - delete testRecord.strict; - } - - if ('strict_mode_negative' in testRecord) { - if (!('onlyStrict' in testRecord)) { - testRecord.onlyStrict = ''; - } - transferProp(testRecord, 'strict_mode_negative', 'negative'); - } - transferProp(testRecord, 'strict_only', 'onlyStrict'); - transferProp(testRecord, 'non_strict_only', 'noStrict'); - - transferProp(testRecord, 'errortype', 'negative'); - transferProp(testRecord, 'assertion', 'description'); - transferProp(testRecord, 'assertion', 'commentary'); - } - t262.normalizeProps = normalizeProps; - - /** - * If relPath is represented in the EXTRA_GLOBAL_SCOPE_TESTS, - * retrieve the corresponding record. Otherwise, return undefined. - */ - function getGlobalScopeRecord(relPath) { - var key = toRelPathStr(relPath); - var val = global.GlobalScopeTests[key]; - if (!val) { - key = toRelPathStr(EXTRANEOUS_PREFIXES.concat(relPath)); - val = global.GlobalScopeTests[key]; - } - return val; - } - t262.getGlobalScopeRecord = getGlobalScopeRecord; - - /** - * Parses the source of a test262 test case file into a normalized - * JSON test record. - */ - function parseTestRecord(inBase, relPath, name) { - var nextRelPath = relPath.concat([name]); - var nextPath = inBase.concat(nextRelPath); - - var src = platform.getText(nextPath); - var testRecord; - if (!src) { - throw new Error('no src: ' + toPathStr(nextPath)); - } - var envelope = parseTestEnvelope(src, name); - - if (envelope.registerExpr) { - testRecord = gatherOne(envelope, name); - } else { - testRecord = envelope.testRecord; - if (!testRecord.test) { - testRecord.test = envelope.rest; - } - } - - var globalScopeRecord = getGlobalScopeRecord(nextRelPath); - if (globalScopeRecord) { - forEach(keys(globalScopeRecord), function(key) { - if (!(key in testRecord) && key !== 'precondition') { - testRecord[key] = globalScopeRecord[key]; - } - }); - } - - delete testRecord.id; - delete testRecord.name; - delete testRecord.section; - testRecord.path = toRelPathStr(nextRelPath); - testRecord.header = envelope.header; - testRecord.commentary = envelope.commentary; - - normalizeProps(testRecord); - return testRecord; - } - t262.parseTestRecord = parseTestRecord; - - // If we see any properties other than these after normalization, - // we signal an error. - var KNOWN_PROPS = ['path', 'description', - 'noStrict', 'onlyStrict', 'negative', - - // Not yet supported ones that should not be - // accepted until they are supported are - // commented aout below. Not supported ones that - // can safely be present and ignored are enabled - // below. - // 'generator', 'verbatim', - 'noHelpers', 'bestPractice' - ]; - - /** - * Turns the (assumed) normalized test record into its string form - * in canonical test262 style. - * - * NOTE: This is currently destructive of testRecord. Easy to fix - * if it becomes a problem. - */ - function formatTestRecord(testRecord) { - var test = testRecord.test; - delete testRecord.test; - - function addProp(pname) { - if (pname in testRecord) { - result += ' * @' + pname; - if (testRecord[pname]) { - result += ' ' + testRecord[pname].replace(/\n/g, '\n * '); - } - result += '\n'; - delete testRecord[pname]; - } - } - - var result = testRecord.header + '\n\n'; - delete testRecord.header; - result += '/**\n'; - if (testRecord.commentary) { - result += ' * ' + testRecord.commentary.replace(/\n/g, '\n * ') + - '\n *\n'; - } - delete testRecord.commentary; - forEach(KNOWN_PROPS, addProp); - - var remaining = keys(testRecord); - if (remaining.length >= 1) { - // If we wanted to preserve unrecognized properties, we'd - // uncomment the following and comment out the next - //forEach(remaining, addProp); - throw new Error('unrecognized: ' + remaining); - } - - result += ' */\n\n' + test; - return result; - } - t262.formatTestRecord = formatTestRecord; - - /** - * Reads the test case at inBaseStr+relPathStr and returns the - * source of that test case converted to canonical test262 style. - */ - function convertTest(inBaseStr, relPathStr) { - var inBase = toPath(inBaseStr); - var relPath = platform.toRelPath(relPathStr); - var name = relPath.pop(); - var testRecord = parseTestRecord(inBase, relPath, name); - var result = formatTestRecord(testRecord); - return result; - } - t262.convertTest = convertTest; - - var writeSpawnFailures = []; - - /** - * Convert all the testcases found at inBase+relDir to test cases - * in canonical test262 style, to be stored at corresponding - * positions in outBase+relPath. - */ - function convertAll(inBase, outBase, relPath) { - var inPath = inBase.concat(relPath); - var outPath = outBase.concat(relPath); - platform.mkdir(outPath); - forEach(platform.ls(inPath), function(name) { - var nextRelPath = relPath.concat([name]); - if (platform.isDirectory(inBase.concat(nextRelPath))) { - convertAll(inBase, outBase, nextRelPath); - } else if (/\.js$/.test(name) && !(/IETCGlobalScope\.js$/.test(name))) { - var outFilePath = outPath.concat([name]); - try { - platform.writeSpawn( - [CONVERT_PATH].concat(EXTRA_GLOBAL_SCOPE_TESTS), - 't262.show(t262.convertTest("' + toPathStr(inBase) + - '", "' + toRelPathStr(nextRelPath) + '"));', - void 0, - outFilePath); - } catch (err) { - writeSpawnFailures.push({ - error: err, - relPath: relPath - }); - } - } - }); - } - t262.convertAll = convertAll; - - /** - * Do all the conversions (from sputnik style, ietestcenter style, - * or other to canonical test262 style) matching relPath. - */ - function convert(opt_relPathStr) { - var relPath = opt_relPathStr ? toRelPath(opt_relPathStr) : []; - writeSpawnFailures = []; - forEach(CONTRIB_DIRS, function(srcDir) { - convertAll(srcDir, CONVERTED_DIR, relPath); - }); - if (writeSpawnFailures.length >= 1) { - print('********* failures **********'); - forEach(writeSpawnFailures, function(failure) { - print(failure.error + ': ' + toRelPathStr(failure.relPath)); - }); - throw writeSpawnFailures[0].error; - } - } - t262.convert = convert; - - /** - * Reads all the test case records for the section corresponding to - * the directory at pathStr, and return a JSON record for a test - * case section, as would be uploaded to a browser-based test - * runner. - */ - function buildSection(inBaseStr, relPathStr) { - var inBase = toPath(inBaseStr); - var relPath = platform.toRelPath(relPathStr); - var path = inBase.concat(relPath); - if (!platform.isDirectory(path)) { throw new Error('not dir: ' + path); } - - var jsFiles = filter(platform.ls(path), function(name) { - return /\.js$/.test(name); - }); - var testRecords = map(jsFiles, function(name) { - var testRecord = parseTestRecord(inBase, relPath, name); - - delete testRecord.header; - delete testRecord.commentary; - return testRecord; - }); - testRecords = filter(testRecords, function(testRecord) { - return testRecord !== null; - }); - return { - testCollection: { - name: path[path.length -1], - numTests: testRecords.length, - tests: testRecords - } - }; - } - t262.buildSection = buildSection; - - /** - * Use the test cases at inBase+relPath to build the test - * collection portion of the website, at outBase. - */ - function buildAll(inBase, outBase, relPath) { - var inPath = inBase.concat(relPath); - var hasJS = false; - forEach(platform.ls(inPath), function(name) { - var nextRelPath = relPath.concat([name]); - if (platform.isDirectory(inBase.concat(nextRelPath))) { - buildAll(inBase, outBase, nextRelPath); - } else if (/\.js$/.test(name)) { - hasJS = true; - } - }); - if (hasJS) { - var name = relPath[relPath.length -1] + '.json'; - var outFilePath = outBase.concat([name]); - try { - platform.writeSpawn( - [CONVERT_PATH].concat(EXTRA_GLOBAL_SCOPE_TESTS), - 't262.showJSON(t262.buildSection("' + toPathStr(inBase) + - '", "' + toRelPathStr(nextRelPath) + '"));', - void 0, - outFilePath); - } catch (err) { - writeSpawnFailures.push({ - error: err, - path: relPath - }); - } - } - } - t262.buildAll = buildAll; - - /** - * Build those test case files for the website corresponding to the - * test cases matching relPath. - * - *
Right now it's building from the pre-converted test - * files. Once we switch over to converted as the maintained - * sources, we should change this. - */ - function buildWebSite(opt_relPathStr) { - var relPath = opt_relPathStr ? toRelPath(opt_relPathStr) : []; - writeSpawnFailures = []; - forEach(CONTRIB_DIRS, function(srcDir) { - buildAll(srcDir, OUT_DIR, relPath); - }); -// buildAll(CONVERTED_DIR, OUT_DIR, relPath); - if (writeSpawnFailures.length >= 1) { - print('********* failures **********'); - forEach(writeSpawnFailures, function(failure) { - print(failure.error + ': ' + toRelPathStr(failure.relPath)); - }); - throw writeSpawnFailures[0].error; - } - } - t262.buildWebSite = buildWebSite; - - })(this); diff --git a/tools/converter/utils.js b/tools/converter/utils.js deleted file mode 100644 index ba96748ec6..0000000000 --- a/tools/converter/utils.js +++ /dev/null @@ -1,118 +0,0 @@ -// Copyright 2011 by Google, Inc. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. - - -/** - * General conveniences, including some functionality available in ES5 - * but not ES3. - * - *
This file must be able to run in many browsers, and so should - * assume the platform may be anything from ES3+Reality forward, - * including somewhat non-conformant implementations. It must also be - * able to run in a non-browser environment, such as from the command - * line. - * - *
The conveniences that are analogs of similar ES5 features are - * not full emulations, but only emulations of the portion of their - * semantics we need. - */ -(function(global) { - "use strict"; - - global.t262 = global.t262 || {}; - - var utils = global.t262.utils = global.t262.utils || {}; - - //////////////////////////////////////////////////////// - - /** - * Like ES5 call.bind([].forEach)(list, func), but supporting fewer - * optional arguments. - */ - function forEach(list, func) { - for (var i = 0, len = list.length; i < len; i++) { - func(list[i], i); - } - } - utils.forEach = forEach; - - /** - * Like ES5 call.bind([].map)(list, func), but supporting fewer - * optional arguments. - */ - function map(list, func) { - var result = []; - for (var i = 0, len = list.length; i < len; i++) { - result.push(func(list[i], i)); - } - return result; - } - utils.map = map; - - /** - * Like ES5 call.bind([].filter)(list, pred), but supporting fewer - * optional arguments. - */ - function filter(list, pred) { - var result = []; - for (var i = 0, len = list.length; i < len; i++) { - if (pred(list[i], i)) { result.push(list[i]); } - } - return result; - } - utils.filter = filter; - - /** - * Like ES5 Object.keys(obj). - */ - function keys(obj) { - var result = []; - var hop = {}.hasOwnProperty; - for (var k in obj) { - if (hop.call(obj, k)) { result.push(k); } - } - return result; - } - utils.keys = keys; - - /** - * Like ES5 call.bind(''.trim)(string). - */ - function trim(str) { - return str.replace(/^\s*/, '').replace(/\s*$/, ''); - } - utils.trim = trim; - - /** - * Appends a bunch of RegExps together into a single RegExp, - * solving both the RegExp-one-liner problem and the doubled - * backslash problem when composing literal strings. - * - *
The arguments can be any mixture of RegExps and strings. By - * expressing the portions that should be well formed regexps as - * regexps, we catch well-formedness errors within such a portion - * separately. The strings are added as is without escaping -- - * BEWARE. By not escaping the strings, we can use them to - * represent the individually unbalanced fragments, like capturing - * parens, around other regexps. If arguments[0] is a RegExp, we - * use its flags on the resuting RegExp. - * - *
Not platform dependent, so does not really belong in this - * file. - */ - function regExp(var_args) { - var args = [].slice.call(arguments, 0); - var reSrc = map(args, function(arg) { - return (typeof arg === 'string') ? arg : arg.source; - }).join(''); - var flags = ''; - if (typeof args[0] === 'object') { - var parts = (''+args[0]).split('/'); - flags = parts[parts.length -1]; - } - return new RegExp(reSrc, flags); - } - utils.regExp = regExp; - - - })(this); \ No newline at end of file diff --git a/tools/converter/v8PosixPlatform.js b/tools/converter/v8PosixPlatform.js deleted file mode 100644 index 0864fd7322..0000000000 --- a/tools/converter/v8PosixPlatform.js +++ /dev/null @@ -1,368 +0,0 @@ -// Copyright 2011 by Google, Inc. All rights reserved. -// This code is governed by the BSD license found in the LICENSE file. - - -/** - * Each implementation of *Platform.js abstracts the underlying OS and JS - * engine peculiarities. - * - *
The implementation here is specific to the v8 shell running on a - * Posix platform. Therefore, it may legitimately use ES5 features, - * although it generally avoids them for consistency with the rest of - * test262. - */ -(function (global) { - "use strict"; - - /////////////////// Development Switches ///////////////// - - var VERBOSE = true; - - // Affects side effecting os operations, - // currently only platform.writeSpawn and platform.mkdir. - var DRY_RUN = false; - - // When converting paths to path strings, should the pathstring be - // relative to the TEST262_ROOT, or should it be relative to the - // current working directory? - var ABSOLUTE_PATHSTR = false; - - //////////////////////////////////////////////////////// - - global.t262 = global.t262 || {}; - - var platform = global.t262.platform = {}; - - var utils = global.t262.utils; - var forEach = utils.forEach; - var map = utils.map; - var keys = utils.keys; - var trim = utils.trim; - - try { - read('tools/converter/v8PosixPlatform.js'); - } catch (err) { - throw new Error('Must run in a test262 source root'); - } - - var ABS_ROOT = trim(os.system('pwd', ['-P'])).split('/'); - - var TEST262_ROOT = ABSOLUTE_PATHSTR ? ABS_ROOT : []; - - var TEST262_ROOT_STR = TEST262_ROOT.join('/'); - - var HARNESS_DIR = ['test', 'harness']; - platform.HARNESS_DIR = HARNESS_DIR; - - var CONVERTER_DIR = ['tools', 'converter']; - platform.CONVERTER_DIR = CONVERTER_DIR; - - var PLATFORM_PATHS = [ - CONVERTER_DIR.concat('utils.js'), - CONVERTER_DIR.concat('v8PosixPlatform.js') - ]; - - ////////////////// Needed for building and running test ////////////// - - /** - * - */ - function validatePath(path) { - var pathStr = path.join('/'); - forEach(path, function(segment) { - if (segment === '') { - throw new Error('A path cannot have empty segments: ' + pathStr); - } - if (segment === '/') { - throw new Error('Path insufficiently parsed: ' + pathStr); - } - if (segment === '..') { - throw new Error('Cannot use "..": ' + pathStr); - } - }); - return path; - } - - /** - * Converts a relPath to a relPathStr. - * - * A relPath is an array of filenames relative to some base onto - * which it will be concatenated before use. - */ - function toRelPathStr(relPath) { - validatePath(relPath); - return relPath.join('/'); - } - platform.toRelPathStr = toRelPathStr; - - /** - * Converts a path to a pathStr. - * - * A path is an array of filenames relative to TEST262_ROOT. A - * pathStr is a (possibly fully qualified string) for referring to - * that file on the current platform, according to the operations - * in this *Platform.js file. - */ - function toPathStr(path) { - validatePath(path); - return TEST262_ROOT.concat(path).join('/'); - } - platform.toPathStr = toPathStr; - - /** - * Returns the text found at path, with newlines normalized and - * any initial BOM (Unicode Byte Order Mark) removed. - */ - function getText(path) { - var text = read(toPathStr(path)); - text = text.replace(/\r\n/g, '\n').replace(/\r/g, '\n'); - if (text.charCodeAt(0) === 0xfeff) { return text.substring(1); } - return text; - } - platform.getText = getText; - - /** - * - */ - function bashQuote(str) { - var escaped = JSON.stringify(str).replace(/'/g, "\\'"); - return "$'" + escaped.substring(1, escaped.length -1) + "'"; - } - - /** - * How one JavaScript script possibly spawns another and possibly - * redirects its printed form to a chosen file (or resource). - * - *
For example, if !DRY_RUN, then
- * platform.writeSpawn([], - * 't262.show(+arguments[0] + +arguments[1]);', - * ['3', '5']) - *- * should emit string "8" to stdout. - * - *
To spawn a platform distinct from the present one -- for - * example, as outer v8-based driver can drive a rhino-based child - * -- create a distinct object representing that other platform and - * invoke its writeSpawn method. - * - * @param scriptPaths An array of path arrays of JavaScript source - * files to be loaded into the spawned JS engine, after - * PLATFORM_PATHS, if we are indeed spawning. - * @param opt_src A Program to be evaluated in an environment in - * which "arguments" is bound to the list of strings provided by - * opt_args. If spawned, the result is whatever the program writes - * to its stdout. On platforms (like SES) where this can be a - * safely confining evaluation, it should be. The implementation - * here is not safe. - * @param opt_args A list of strings to be bound to top-level - * 'arguments' both in opt_src and in the possibly spawed scripts. - * @param opt_targetPath A path array naming a file where the - * result of opt_src should be written. On v8 currently, if this is - * provided, then writeSpawn will spawn, since we have no other way - * to implement this functionality. In the browser context, the - * result is PUT (or should that be POST), using XHR, to the target - * resource. - * @param opt_spawn_required If truthy, forces spawning. - * @returns If there is a target, then the null string. Otherwise, - * the string result of evaluating opt_src. - */ - function writeSpawn(scriptPaths, - opt_src, - opt_args, - opt_targetPath, - opt_spawn_required, - opt_forceNonStrict) { - if (typeof opt_src === 'string' && - !opt_targetPath && - !opt_spawn_required) { - var str = '(function(/*var_args*/) { '; - if (opt_forceNonStrict !== 'forceNonStrict') { - str += '"use strict"; '; - } - str += opt_src + '\n})'; - return ''+(1,eval)(str).apply(void 0, opt_args || []); - } - - var sys = os.system; - if (DRY_RUN) { - sys = function(command, args) { - print(command + ' ' + args.join(' ')); - }; - } - - var allScriptPaths = PLATFORM_PATHS.concat(scriptPaths); - var cmd = 'v8 ' + map(allScriptPaths, toPathStr).join(' '); - - if (typeof opt_src === 'string') { - cmd += ' -e ' + bashQuote(opt_src); - } - if (opt_args) { - cmd += ' -- ' + map(opt_args, bashQuote).join(' '); - } - - if (VERBOSE && !DRY_RUN) { print(cmd); } - - // We write the output to a temporary file for two reasons: - // * If the spawned script dies with a useful diagnostic, - // os.system will throw an error omitting that diagnostic - // text. However, bash ">" will both redirect to the output file - // and preserve the error code of the command to the left. Bash - // does not preserve the error code with "|" redirection. - // * If we actually have a target, we only want to write into it - // if our command runs successfully. - var tempPathStr = os.system('mktemp', ['-t', 'temp.']).trim(); - cmd += ' > ' + tempPathStr; - - var result; - try { - try { - result = sys('bash', ['-c', cmd]); - } catch (err) { - // The error we catch is almost certainly less interesting - // than the one unfortunately written to the target file. - var message = 'failed: ' + cmd + '\n---\n' + read(tempPathStr); - throw new Error(message); - } - if (opt_targetPath) { - sys('cp', [tempPathStr, toPathStr(opt_targetPath)]); - } - return result; - } finally { - sys('rm', ['-f', tempPathStr]); - } - } - platform.writeSpawn = writeSpawn; - - - ////////////////// Only needed for building tests ///////////////////// - - /** - * Calls a non-strict indirect eval function on exprSrc. - * - *
On platforms (like SES) where this can be a safely confining - * evaluation, it should be. The implementation here is not safe. - */ - function evalExprIn(exprSrc, env, opt_forceNonStrict) { - var varNames = keys(env); - var str = '(function(' + varNames.join(',') + ') {'; - if (opt_forceNonStrict !== 'forceNonStrict') { - str += '"use strict";'; - } - str += ' return (' + exprSrc + '); })'; - var vals = map(varNames, function(varName) { return env[varName]; }); - return (1,eval)(str).apply(void 0, vals); - } - platform.evalExprIn = evalExprIn; - - /** - * Converts a relPathStr to a relPath. - * - *
See toRelPathStr. - */ - function toRelPath(relPathStr) { - return validatePath(relPathStr.split('/')); - } - platform.toRelPath = toRelPath; - - /** - * Converts a pathStr to a path. - * - *
See toPathStr. - */ - function toPath(pathStr) { - if (pathStr[0] === '/') { - if (pathStr.indexOf(TEST262_ROOT_STR + '/') !== 0) { - throw new Error('"' + pathStr + '" must start with "' + - TEST262_ROOT_STR + '/"'); - } - pathStr = pathStr.substring(TEST262_ROOT_STR.length + 1); - } - return validatePath(pathStr.split('/')); - } - platform.toPath = toPath; - - /** - * Does path name a directory? - */ - function isDirectory(path) { - try { - os.system('test', ['-d', toPathStr(path)]); - return true; - } catch (x) { - return false; - } - } - platform.isDirectory = isDirectory; - - /** - * A list of the filenames found in path, which must name a - * directory. - */ - function ls(path) { - var pathStr = toPathStr(path); - if (!isDirectory(path)) { return []; } - var lines; - try { - lines = trim(os.system('ls', [pathStr])); - } catch (err) { - throw err; - } - if (lines === '') { return []; } - return lines.split('\n'); - } - platform.ls = ls; - - /** - * If the directory does not yet exist, create it. - */ - function mkdir(path) { - var pathStr = toPathStr(path); - if (DRY_RUN) { - print('mkdir ' + pathStr); - return; - } - try { - os.mkdirp(pathStr); - } catch (err) { - print('***could not mkdir: ' + pathStr); - throw err; - } - } - platform.mkdir = mkdir; - - /** - * Emits the text itself followed by a newline. - * - *
On the v8 shell, this is identical to "print". - */ - var show = global.t262.show = print; - - /** - * Emits the jsonRecord serialized as JSON, either compactly or - * readably according to VERBOSE. - */ - function showJSON(jsonRecord) { - if (VERBOSE) { - print(JSON.stringify(jsonRecord, void 0, ' ')); - } else { - print(JSON.stringify(jsonRecord)); - } - } - global.t262.showJSON = platform.showJSON = showJSON; - - - ////////////////// Only needed for running tests ////////////////////// - - if (!global.$PRINT) { - global.$PRINT = t262.show; - } - - if (!global.$INCLUDE) { - global.$INCLUDE = function(name) { - // does nothing even locally, since the platform independent - // include processing picks these up anyway. - // load(toPathStr(HARNESS_DIR.concat([name]))); - }; - } - - })(this);