From f27e826b140089cbeb722feec96b1aae3e7645a3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?P=C3=A9ter=20Szil=C3=A1gyi?= <peterke@gmail.com>
Date: Mon, 23 Nov 2015 13:03:31 +0200
Subject: [PATCH] jrse: fix #1082, fail if setTimeout/setInterval lack callback

---
 jsre/jsre.go | 20 +++++++++++++++-----
 1 file changed, 15 insertions(+), 5 deletions(-)

diff --git a/jsre/jsre.go b/jsre/jsre.go
index af7d507c6..a4c9d970b 100644
--- a/jsre/jsre.go
+++ b/jsre/jsre.go
@@ -85,7 +85,6 @@ func (self *JSRE) runEventLoop() {
 	ready := make(chan *jsTimer)
 
 	newTimer := func(call otto.FunctionCall, interval bool) (*jsTimer, otto.Value) {
-
 		delay, _ := call.Argument(1).ToInteger()
 		if 0 >= delay {
 			delay = 1
@@ -105,7 +104,6 @@ func (self *JSRE) runEventLoop() {
 		if err != nil {
 			panic(err)
 		}
-
 		return timer, value
 	}
 
@@ -127,8 +125,20 @@ func (self *JSRE) runEventLoop() {
 		}
 		return otto.UndefinedValue()
 	}
-	vm.Set("setTimeout", setTimeout)
-	vm.Set("setInterval", setInterval)
+	vm.Set("_setTimeout", setTimeout)
+	vm.Set("_setInterval", setInterval)
+	vm.Run(`var setTimeout = function(args) {
+		if (arguments.length < 1) {
+			throw TypeError("Failed to execute 'setTimeout': 1 argument required, but only 0 present.");
+		}
+		return _setTimeout.apply(this, arguments);
+	}`)
+	vm.Run(`var setInterval = function(args) {
+		if (arguments.length < 1) {
+			throw TypeError("Failed to execute 'setInterval': 1 argument required, but only 0 present.");
+		}
+		return _setInterval.apply(this, arguments);
+	}`)
 	vm.Set("clearTimeout", clearTimeout)
 	vm.Set("clearInterval", clearTimeout)
 
@@ -154,7 +164,7 @@ loop:
 			if err != nil {
 				fmt.Println("js error:", err, arguments)
 			}
-		
+
 			_, inreg := registry[timer] // when clearInterval is called from within the callback don't reset it
 			if timer.interval && inreg {
 				timer.timer.Reset(timer.duration)
-- 
GitLab