From d4a3479a1ea95b073e7f7e16ef8e984714b0b395 Mon Sep 17 00:00:00 2001
From: Sam Mikes <smikes@cubane.com>
Date: Mon, 21 Jul 2014 15:15:04 +0100
Subject: [PATCH] test262.py: only include helper scripts when needed

test262.py: only supply async helper scripts when test is async
sth.js: factor out function isAsyncTest()
timer.js: improve workaround for async tests when Promise is defined but setTimeout is noot

timer.js emulates setTimeout using Promise by doing a busy loop that checks
if `timeout` milliseconds have elapsed.  Modified check to (timeLeft > 0) instead
of (!timeLeft) to prevent infinite loop when check does not happen to run
at precise millisecond timeout expires.

Because test262.py did not support the $INCLUDE directive, some helper
scripts were added to every test -- notably testIntl, timer, and donePrintHandle
Now that $INCLUDE is supported, these can be dropped, speeding overall test run time
---
 test/harness/sth.js        | 19 +++++++++++--------
 test/harness/timer.js      |  2 +-
 tools/packaging/test262.py | 13 ++++++++-----
 3 files changed, 20 insertions(+), 14 deletions(-)

diff --git a/test/harness/sth.js b/test/harness/sth.js
index cd05685e18..d100e160da 100644
--- a/test/harness/sth.js
+++ b/test/harness/sth.js
@@ -91,6 +91,9 @@ function BrowserRunner() {
         currentTest.code = codeString;
     }
 
+    function isAsyncTest(code) {
+        return /\$DONE()/.test(code));
+    }
 
     /* Run the test. */
     this.run = function (test, code) {
@@ -208,8 +211,8 @@ function BrowserRunner() {
 
         //this is mainly applicable for consoles that do not have setTimeout support
 		//idoc.writeln("<script type='text/javascript' src='harness/timer.js' defer>" + "</script>");
-        if(setTimeout === undefined && /\$DONE()/.test(code)){
-         idoc.writeln("<script type='text/javascript'>");
+        if(setTimeout === undefined && isAsyncTest(code)) {
+        idoc.writeln("<script type='text/javascript'>");
          idoc.writeln(timerContents);
          idoc.writeln("</script>");
         }
@@ -225,15 +228,15 @@ function BrowserRunner() {
 		
         idoc.writeln("<script type='text/javascript'>");
 		
-        if(!/\$DONE()/.test(code))
-        //if the test is synchronous - call $DONE immediately
+        if (!isAsyncTest(code)) {
+            //if the test is synchronous - call $DONE immediately
             idoc.writeln("if(typeof $DONE === 'function') $DONE()");
-        else{
-        //in case the test does not call $DONE asynchronously then
-        //bailout after 1 min or given bailout time by calling $DONE
+        } else {
+            //in case the test does not call $DONE asynchronously then
+            //bailout after 1 min or given bailout time by calling $DONE
             var asyncval = parseInt(test.timeout);
             var testTimeout = asyncval !== asyncval ? 2000 : asyncval;
-			idoc.writeln("setTimeout(function() {$ERROR(\" Test Timed Out at " + testTimeout +"\" )} ," + testTimeout + ")");
+	    idoc.writeln("setTimeout(function() {$ERROR(\" Test Timed Out at " + testTimeout +"\" )} ," + testTimeout + ")");
         }
         idoc.writeln("</script>");
         idoc.close();
diff --git a/test/harness/timer.js b/test/harness/timer.js
index 69762d83f5..4dddbb3a1b 100644
--- a/test/harness/timer.js
+++ b/test/harness/timer.js
@@ -12,7 +12,7 @@ if(Promise !== undefined && this.setTimeout === undefined)
             var end = start + delay;
             function check(){
                 var timeLeft = end - Date.now();        
-                if(timeLeft)
+                if(timeLeft > 0)
                     p.then(check);
                 else
                     callback();
diff --git a/tools/packaging/test262.py b/tools/packaging/test262.py
index 5a1917eaa8..1e7ad1689e 100755
--- a/tools/packaging/test262.py
+++ b/tools/packaging/test262.py
@@ -260,11 +260,14 @@ class TestCase(object):
     # "var testDescrip = " + str(self.testRecord) + ';\n\n' + \
     source = self.suite.GetInclude("cth.js") + \
         self.suite.GetInclude("sta.js") + \
-        self.suite.GetInclude("ed.js") + \
-        self.suite.GetInclude("testBuiltInObject.js") + \
-        self.suite.GetInclude("testIntl.js") + \
-	self.suite.GetInclude("timer.js") + \
-	self.suite.GetInclude("doneprintHandle.js").replace('print', self.suite.print_handle) + \
+        self.suite.GetInclude("ed.js")
+
+    if self.IsAsyncTest():
+      source = source + \
+               self.suite.GetInclude("timer.js") + \
+               self.suite.GetInclude("doneprintHandle.js").replace('print', self.suite.print_handle)
+
+    source = source + \
         self.GetAdditionalIncludes() + \
         self.test + '\n'
 
-- 
GitLab