/** * Expands the event queue capacity, or truncates if capacity is lower than * current capacity. Then only the newest entries are kept * @param self self reference * @param newCapacity new capacity */ @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR) public static void expandEventQueueCapacity(final Object self, final Object newCapacity) { final LinkedList<RuntimeEvent<?>> q = getEventQueue(self); final int nc = JSType.toInt32(newCapacity); while (q.size() > nc) { q.removeFirst(); } setEventQueueCapacity(self, nc); }
/** * Add a runtime event to the runtime event queue. The queue has a fixed * size {@link RuntimeEvent#RUNTIME_EVENT_QUEUE_SIZE} and the oldest * entry will be thrown out of the queue is about to overflow * @param self self reference * @param event event to add */ @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR) public static void addRuntimeEvent(final Object self, final Object event) { final LinkedList<RuntimeEvent<?>> q = getEventQueue(self); final int cap = (Integer)getEventQueueCapacity(self); while (q.size() >= cap) { q.removeFirst(); } q.addLast(getEvent(event)); }
/** * Get the capacity of the event queue * @param self self reference * @return capacity of event queue as an integer */ @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR) public static Object getEventQueueCapacity(final Object self) { final ScriptObject sobj = (ScriptObject)self; Integer cap; if (sobj.has(EVENT_QUEUE_CAPACITY)) { cap = JSType.toInt32(sobj.get(EVENT_QUEUE_CAPACITY)); } else { setEventQueueCapacity(self, cap = RuntimeEvent.RUNTIME_EVENT_QUEUE_SIZE); } return cap; }
/** * Remove a specific runtime event from the event queue * @param self self reference * @param event event to remove */ @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR) public static void removeRuntimeEvent(final Object self, final Object event) { final LinkedList<RuntimeEvent<?>> q = getEventQueue(self); final RuntimeEvent<?> re = getEvent(event); if (!q.remove(re)) { throw new IllegalStateException("runtime event " + re + " was not in event queue"); } }
@SuppressWarnings("unchecked") private static LinkedList<RuntimeEvent<?>> getEventQueue(final Object self) { final ScriptObject sobj = (ScriptObject)self; LinkedList<RuntimeEvent<?>> q; if (sobj.has(EVENT_QUEUE)) { q = (LinkedList<RuntimeEvent<?>>)((ScriptObject)self).get(EVENT_QUEUE); } else { ((ScriptObject)self).set(EVENT_QUEUE, q = new LinkedList<>(), NashornCallSiteDescriptor.CALLSITE_STRICT); } return q; }
private static void logEvent(final RuntimeEvent<?> event) { if (event != null) { final Global global = Context.getGlobal(); if (global.has("Debug")) { final ScriptObject debug = (ScriptObject)global.get("Debug"); final ScriptFunction addRuntimeEvent = (ScriptFunction)debug.get("addRuntimeEvent"); ScriptRuntime.apply(addRuntimeEvent, debug, event); } } }
/** * Clear the runtime event queue * @param self self reference */ @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR) public static void clearRuntimeEvents(final Object self) { final LinkedList<RuntimeEvent<?>> q = getEventQueue(self); q.clear(); }
/** * Return the last runtime event in the queue * @param self self reference * @return the freshest event, null if queue is empty */ @Function(attributes = Attribute.NOT_ENUMERABLE, where = Where.CONSTRUCTOR) public static Object getLastRuntimeEvent(final Object self) { final LinkedList<RuntimeEvent<?>> q = getEventQueue(self); return q.isEmpty() ? null : q.getLast(); }