1616
1717package org .scalajs .macrotaskexecutor
1818
19- import scala . collection . mutable
19+ import java . util . HashMap
2020import scala .concurrent .{ExecutionContext , ExecutionContextExecutor }
2121import scala .scalajs .js
22+ import scala .scalajs .js .annotation ._
2223import scala .util .Random
2324import scala .util .control .NonFatal
2425
@@ -34,10 +35,18 @@ object MacrotaskExecutor extends ExecutionContextExecutor {
3435 def reportFailure (cause : Throwable ): Unit =
3536 cause.printStackTrace()
3637
38+ @ js.native
39+ private trait TaskMap extends js.Object {
40+ @ JSBracketAccess
41+ def apply (handle : Int ): Runnable = js.native
42+ @ JSBracketAccess
43+ def update (handle : Int , task : Runnable ): Unit = js.native
44+ }
45+
3746 private [this ] val setImmediate : Runnable => Unit = {
3847 if (js.typeOf(js.Dynamic .global.setImmediate) == Undefined ) {
3948 var nextHandle = 1
40- val tasksByHandle = mutable. Map [ Int , Runnable ]()
49+ val tasksByHandle = ( new js. Object ). asInstanceOf [ TaskMap ]
4150 var currentlyRunningATask = false
4251
4352 def canUsePostMessage (): Boolean = {
@@ -67,17 +76,15 @@ object MacrotaskExecutor extends ExecutionContextExecutor {
6776 if (currentlyRunningATask) {
6877 js.Dynamic .global.setTimeout(() => runIfPresent(handle), 0 )
6978 } 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 =>
79+ val task = tasksByHandle(handle)
80+ if (task ne null ) {
81+ currentlyRunningATask = true
82+ try {
83+ task.run()
84+ } finally {
85+ js.special.delete(tasksByHandle, handle)
86+ currentlyRunningATask = false
87+ }
8188 }
8289 }
8390
@@ -129,7 +136,7 @@ object MacrotaskExecutor extends ExecutionContextExecutor {
129136 val handle = nextHandle
130137 nextHandle += 1
131138
132- tasksByHandle += (handle -> k)
139+ tasksByHandle(handle) = k
133140 js.Dynamic .global.postMessage(messagePrefix + handle, " *" )
134141 ()
135142 }
@@ -144,7 +151,7 @@ object MacrotaskExecutor extends ExecutionContextExecutor {
144151 val handle = nextHandle
145152 nextHandle += 1
146153
147- tasksByHandle += (handle -> k)
154+ tasksByHandle(handle) = k
148155 channel.port2.postMessage(handle)
149156 ()
150157 }
0 commit comments