diff --git a/src/context/memory.ml b/src/context/memory.ml index c0613b9db62..6dd0f253d3c 100644 --- a/src/context/memory.ml +++ b/src/context/memory.ml @@ -113,6 +113,9 @@ let get_memory_json (cs : CompilationCache.t) mreq = "context",cc#get_json; "size",jint (mem_size cc); ]) contexts in + let mem_size_2 v exclude = + Objsize.size_with_headers (Objsize.objsize v exclude []) + in jobject [ "contexts",jarray j_contexts; "memory",jobject [ @@ -121,14 +124,66 @@ let get_memory_json (cs : CompilationCache.t) mreq = "haxelibCache",jint (mem_size cache_mem.(1)); "directoryCache",jint (mem_size cache_mem.(2)); "nativeLibCache",jint (mem_size cache_mem.(3)); - "additionalSizes",jarray [ - jobject ["name",jstring "macro interpreter";"size",jint (mem_size (MacroContext.macro_interp_cache))]; - (* jobject ["name",jstring "macro stdlib";"size",jint (mem_size (EvalContext.GlobalState.stdlib))]; - jobject ["name",jstring "macro macro_lib";"size",jint (mem_size (EvalContext.GlobalState.macro_lib))]; *) - jobject ["name",jstring "last completion result";"size",jint (mem_size (DisplayException.last_completion_result))]; - jobject ["name",jstring "Lexer file cache";"size",jint (mem_size (Lexer.all_files))]; - jobject ["name",jstring "GC heap words";"size",jint (int_of_float size)]; - ]; + "additionalSizes",jarray ( + (match !MacroContext.macro_interp_cache with + | Some interp -> + jobject ["name",jstring "macro interpreter";"size",jint (mem_size MacroContext.macro_interp_cache);"child",jarray [ + jobject ["name",jstring "builtins";"size",jint (mem_size_2 interp.builtins [Obj.repr interp])]; + jobject ["name",jstring "debug";"size",jint (mem_size_2 interp.debug [Obj.repr interp])]; + jobject ["name",jstring "curapi";"size",jint (mem_size_2 interp.curapi [Obj.repr interp])]; + jobject ["name",jstring "type_cache";"size",jint (mem_size_2 interp.type_cache [Obj.repr interp])]; + jobject ["name",jstring "overrides";"size",jint (mem_size_2 interp.overrides [Obj.repr interp])]; + jobject ["name",jstring "array_prototype";"size",jint (mem_size_2 interp.array_prototype [Obj.repr interp])]; + jobject ["name",jstring "string_prototype";"size",jint (mem_size_2 interp.string_prototype [Obj.repr interp])]; + jobject ["name",jstring "vector_prototype";"size",jint (mem_size_2 interp.vector_prototype [Obj.repr interp])]; + jobject ["name",jstring "instance_prototypes";"size",jint (mem_size_2 interp.instance_prototypes [Obj.repr interp])]; + jobject ["name",jstring "static_prototypes";"size",jint (mem_size_2 interp.static_prototypes [Obj.repr interp])]; + jobject ["name",jstring "constructors";"size",jint (mem_size_2 interp.constructors [Obj.repr interp])]; + jobject ["name",jstring "file_keys";"size",jint (mem_size_2 interp.file_keys [Obj.repr interp])]; + jobject ["name",jstring "toplevel";"size",jint (mem_size_2 interp.toplevel [Obj.repr interp])]; + jobject ["name",jstring "eval";"size",jint (mem_size_2 interp.eval [Obj.repr interp]);"child", jarray [ + (match interp.eval.env with + | Some env -> + jobject ["name",jstring "env";"size",jint (mem_size_2 interp.eval.env [Obj.repr interp; Obj.repr interp.eval]);"child", jarray [ + jobject ["name",jstring "env_info";"size",jint (mem_size_2 env.env_info [Obj.repr interp; Obj.repr interp.eval; Obj.repr env])]; + jobject ["name",jstring "env_debug";"size",jint (mem_size_2 env.env_debug [Obj.repr interp; Obj.repr interp.eval; Obj.repr env])]; + jobject ["name",jstring "env_locals";"size",jint (mem_size_2 env.env_locals [Obj.repr interp; Obj.repr interp.eval; Obj.repr env])]; + jobject ["name",jstring "env_captures";"size",jint (mem_size_2 env.env_captures [Obj.repr interp; Obj.repr interp.eval; Obj.repr env])]; + jobject ["name",jstring "env_extra_locals";"size",jint (mem_size_2 env.env_extra_locals [Obj.repr interp; Obj.repr interp.eval; Obj.repr env])]; + jobject ["name",jstring "env_parent";"size",jint (mem_size_2 env.env_parent [Obj.repr interp; Obj.repr interp.eval; Obj.repr env])]; + jobject ["name",jstring "env_eval";"size",jint (mem_size_2 env.env_eval [Obj.repr interp; Obj.repr interp.eval; Obj.repr env])]; + ]]; + | None -> + jobject ["name",jstring "env";"size",jint (mem_size_2 interp.eval.env [Obj.repr interp; Obj.repr interp.eval])]; + ); + jobject ["name",jstring "thread";"size",jint (mem_size_2 interp.eval.thread [Obj.repr interp; Obj.repr interp.eval]);"child", jarray [ + jobject ["name",jstring "tthread";"size",jint (mem_size_2 interp.eval.thread.tthread [Obj.repr interp; Obj.repr interp.eval; Obj.repr interp.eval.thread])]; + jobject ["name",jstring "tdeque";"size",jint (mem_size_2 interp.eval.thread.tdeque [Obj.repr interp; Obj.repr interp.eval; Obj.repr interp.eval.thread])]; + jobject ["name",jstring "tevents";"size",jint (mem_size_2 interp.eval.thread.tevents [Obj.repr interp; Obj.repr interp.eval; Obj.repr interp.eval.thread])]; + jobject ["name",jstring "tstorage";"size",jint (mem_size_2 interp.eval.thread.tstorage [Obj.repr interp; Obj.repr interp.eval; Obj.repr interp.eval.thread])]; + ]]; + jobject ["name",jstring "debug_state";"size",jint (mem_size_2 interp.eval.debug_state [Obj.repr interp; Obj.repr interp.eval])]; + jobject ["name",jstring "breakpoint";"size",jint (mem_size_2 interp.eval.breakpoint [Obj.repr interp; Obj.repr interp.eval])]; + jobject ["name",jstring "caught_types";"size",jint (mem_size_2 interp.eval.caught_types [Obj.repr interp; Obj.repr interp.eval])]; + jobject ["name",jstring "caught_exception";"size",jint (mem_size_2 interp.eval.caught_exception [Obj.repr interp; Obj.repr interp.eval])]; + jobject ["name",jstring "last_return";"size",jint (mem_size_2 interp.eval.last_return [Obj.repr interp; Obj.repr interp.eval])]; + jobject ["name",jstring "debug_channel";"size",jint (mem_size_2 interp.eval.debug_channel [Obj.repr interp; Obj.repr interp.eval])]; + ]]; + jobject ["name",jstring "evals";"size",jint (mem_size_2 interp.evals [Obj.repr interp])]; + jobject ["name",jstring "exception_stack";"size",jint (mem_size_2 interp.exception_stack [Obj.repr interp])]; + ]]; + | None -> + jobject ["name",jstring "macro interpreter";"size",jint (mem_size MacroContext.macro_interp_cache)]; + ) + :: + [ + (* jobject ["name",jstring "macro stdlib";"size",jint (mem_size (EvalContext.GlobalState.stdlib))]; + jobject ["name",jstring "macro macro_lib";"size",jint (mem_size (EvalContext.GlobalState.macro_lib))]; *) + jobject ["name",jstring "last completion result";"size",jint (mem_size (DisplayException.last_completion_result))]; + jobject ["name",jstring "Lexer file cache";"size",jint (mem_size (Lexer.all_files))]; + jobject ["name",jstring "GC heap words";"size",jint (int_of_float size)]; + ] + ); ] ] | MContext sign -> diff --git a/std/haxe/display/Server.hx b/std/haxe/display/Server.hx index 0c20e60baf1..35a10e5ab93 100644 --- a/std/haxe/display/Server.hx +++ b/std/haxe/display/Server.hx @@ -111,6 +111,12 @@ typedef JsonServerFile = { final moduleName:Null; } +typedef AdditionalSize = { + final name:String; + final size:Int; + final child:Array; +} + /* Memory */ typedef HaxeMemoryResult = { final contexts:Array<{ @@ -123,7 +129,7 @@ typedef HaxeMemoryResult = { final haxelibCache:Int; final directoryCache:Int; final nativeLibCache:Int; - final ?additionalSizes:Array<{name:String, size:Int}>; + final ?additionalSizes:Array; } }