1616
1717package org .scalajs .macrotaskexecutor
1818
19- import scala .collection .mutable
2019import scala .concurrent .{ExecutionContext , ExecutionContextExecutor }
2120import scala .scalajs .js
21+ import scala .scalajs .js .annotation ._
2222import scala .util .Random
2323import scala .util .control .NonFatal
2424
@@ -34,10 +34,18 @@ object MacrotaskExecutor extends ExecutionContextExecutor {
3434 def reportFailure (cause : Throwable ): Unit =
3535 cause.printStackTrace()
3636
37+ @ js.native
38+ private [this ] trait TaskMap extends js.Object {
39+ @ JSBracketAccess
40+ def apply (handle : Int ): Runnable
41+ @ JSBracketAccess
42+ def update (handle : Int , task : Runnable ): Unit
43+ }
44+
3745 private [this ] val setImmediate : Runnable => Unit = {
3846 if (js.typeOf(js.Dynamic .global.setImmediate) == Undefined ) {
3947 var nextHandle = 1
40- val tasksByHandle = mutable. Map [ Int , Runnable ]()
48+ val tasksByHandle = ( new js. Object ). asInstanceOf [ TaskMap ]
4149 var currentlyRunningATask = false
4250
4351 def canUsePostMessage (): Boolean = {
@@ -63,21 +71,17 @@ object MacrotaskExecutor extends ExecutionContextExecutor {
6371 }
6472 }
6573
66- def runIfPresent (handle : Int ): Unit = {
74+ def runTaskForHandle (handle : Int ): Unit = {
6775 if (currentlyRunningATask) {
68- js.Dynamic .global.setTimeout(() => runIfPresent (handle), 0 )
76+ js.Dynamic .global.setTimeout(() => runTaskForHandle (handle), 0 )
6977 } else {
70- tasksByHandle.get(handle) match {
71- case Some (task) =>
72- currentlyRunningATask = true
73- try {
74- task.run()
75- } finally {
76- tasksByHandle -= handle
77- currentlyRunningATask = false
78- }
79-
80- case None =>
78+ val task = tasksByHandle(handle)
79+ currentlyRunningATask = true
80+ try {
81+ task.run()
82+ } finally {
83+ js.special.delete(tasksByHandle, handle)
84+ currentlyRunningATask = false
8185 }
8286 }
8387
@@ -115,7 +119,7 @@ object MacrotaskExecutor extends ExecutionContextExecutor {
115119 .data
116120 .indexOf(messagePrefix)
117121 .asInstanceOf [Int ] == 0 ) {
118- runIfPresent (event.data.toString.substring(messagePrefix.length).toInt)
122+ runTaskForHandle (event.data.toString.substring(messagePrefix.length).toInt)
119123 }
120124 }
121125
@@ -129,7 +133,7 @@ object MacrotaskExecutor extends ExecutionContextExecutor {
129133 val handle = nextHandle
130134 nextHandle += 1
131135
132- tasksByHandle += (handle -> k)
136+ tasksByHandle(handle) = k
133137 js.Dynamic .global.postMessage(messagePrefix + handle, " *" )
134138 ()
135139 }
@@ -144,7 +148,7 @@ object MacrotaskExecutor extends ExecutionContextExecutor {
144148 val handle = nextHandle
145149 nextHandle += 1
146150
147- tasksByHandle += (handle -> k)
151+ tasksByHandle(handle) = k
148152 channel.port2.postMessage(handle)
149153 ()
150154 }
0 commit comments