UNPKG

@woosh/meep-engine

Version:

Pure JavaScript game engine. Fully featured and production ready.

60 lines (50 loc) 1.43 kB
import { assert } from "../../assert.js"; import { SignalHandlerFlags } from "./SignalHandler.js"; /** * Common dispatch stack * @readonly * @type {SignalHandler[]} */ const dispatch_stack = []; let dispatch_stack_top = 0; /** * * @param {function} f * @param {*} context * @param {Array} args */ function dispatchCallback(f, context, args) { assert.isFunction(f, 'f'); try { f.apply(context, args) } catch (e) { console.error("Failed to dispatch handler", f, e); } } /** * * @param {SignalHandler[]} handlers * @param {Array} [args] */ export function dispatchViaProxy(handlers, args) { const length = handlers.length; const stack_pointer = dispatch_stack_top; const stack_frame_end = stack_pointer + length; dispatch_stack_top = stack_frame_end; let i, h; for (i = 0; i < length; i++) { //copy to proxy dispatch_stack[stack_pointer + i] = handlers[length - (i + 1)]; } for (i = stack_frame_end - 1; i >= stack_pointer; i--) { h = dispatch_stack[i]; if (h.getFlag(SignalHandlerFlags.RemoveAfterExecution)) { //handler should be cut const p = handlers.indexOf(h); handlers.splice(p, 1); } dispatchCallback(h.handle, h.context, args); } //drop stack frame dispatch_stack_top = stack_pointer; }