@yuebai008/cli
Version:
Command line interface for rapid qg-minigame development
1 lines • 4.86 kB
JavaScript
import*as i18n from"../../core/i18n/i18n.js";import*as TraceEngine from"../trace/trace.js";import{RecordType,TimelineModelImpl}from"./TimelineModel.js";const UIStrings={threadS:"Thread {PH1}"},str_=i18n.i18n.registerUIStrings("models/timeline_model/TimelineJSProfile.ts",UIStrings),i18nString=i18n.i18n.getLocalizedString.bind(void 0,str_);export class TimelineJSProfileProcessor{static generateConstructedEventsFromCpuProfileDataModel(e,t){const n=e.samples||[],r=e.timestamps,i=[],a=new Map;let o=e.root,s=[];for(let c=0;c<n.length;++c){const l=e.nodeByIndex(c);if(!l){console.error(`Node with unknown id ${n[c]} at index ${c}`);continue}let m;if(l===e.gcNode)m=o===e.gcNode?s:[l,...s];else if(m=a.get(l),!m){m=new Array(l.depth+1),a.set(l,m);let e=l;for(let t=0;e.parent;e=e.parent)m[t++]=e}const d=l===e.idleNode?RecordType.JSIdleSample:l===e.programNode||l===e.gcNode?RecordType.JSSystemSample:RecordType.JSSample,p=new TraceEngine.Legacy.ConstructedEvent(TraceEngine.Legacy.DevToolsTimelineEventCategory,d,"I",r[c],t);p.args.data={stackTrace:m},i.push(p),o=l,s=m}return i}static isJSSampleEvent(e){return e.name===RecordType.JSSample||e.name===RecordType.JSSystemSample||e.name===RecordType.JSIdleSample}static generateJSFrameEvents(e,t){const n=[],r=[];let i=[],a=0,o=!1;const{showAllEvents:s,showRuntimeCallStats:c,showNativeFunctions:l}=t;function m(e,t){if(i.length){const n=i.at(-1);n&&e<n&&(console.error(`Child stack is shallower (${e}) than the parent stack (${n}) at ${t}`),e=n)}r.length<e&&(console.error(`Trying to truncate higher than the current stack size at ${t}`),e=r.length);for(let e=0;e<r.length;++e)r[e].setEndTime(Math.max(r[e].endTime,t));r.length=e}function d(e){const t=TimelineJSProfileProcessor.isJSSampleEvent(e)?e.args.data.stackTrace.slice().reverse():r.map((e=>e.args.data));!function(e){if(s)return;let t=null,n=0;for(let i=0;i<e.length;++i){const a=e[i],o=a.url,s=o&&o.startsWith("native ");if(!l&&s)continue;const m=TimelineJSProfileProcessor.isNativeRuntimeFrame(a);if(m&&(r=a.functionName,!c||!Boolean(TimelineJSProfileProcessor.nativeGroup(r))))continue;const d=m?TimelineJSProfileProcessor.nativeGroup(a.functionName):null;t&&t===d||(t=d,e[n++]=a)}var r;e.length=n}(t);const a=e.endTime||e.startTime,o=Math.min(t.length,r.length);let d;for(d=i.at(-1)||0;d<o;++d){const e=t[d],n=r[d].args.data;if(T=n,(p=e).scriptId!==T.scriptId||p.functionName!==T.functionName||p.lineNumber!==T.lineNumber)break;r[d].setEndTime(Math.max(r[d].endTime,a))}var p,T;for(m(d,e.startTime);d<t.length;++d){const i=t[d];let o=RecordType.JSFrame;switch(e.name){case RecordType.JSIdleSample:o=RecordType.JSIdleFrame;break;case RecordType.JSSystemSample:o=RecordType.JSSystemFrame}const s=new TraceEngine.Legacy.ConstructedEvent(TraceEngine.Legacy.DevToolsTimelineEventCategory,o,"X",e.startTime,e.thread);s.ordinal=e.ordinal,s.addArgs({data:i}),s.setEndTime(a),r.push(s),n.push(s)}}const p=e.find(TraceEngine.Legacy.TracingModel.isTopLevelEvent),T=p?p.startTime:0;return TimelineModelImpl.forEachEvent(e,(function(e){TraceEngine.Legacy.eventIsFromNewEngine(e)||("RunMicrotasks"!==e.name&&"RunTask"!==e.name||(i=[],m(0,e.startTime),o=!1),o&&(m(i.pop()||0,e.startTime),o=!1),e.ordinal=++a,d(e),i.push(r.length))}),(function(e){TraceEngine.Legacy.eventIsFromNewEngine(e)||m(i.pop()||0,e.endTime||e.startTime)}),(function(e,t){if(!TraceEngine.Legacy.eventIsFromNewEngine(e)&&!TraceEngine.Legacy.eventIsFromNewEngine(t))if(e.ordinal=++a,t&&function(e){switch(e.name){case RecordType.RunMicrotasks:case RecordType.FunctionCall:case RecordType.EvaluateScript:case RecordType.EvaluateModule:case RecordType.EventDispatch:case RecordType.V8Execute:return!0}return!(!e.name.startsWith("v8")&&!e.name.startsWith("V8"))}(t)||o)d(e);else if(TimelineJSProfileProcessor.isJSSampleEvent(e)&&e.args?.data?.stackTrace?.length&&0===r.length){o=!0;const t=r.length;d(e),i.push(t)}}),T),n}static isNativeRuntimeFrame(e){return"native V8Runtime"===e.url}static nativeGroup(e){return e.startsWith("Parse")?TimelineJSProfileProcessor.NativeGroups.Parse:e.startsWith("Compile")||e.startsWith("Recompile")?TimelineJSProfileProcessor.NativeGroups.Compile:null}static createFakeTraceFromCpuProfile(e,t,n,r){const i=[];return n&&a("TracingStartedInPage",{data:{sessionId:"1"}},0,0,"M"),r||(r=i18nString(UIStrings.threadS,{PH1:t})),a(TraceEngine.Legacy.MetadataEvent.ThreadName,{name:r},0,0,"M","__metadata"),e?(a(RecordType.JSRoot,{},e.startTime,e.endTime-e.startTime,"X","toplevel"),a("CpuProfile",{data:{cpuProfile:e}},e.endTime,0,"I"),i):i;function a(e,n,r,a,o,s){const c={cat:s||"disabled-by-default-devtools.timeline",name:e,ph:o||"X",pid:1,tid:t,ts:r,args:n};return a&&(c.dur=a),i.push(c),c}}}!function(e){let t;!function(e){e.Compile="Compile",e.Parse="Parse"}(t=e.NativeGroups||(e.NativeGroups={}))}(TimelineJSProfileProcessor||(TimelineJSProfileProcessor={}));