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