private void Capture(ScriptRuntime runtime)
        {
            var snapshot = GetSnapshot(runtime.id);

            snapshot.alive = true;
            unsafe
            {
                fixed(Native.JSMemoryUsage *ptr = &snapshot.memoryUsage)
                {
                    Native.JSApi.JS_ComputeMemoryUsage(runtime, ptr);
                }
            }

            var typeDB = runtime.GetTypeDB();

            snapshot.exportedTypes = typeDB.Count;

            var objectCache = runtime.GetObjectCache();

            snapshot.managedObjectCount = objectCache.GetManagedObjectCount();
            snapshot.jSObjectCount      = objectCache.GetJSObjectCount();
            snapshot.delegateCount      = objectCache.GetDelegateCount();
            snapshot.scriptValueCount   = objectCache.GetScriptValueCount();
            snapshot.scriptPromiseCount = objectCache.GetScriptPromiseCount();

            var timeManager = runtime.GetTimerManager();

            snapshot.activeTimer = timeManager.GetActiveTimeHandleCount();
        }
        private void InspectRuntime(ScriptRuntime runtime)
        {
            if (!_touch)
            {
                Capture(runtime);
            }

            if (GUILayout.Button("Capture"))
            {
                Capture(runtime);
            }

            _sv = EditorGUILayout.BeginScrollView(_sv);
            Block("JSMemoryUsage", () =>
            {
                EditorGUILayout.TextField("malloc_size", ToSizeText(_memoryUsage.malloc_size));
                EditorGUILayout.TextField("malloc_limit", ToCountText(_memoryUsage.malloc_limit));
                EditorGUILayout.TextField("memory_used_size", ToSizeText(_memoryUsage.memory_used_size));
                EditorGUILayout.TextField("malloc_count", ToCountText(_memoryUsage.malloc_count));
                EditorGUILayout.TextField("memory_used_count", ToCountText(_memoryUsage.memory_used_count));
                EditorGUILayout.TextField("atom_count", ToCountText(_memoryUsage.atom_count));
                EditorGUILayout.TextField("atom_size", ToSizeText(_memoryUsage.atom_size));
                EditorGUILayout.TextField("str_count", ToCountText(_memoryUsage.str_count));
                EditorGUILayout.TextField("str_size", ToSizeText(_memoryUsage.str_size));
                EditorGUILayout.TextField("obj_count", ToCountText(_memoryUsage.obj_count));
                EditorGUILayout.TextField("obj_size", ToSizeText(_memoryUsage.obj_size));
                EditorGUILayout.TextField("prop_count", ToCountText(_memoryUsage.prop_count));
                EditorGUILayout.TextField("prop_size", ToSizeText(_memoryUsage.prop_size));
                EditorGUILayout.TextField("shape_count", ToCountText(_memoryUsage.shape_count));
                EditorGUILayout.TextField("shape_size", ToSizeText(_memoryUsage.shape_size));
                EditorGUILayout.TextField("js_func_count", ToCountText(_memoryUsage.js_func_count));
                EditorGUILayout.TextField("js_func_size", ToSizeText(_memoryUsage.js_func_size));
                EditorGUILayout.TextField("js_func_code_size", ToSizeText(_memoryUsage.js_func_code_size));
                EditorGUILayout.TextField("js_func_pc2line_count", ToCountText(_memoryUsage.js_func_pc2line_count));
                EditorGUILayout.TextField("js_func_pc2line_size", ToSizeText(_memoryUsage.js_func_pc2line_size));
                EditorGUILayout.TextField("c_func_count", ToCountText(_memoryUsage.c_func_count));
                EditorGUILayout.TextField("array_count", ToCountText(_memoryUsage.array_count));
                EditorGUILayout.TextField("fast_array_count", ToCountText(_memoryUsage.fast_array_count));
                EditorGUILayout.TextField("fast_array_elements", ToCountText(_memoryUsage.fast_array_elements));
                EditorGUILayout.TextField("binary_object_count", ToCountText(_memoryUsage.binary_object_count));
                EditorGUILayout.TextField("binary_object_size", ToSizeText(_memoryUsage.binary_object_size));
            });

            Block("Misc.", () =>
            {
                var typeDB = runtime.GetTypeDB();
                EditorGUILayout.IntField("Exported Types", typeDB.Count);

                var objectCache = runtime.GetObjectCache();
                EditorGUILayout.IntField("ManagedObject Count", objectCache.GetManagedObjectCount());
                EditorGUILayout.IntField("JSObject Count", objectCache.GetJSObjectCount());
                EditorGUILayout.IntField("Delegate Count", objectCache.GetDelegateCount());

                var timeManager = runtime.GetTimerManager();
                EditorGUILayout.IntField("Active Timer", timeManager.GetActiveTimeHandleCount());
            });

            EditorGUILayout.EndScrollView();
        }
        private static void OnSnapshotRequest(ScriptRuntime rt, Utils.JSAction act)
        {
            var snapshot = (Snapshot)act.args;

            lock (snapshot)
            {
                unsafe
                {
                    fixed(Native.JSMemoryUsage *ptr = &snapshot.memoryUsage)
                    {
                        Native.JSApi.JS_ComputeMemoryUsage(rt, ptr);
                    }
                }

                var typeDB = rt.GetTypeDB();
                snapshot.exportedTypes = typeDB.Count;

                var objectCache = rt.GetObjectCache();
                snapshot.managedObjectCount = objectCache.GetManagedObjectCount();
                snapshot.jSObjectCount      = objectCache.GetJSObjectCount();
                snapshot.delegateCount      = objectCache.GetDelegateCount();
                snapshot.scriptValueCount   = objectCache.GetScriptValueCount();
                snapshot.scriptPromiseCount = objectCache.GetScriptPromiseCount();

                var timeManager = rt.GetTimerManager();
                snapshot.activeTimers.Clear();
                snapshot.timeNow = timeManager.now;
                timeManager.ForEach((id, delay, deadline, once) => snapshot.activeTimers.Add(new Snapshot.TimerInfo()
                {
                    id       = id,
                    delay    = delay,
                    deadline = deadline,
                    once     = once,
                }));
            }
        }