13af6ab5fSopenharmony_ciFrom 1d1fe8d96215edb5f1a9b4fe8c305417eca0aac1 Mon Sep 17 00:00:00 2001 23af6ab5fSopenharmony_ciFrom: John Doe <john.d@corp.com> 33af6ab5fSopenharmony_ciDate: Fri, 26 Jul 2024 22:33:11 +0800 43af6ab5fSopenharmony_ciSubject: [PATCH] 53af6ab5fSopenharmony_ci 63af6ab5fSopenharmony_ciSigned-off-by: John Doe <john.d@corp.com> 73af6ab5fSopenharmony_ci--- 83af6ab5fSopenharmony_ci lib/Agent.js | 1 + 93af6ab5fSopenharmony_ci lib/ConsoleAgent.js | 55 +++++++++++++++------------ 103af6ab5fSopenharmony_ci lib/agents/panda.js | 88 ++++++++++++++++++++++++++++++++++++++++++++ 113af6ab5fSopenharmony_ci lib/dependencies.js | 6 +-- 123af6ab5fSopenharmony_ci lib/write-sources.js | 27 +++++++++----- 133af6ab5fSopenharmony_ci runtimes/panda.js | 44 ++++++++++++++++++++++ 143af6ab5fSopenharmony_ci 6 files changed, 184 insertions(+), 37 deletions(-) 153af6ab5fSopenharmony_ci create mode 100644 lib/agents/panda.js 163af6ab5fSopenharmony_ci create mode 100644 runtimes/panda.js 173af6ab5fSopenharmony_ci 183af6ab5fSopenharmony_cidiff --git a/lib/Agent.js b/lib/Agent.js 193af6ab5fSopenharmony_ciindex edcdf0e..7e655c5 100644 203af6ab5fSopenharmony_ci--- a/lib/Agent.js 213af6ab5fSopenharmony_ci+++ b/lib/Agent.js 223af6ab5fSopenharmony_ci@@ -7,6 +7,7 @@ class Agent { 233af6ab5fSopenharmony_ci this.args = options.hostArguments || []; 243af6ab5fSopenharmony_ci this.transform = options.transform || (x => x); 253af6ab5fSopenharmony_ci this.out = options.out || ''; 263af6ab5fSopenharmony_ci+ this.test262Dir = options.test262Dir; 273af6ab5fSopenharmony_ci 283af6ab5fSopenharmony_ci if (typeof this.args === 'string') { 293af6ab5fSopenharmony_ci this.args = this.args.includes(' ') ? 303af6ab5fSopenharmony_cidiff --git a/lib/ConsoleAgent.js b/lib/ConsoleAgent.js 313af6ab5fSopenharmony_ciindex 947c1db..3fcd363 100644 323af6ab5fSopenharmony_ci--- a/lib/ConsoleAgent.js 333af6ab5fSopenharmony_ci+++ b/lib/ConsoleAgent.js 343af6ab5fSopenharmony_ci@@ -19,7 +19,7 @@ const { 353af6ab5fSopenharmony_ci const cpSym = Symbol.for('cp'); 363af6ab5fSopenharmony_ci const tpSym = Symbol.for('tp'); 373af6ab5fSopenharmony_ci 383af6ab5fSopenharmony_ci-function generateTempFileName() { 393af6ab5fSopenharmony_ci+function generateTempFileName(file) { 403af6ab5fSopenharmony_ci const now = Date.now(); 413af6ab5fSopenharmony_ci return `f-${now}-${process.pid}-${(Math.random() * 0x100000000 + 1).toString(36)}.js`; 423af6ab5fSopenharmony_ci } 433af6ab5fSopenharmony_ci@@ -47,9 +47,28 @@ class ConsoleAgent extends Agent { 443af6ab5fSopenharmony_ci } 453af6ab5fSopenharmony_ci } 463af6ab5fSopenharmony_ci 473af6ab5fSopenharmony_ci+ genTempFileName(code){ 483af6ab5fSopenharmony_ci+ let file = code.file; 493af6ab5fSopenharmony_ci+ let scenario = code.scenario === 'strict mode' ? '' : code.scenario; 503af6ab5fSopenharmony_ci+ let tmps = file.split(this.test262Dir); 513af6ab5fSopenharmony_ci+ let tempFile = path.join(this.out, tmps[1]); 523af6ab5fSopenharmony_ci+ tempFile = tempFile.substring(0, tempFile.indexOf('.js')); 533af6ab5fSopenharmony_ci+ let fileBase = path.basename(tempFile); 543af6ab5fSopenharmony_ci+ if (tempFile.indexOf("/dynamic-import/") != -1 || tempFile.indexOf("\\dynamic-import\\") != -1) { 553af6ab5fSopenharmony_ci+ tempFile = path.join(tempFile, "/", fileBase); 563af6ab5fSopenharmony_ci+ } 573af6ab5fSopenharmony_ci+ tempFile = path.normalize( 583af6ab5fSopenharmony_ci+ `${tempFile}${scenario}.js` 593af6ab5fSopenharmony_ci+ ); 603af6ab5fSopenharmony_ci+ return tempFile; 613af6ab5fSopenharmony_ci+ } 623af6ab5fSopenharmony_ci+ 633af6ab5fSopenharmony_ci evalScript(code, options = {}) { 643af6ab5fSopenharmony_ci- let tempfile = path.join(this[tpSym], generateTempFileName()); 653af6ab5fSopenharmony_ci- let temppath = this[tpSym]; 663af6ab5fSopenharmony_ci+ let fileBase = path.basename(code.file); 673af6ab5fSopenharmony_ci+ let originalFilePath = code.file.split(fileBase)[0]; 683af6ab5fSopenharmony_ci+ let tempFile = this.genTempFileName(code); 693af6ab5fSopenharmony_ci+ let outputFilePath = path.basename(tempFile); 703af6ab5fSopenharmony_ci+ let depTempPath = tempFile.substring(0, tempFile.indexOf(outputFilePath)); 713af6ab5fSopenharmony_ci 723af6ab5fSopenharmony_ci let isExpectingRawSource = false; 733af6ab5fSopenharmony_ci let hasDependencies = false; 743af6ab5fSopenharmony_ci@@ -57,11 +76,6 @@ class ConsoleAgent extends Agent { 753af6ab5fSopenharmony_ci const sources = []; 763af6ab5fSopenharmony_ci const dependencies = []; 773af6ab5fSopenharmony_ci 783af6ab5fSopenharmony_ci- if (this.out) { 793af6ab5fSopenharmony_ci- tempfile = tempfile.replace(temppath, this.out); 803af6ab5fSopenharmony_ci- temppath = this.out; 813af6ab5fSopenharmony_ci- } 823af6ab5fSopenharmony_ci- 833af6ab5fSopenharmony_ci // When evalScript is called with a test262-stream test record: 843af6ab5fSopenharmony_ci if (typeof code === 'object' && code.contents) { 853af6ab5fSopenharmony_ci let {attrs, contents, file} = code; 863af6ab5fSopenharmony_ci@@ -84,13 +98,6 @@ class ConsoleAgent extends Agent { 873af6ab5fSopenharmony_ci hasDependencies = false; 883af6ab5fSopenharmony_ci } 893af6ab5fSopenharmony_ci 903af6ab5fSopenharmony_ci- if (options.module || attrs.flags.module || 913af6ab5fSopenharmony_ci- hasModuleSpecifier(contents)) { 923af6ab5fSopenharmony_ci- // When testing module or dynamic import code that imports itself, 933af6ab5fSopenharmony_ci- // we must copy the test file with its actual name. 943af6ab5fSopenharmony_ci- tempfile = path.join(temppath, sourcebase); 953af6ab5fSopenharmony_ci- } 963af6ab5fSopenharmony_ci- 973af6ab5fSopenharmony_ci // The test record in "code" is no longer needed and 983af6ab5fSopenharmony_ci // all further operations expect the "code" argument to be 993af6ab5fSopenharmony_ci // a string, make that true for back-compat. 1003af6ab5fSopenharmony_ci@@ -112,7 +119,7 @@ class ConsoleAgent extends Agent { 1013af6ab5fSopenharmony_ci // raw source code. 1023af6ab5fSopenharmony_ci // - The file name of the test being executed, but within 1033af6ab5fSopenharmony_ci // the os's temporary file directory 1043af6ab5fSopenharmony_ci- sources.push([ tempfile, code ]); 1053af6ab5fSopenharmony_ci+ sources.push([ tempFile, code ]); 1063af6ab5fSopenharmony_ci 1073af6ab5fSopenharmony_ci // If any dependencies were discovered, there will be 1083af6ab5fSopenharmony_ci if (hasDependencies) { 1093af6ab5fSopenharmony_ci@@ -123,23 +130,24 @@ class ConsoleAgent extends Agent { 1103af6ab5fSopenharmony_ci // 3. Push the dependency and source into the sources to be written. 1113af6ab5fSopenharmony_ci // 1123af6ab5fSopenharmony_ci dependencies.forEach(file => { 1133af6ab5fSopenharmony_ci- let absname = path.join(temppath, file); 1143af6ab5fSopenharmony_ci- let depsource = rawSource.get(path.basename(file)); 1153af6ab5fSopenharmony_ci+ let absName = path.join(depTempPath, file); 1163af6ab5fSopenharmony_ci+ let depFile = path.join(originalFilePath, file); 1173af6ab5fSopenharmony_ci+ let depSource = rawSource.get(depFile); 1183af6ab5fSopenharmony_ci 1193af6ab5fSopenharmony_ci // Sometimes a test file might want to import itself, 1203af6ab5fSopenharmony_ci // which is a valid exercise of the import semantics. 1213af6ab5fSopenharmony_ci // Here we avoid adding the test file more than once. 1223af6ab5fSopenharmony_ci- if (absname !== tempfile) { 1233af6ab5fSopenharmony_ci+ if (absName !== tempFile) { 1243af6ab5fSopenharmony_ci sources.push([ 1253af6ab5fSopenharmony_ci- absname, 1263af6ab5fSopenharmony_ci- depsource 1273af6ab5fSopenharmony_ci+ absName, 1283af6ab5fSopenharmony_ci+ depSource 1293af6ab5fSopenharmony_ci ]); 1303af6ab5fSopenharmony_ci } 1313af6ab5fSopenharmony_ci }); 1323af6ab5fSopenharmony_ci } 1333af6ab5fSopenharmony_ci 1343af6ab5fSopenharmony_ci this[cpSym] = writeSources(sources) 1353af6ab5fSopenharmony_ci- .then(() => this.createChildProcess([tempfile])); 1363af6ab5fSopenharmony_ci+ .then(() => this.createChildProcess([tempFile])); 1373af6ab5fSopenharmony_ci 1383af6ab5fSopenharmony_ci return this[cpSym].then(child => { 1393af6ab5fSopenharmony_ci let stdout = ''; 1403af6ab5fSopenharmony_ci@@ -158,10 +166,9 @@ class ConsoleAgent extends Agent { 1413af6ab5fSopenharmony_ci }); 1423af6ab5fSopenharmony_ci }).then(({stdout, stderr}) => { 1433af6ab5fSopenharmony_ci // Remove _all_ sources 1443af6ab5fSopenharmony_ci- sources.forEach(({0: file}) => fs.unlink(file, () => { /* ignore */ })); 1453af6ab5fSopenharmony_ci+ // sources.forEach(({0: file}) => fs.unlink(file, () => { /* ignore */ })); 1463af6ab5fSopenharmony_ci 1473af6ab5fSopenharmony_ci const result = this.normalizeResult({ stderr, stdout }); 1483af6ab5fSopenharmony_ci- 1493af6ab5fSopenharmony_ci result.error = this.parseError(result.stderr); 1503af6ab5fSopenharmony_ci 1513af6ab5fSopenharmony_ci return result; 1523af6ab5fSopenharmony_cidiff --git a/lib/agents/panda.js b/lib/agents/panda.js 1533af6ab5fSopenharmony_cinew file mode 100644 1543af6ab5fSopenharmony_ciindex 0000000..ab22b47 1553af6ab5fSopenharmony_ci--- /dev/null 1563af6ab5fSopenharmony_ci+++ b/lib/agents/panda.js 1573af6ab5fSopenharmony_ci@@ -0,0 +1,88 @@ 1583af6ab5fSopenharmony_ci+'use strict'; 1593af6ab5fSopenharmony_ci+ 1603af6ab5fSopenharmony_ci+const fs = require('fs'); 1613af6ab5fSopenharmony_ci+const runtimePath = require('../runtime-path'); 1623af6ab5fSopenharmony_ci+const ConsoleAgent = require('../ConsoleAgent'); 1633af6ab5fSopenharmony_ci+ 1643af6ab5fSopenharmony_ci+const errorRe = /[(](\d+),(\d+)[)]: (.*)/; 1653af6ab5fSopenharmony_ci+const errorRe1 = /^(\w+): (.*)$/m; 1663af6ab5fSopenharmony_ci+// const errorRe2 = /^(?:(\w+): (.*))|(?:(\w+))$/m; 1673af6ab5fSopenharmony_ci+const errorRe2 = /(\w+): (\w+): (.*)$/m; 1683af6ab5fSopenharmony_ci+ 1693af6ab5fSopenharmony_ci+function parseSyntaxError(syntaxErrorMessage) { 1703af6ab5fSopenharmony_ci+ const matches = syntaxErrorMessage.match(); 1713af6ab5fSopenharmony_ci+ if (matches && matches.length) { 1723af6ab5fSopenharmony_ci+ return { 1733af6ab5fSopenharmony_ci+ message: matches[3], 1743af6ab5fSopenharmony_ci+ lineNumber: Number(matches[1]), 1753af6ab5fSopenharmony_ci+ columnNumber: Number(matches[2]) 1763af6ab5fSopenharmony_ci+ }; 1773af6ab5fSopenharmony_ci+ } 1783af6ab5fSopenharmony_ci+ return null; 1793af6ab5fSopenharmony_ci+} 1803af6ab5fSopenharmony_ci+ 1813af6ab5fSopenharmony_ci+class PandaAgent extends ConsoleAgent{ 1823af6ab5fSopenharmony_ci+ constructor(options) { 1833af6ab5fSopenharmony_ci+ super(options); 1843af6ab5fSopenharmony_ci+ } 1853af6ab5fSopenharmony_ci+ 1863af6ab5fSopenharmony_ci+ createChildProcess(args) { 1873af6ab5fSopenharmony_ci+ let js_file = args[0] 1883af6ab5fSopenharmony_ci+ args = [] 1893af6ab5fSopenharmony_ci+ args.unshift(`--js-file=${js_file}`) 1903af6ab5fSopenharmony_ci+ return super.createChildProcess(args); 1913af6ab5fSopenharmony_ci+ } 1923af6ab5fSopenharmony_ci+ 1933af6ab5fSopenharmony_ci+ evalScript(code, options = {}) { 1943af6ab5fSopenharmony_ci+ return super.evalScript(code, options); 1953af6ab5fSopenharmony_ci+ } 1963af6ab5fSopenharmony_ci+ 1973af6ab5fSopenharmony_ci+ parseError(str) { 1983af6ab5fSopenharmony_ci+ let match = str.match(errorRe1); 1993af6ab5fSopenharmony_ci+ if (match) { 2003af6ab5fSopenharmony_ci+ return { 2013af6ab5fSopenharmony_ci+ name: match[1], 2023af6ab5fSopenharmony_ci+ message: match[2], 2033af6ab5fSopenharmony_ci+ stack: [], 2043af6ab5fSopenharmony_ci+ }; 2053af6ab5fSopenharmony_ci+ } else { 2063af6ab5fSopenharmony_ci+ // Syntax errors don't have nice error messages... 2073af6ab5fSopenharmony_ci+ let error = null; 2083af6ab5fSopenharmony_ci+ let errors = str.match(/[(](\d+),(\d+)[)]: (.*)/gm); 2093af6ab5fSopenharmony_ci+ 2103af6ab5fSopenharmony_ci+ if (errors && errors.length) { 2113af6ab5fSopenharmony_ci+ error = { 2123af6ab5fSopenharmony_ci+ name: 'SyntaxError', 2133af6ab5fSopenharmony_ci+ message: errors[0], 2143af6ab5fSopenharmony_ci+ stack: [] 2153af6ab5fSopenharmony_ci+ }; 2163af6ab5fSopenharmony_ci+ 2173af6ab5fSopenharmony_ci+ const stack = parseSyntaxError(errors[0]); 2183af6ab5fSopenharmony_ci+ 2193af6ab5fSopenharmony_ci+ if (stack) { 2203af6ab5fSopenharmony_ci+ error.stack.push(stack); 2213af6ab5fSopenharmony_ci+ error.message = stack.message; 2223af6ab5fSopenharmony_ci+ } 2233af6ab5fSopenharmony_ci+ } 2243af6ab5fSopenharmony_ci+ 2253af6ab5fSopenharmony_ci+ if (error) { 2263af6ab5fSopenharmony_ci+ return error; 2273af6ab5fSopenharmony_ci+ } 2283af6ab5fSopenharmony_ci+ 2293af6ab5fSopenharmony_ci+ // Last chance... 2303af6ab5fSopenharmony_ci+ errors = str.match(errorRe2); 2313af6ab5fSopenharmony_ci+ if (errors && errors.length >3) { 2323af6ab5fSopenharmony_ci+ return { 2333af6ab5fSopenharmony_ci+ name: errors[2], 2343af6ab5fSopenharmony_ci+ message: errors[0], 2353af6ab5fSopenharmony_ci+ stack: [], 2363af6ab5fSopenharmony_ci+ }; 2373af6ab5fSopenharmony_ci+ } 2383af6ab5fSopenharmony_ci+ } 2393af6ab5fSopenharmony_ci+ 2403af6ab5fSopenharmony_ci+ return null; 2413af6ab5fSopenharmony_ci+ } 2423af6ab5fSopenharmony_ci+} 2433af6ab5fSopenharmony_ci+ 2443af6ab5fSopenharmony_ci+PandaAgent.runtime = fs.readFileSync(runtimePath.for('panda'), 'utf8'); 2453af6ab5fSopenharmony_ci+module.exports = PandaAgent; 2463af6ab5fSopenharmony_ci\ No newline at end of file 2473af6ab5fSopenharmony_cidiff --git a/lib/dependencies.js b/lib/dependencies.js 2483af6ab5fSopenharmony_ciindex 00de9a4..3de6002 100644 2493af6ab5fSopenharmony_ci--- a/lib/dependencies.js 2503af6ab5fSopenharmony_ci+++ b/lib/dependencies.js 2513af6ab5fSopenharmony_ci@@ -46,12 +46,12 @@ function getDependencies(file, accum = []) { 2523af6ab5fSopenharmony_ci let basename = path.basename(file); 2533af6ab5fSopenharmony_ci let contents = ''; 2543af6ab5fSopenharmony_ci 2553af6ab5fSopenharmony_ci- if (rawSourceCache.has(basename)) { 2563af6ab5fSopenharmony_ci- contents = rawSourceCache.get(basename); 2573af6ab5fSopenharmony_ci+ if (rawSourceCache.has(file)) { 2583af6ab5fSopenharmony_ci+ contents = rawSourceCache.get(file); 2593af6ab5fSopenharmony_ci } else { 2603af6ab5fSopenharmony_ci try { 2613af6ab5fSopenharmony_ci contents = fs.readFileSync(file, 'utf8'); 2623af6ab5fSopenharmony_ci- rawSourceCache.set(basename, contents); 2633af6ab5fSopenharmony_ci+ rawSourceCache.set(file, contents); 2643af6ab5fSopenharmony_ci } catch (error) { 2653af6ab5fSopenharmony_ci accum.splice(accum.indexOf(basename), 1); 2663af6ab5fSopenharmony_ci } 2673af6ab5fSopenharmony_cidiff --git a/lib/write-sources.js b/lib/write-sources.js 2683af6ab5fSopenharmony_ciindex ba7ce71..408091e 100644 2693af6ab5fSopenharmony_ci--- a/lib/write-sources.js 2703af6ab5fSopenharmony_ci+++ b/lib/write-sources.js 2713af6ab5fSopenharmony_ci@@ -1,12 +1,14 @@ 2723af6ab5fSopenharmony_ci 'use strict'; 2733af6ab5fSopenharmony_ci 2743af6ab5fSopenharmony_ci-const fs = require('fs'); 2753af6ab5fSopenharmony_ci-const path = require('path'); 2763af6ab5fSopenharmony_ci+let fs; 2773af6ab5fSopenharmony_ci+ 2783af6ab5fSopenharmony_ci+try { 2793af6ab5fSopenharmony_ci+ fs = require('fs/promises'); 2803af6ab5fSopenharmony_ci+} catch(error) { 2813af6ab5fSopenharmony_ci+ fs = require('fs').promises; 2823af6ab5fSopenharmony_ci+} 2833af6ab5fSopenharmony_ci 2843af6ab5fSopenharmony_ci-const promisify = require('./promisify'); 2853af6ab5fSopenharmony_ci-const mkdir = promisify(fs.mkdir); 2863af6ab5fSopenharmony_ci-const stat = promisify(fs.stat); 2873af6ab5fSopenharmony_ci-const writeFile = promisify(fs.writeFile); 2883af6ab5fSopenharmony_ci+const path = require('path'); 2893af6ab5fSopenharmony_ci 2903af6ab5fSopenharmony_ci module.exports = async function(sources) { 2913af6ab5fSopenharmony_ci let {0: [file]} = sources; 2923af6ab5fSopenharmony_ci@@ -17,18 +19,23 @@ module.exports = async function(sources) { 2933af6ab5fSopenharmony_ci first: path to output file 2943af6ab5fSopenharmony_ci second: contents 2953af6ab5fSopenharmony_ci */ 2963af6ab5fSopenharmony_ci- return await Promise.all( 2973af6ab5fSopenharmony_ci- sources.map(args => writeFile(...args)) 2983af6ab5fSopenharmony_ci+ return Promise.all( 2993af6ab5fSopenharmony_ci+ sources.map(args => fs.writeFile(...args, { flag: "wx" }).catch( 3003af6ab5fSopenharmony_ci+ error => { 3013af6ab5fSopenharmony_ci+ if (error && error.code !== 'EEXIST') { 3023af6ab5fSopenharmony_ci+ throw error 3033af6ab5fSopenharmony_ci+ } 3043af6ab5fSopenharmony_ci+ })) 3053af6ab5fSopenharmony_ci ); 3063af6ab5fSopenharmony_ci }; 3073af6ab5fSopenharmony_ci 3083af6ab5fSopenharmony_ci async function safeMkdir(dir) { 3093af6ab5fSopenharmony_ci try { 3103af6ab5fSopenharmony_ci- await stat(dir); 3113af6ab5fSopenharmony_ci+ await fs.stat(dir); 3123af6ab5fSopenharmony_ci } catch (error) { 3133af6ab5fSopenharmony_ci if (error.code === 'ENOENT') { 3143af6ab5fSopenharmony_ci try { 3153af6ab5fSopenharmony_ci- await mkdir(dir); 3163af6ab5fSopenharmony_ci+ await fs.mkdir(dir); 3173af6ab5fSopenharmony_ci } catch ({}) { 3183af6ab5fSopenharmony_ci // suppressed? 3193af6ab5fSopenharmony_ci } 3203af6ab5fSopenharmony_cidiff --git a/runtimes/panda.js b/runtimes/panda.js 3213af6ab5fSopenharmony_cinew file mode 100644 3223af6ab5fSopenharmony_ciindex 0000000..0acbd09 3233af6ab5fSopenharmony_ci--- /dev/null 3243af6ab5fSopenharmony_ci+++ b/runtimes/panda.js 3253af6ab5fSopenharmony_ci@@ -0,0 +1,44 @@ 3263af6ab5fSopenharmony_ci+if (!globalThis.$262) { 3273af6ab5fSopenharmony_ci+ globalThis.$262 = { 3283af6ab5fSopenharmony_ci+ global: globalThis, 3293af6ab5fSopenharmony_ci+ evalScript(code) { 3303af6ab5fSopenharmony_ci+ try { 3313af6ab5fSopenharmony_ci+ global.evalScript(code); 3323af6ab5fSopenharmony_ci+ return { type: 'normal', value: undefined }; 3333af6ab5fSopenharmony_ci+ } catch (e) { 3343af6ab5fSopenharmony_ci+ return { type: 'throw', value: e }; 3353af6ab5fSopenharmony_ci+ } 3363af6ab5fSopenharmony_ci+ }, 3373af6ab5fSopenharmony_ci+ gc() { 3383af6ab5fSopenharmony_ci+ throw new Test262Error('gc() not yet supported.'); 3393af6ab5fSopenharmony_ci+ }, 3403af6ab5fSopenharmony_ci+ getGlobal(name) { 3413af6ab5fSopenharmony_ci+ return global[name]; 3423af6ab5fSopenharmony_ci+ }, 3433af6ab5fSopenharmony_ci+ setGlobal(name, value) { 3443af6ab5fSopenharmony_ci+ global[name] = value; 3453af6ab5fSopenharmony_ci+ }, 3463af6ab5fSopenharmony_ci+ agent: (function() { 3473af6ab5fSopenharmony_ci+ function thrower() { 3483af6ab5fSopenharmony_ci+ throw new Test262Error('agent.* not yet supported.'); 3493af6ab5fSopenharmony_ci+ }; 3503af6ab5fSopenharmony_ci+ return { 3513af6ab5fSopenharmony_ci+ start: thrower, 3523af6ab5fSopenharmony_ci+ broadcast: thrower, 3533af6ab5fSopenharmony_ci+ getReport: thrower, 3543af6ab5fSopenharmony_ci+ sleep: thrower, 3553af6ab5fSopenharmony_ci+ monotonicNow: thrower, 3563af6ab5fSopenharmony_ci+ }; 3573af6ab5fSopenharmony_ci+ })(), 3583af6ab5fSopenharmony_ci+ }; 3593af6ab5fSopenharmony_ci+} 3603af6ab5fSopenharmony_ci+ 3613af6ab5fSopenharmony_ci+$262.IsHTMLDDA = function() {}; 3623af6ab5fSopenharmony_ci+$262.destroy = function() {}; 3633af6ab5fSopenharmony_ci+$262.getGlobal = function(name) { 3643af6ab5fSopenharmony_ci+ return this.global[name]; 3653af6ab5fSopenharmony_ci+}; 3663af6ab5fSopenharmony_ci+$262.setGlobal = function(name, value) { 3673af6ab5fSopenharmony_ci+ this.global[name] = value; 3683af6ab5fSopenharmony_ci+}; 3693af6ab5fSopenharmony_ci+$262.source = $SOURCE; 3703af6ab5fSopenharmony_ci-- 3713af6ab5fSopenharmony_ci2.25.1 3723af6ab5fSopenharmony_ci 373