@@ -27,6 +27,8 @@ class JavaClassInvoker
2727
2828 private $ debugTraces = [];
2929
30+ private static $ singleton = [];
31+
3032 public function __construct (JavaClass $ javaClass )
3133 {
3234 $ this ->javaClass = $ javaClass ;
@@ -104,106 +106,108 @@ public function debug(): void
104106 {
105107 $ cpInfo = $ this ->getJavaClass ()->getConstantPool ()->getEntries ();
106108
107- $ methodAccessFlags = $ this ->debugTraces ['method ' ]->getAccessFlag ();
108- $ accessFlags = [];
109- $ accessFlag = new AccessFlag ();
110- foreach ($ accessFlag ->getValues () as $ value ) {
111- if (($ methodAccessFlags & $ value ) !== 0 ) {
112- $ accessFlags [] = strtolower (str_replace ('_ ' , '' , $ accessFlag ->getName ($ value )));
109+ foreach ($ this ->debugTraces as $ debugTraces ) {
110+ $ methodAccessFlags = $ debugTraces ['method ' ]->getAccessFlag ();
111+ $ accessFlags = [];
112+ $ accessFlag = new AccessFlag ();
113+ foreach ($ accessFlag ->getValues () as $ value ) {
114+ if (($ methodAccessFlags & $ value ) !== 0 ) {
115+ $ accessFlags [] = strtolower (str_replace ('_ ' , '' , $ accessFlag ->getName ($ value )));
116+ }
113117 }
114- }
115118
116- $ methodName = $ cpInfo [$ this -> debugTraces ['method ' ]->getNameIndex ()]->getString ();
117- $ descriptor = Formatter::parseSignature ($ cpInfo [$ this -> debugTraces ['method ' ]->getDescriptorIndex ()]->getString ());
118- $ formattedArguments = str_replace (
119- '/ ' ,
120- '. ' ,
119+ $ methodName = $ cpInfo [$ debugTraces ['method ' ]->getNameIndex ()]->getString ();
120+ $ descriptor = Formatter::parseSignature ($ cpInfo [$ debugTraces ['method ' ]->getDescriptorIndex ()]->getString ());
121+ $ formattedArguments = str_replace (
122+ '/ ' ,
123+ '. ' ,
121124 implode (
122- ', ' ,
123- array_map (
124- function ($ argument ) {
125- $ arrayBrackets = str_repeat ('[] ' , $ argument ['deep_array ' ]);
126- if ($ argument ['type ' ] === 'class ' ) {
127- return $ argument ['class_name ' ] . $ arrayBrackets ;
128- }
129- return $ argument ['type ' ] . $ arrayBrackets ;
130- },
131- $ descriptor ['arguments ' ]
125+ ', ' ,
126+ array_map (
127+ function ($ argument ) {
128+ $ arrayBrackets = str_repeat ('[] ' , $ argument ['deep_array ' ]);
129+ if ($ argument ['type ' ] === 'class ' ) {
130+ return $ argument ['class_name ' ] . $ arrayBrackets ;
131+ }
132+ return $ argument ['type ' ] . $ arrayBrackets ;
133+ },
134+ $ descriptor ['arguments ' ]
135+ )
132136 )
133- )
134- );
137+ );
135138
136139
137- $ type = $ descriptor [0 ]['type ' ];
138- if ($ type === 'class ' ) {
139- $ type = $ descriptor [0 ]['class_name ' ];
140- }
140+ $ type = $ descriptor [0 ]['type ' ];
141+ if ($ type === 'class ' ) {
142+ $ type = $ descriptor [0 ]['class_name ' ];
143+ }
141144
142- $ methodAccessibility = implode (' ' , $ accessFlags );
143-
144- printf ("[method] \n" );
145- printf (ltrim ("$ methodAccessibility $ type $ methodName( $ formattedArguments) \n" , ' ' ));
146- printf ("\n" );
147- printf ("[code] \n" );
148-
149- $ codeCounter = 0 ;
150- printf (
151- "%s \n" ,
152- implode (
153- "\n" ,
154- array_map (
155- function ($ codes ) use (&$ codeCounter ) {
156- return implode (
157- ' ' ,
158- array_map (
159- function ($ code ) use (&$ codeCounter ) {
160- $ isMnemonic = in_array ($ codeCounter , $ this ->debugTraces ['mnemonic_indexes ' ]);
161- $ codeCounter ++;
162- return ($ isMnemonic ? "\e[1m \e[35m " : "" ) . "<0x {$ code }> " . ($ isMnemonic ? "\e[m " : "" );
163- },
164- $ codes
165- )
166- );
167- },
168- array_chunk (str_split (bin2hex ($ this ->debugTraces ['raw_code ' ]), 2 ), 20 )
169- )
170- )
171- );
172- printf ("\n" );
173- printf ("[executed] \n" );
174-
175- printf (
176- "% 8s | %-6.6s | %-20.20s | %-10.10s | %-15.15s \n" ,
177- "PC " ,
178- "OPCODE " ,
179- "MNEMONIC " ,
180- "OPERANDS " ,
181- "LOCAL STORAGE "
182- );
145+ $ methodAccessibility = implode (' ' , $ accessFlags );
183146
184- $ line = sprintf (
185- "%8s+%8s+%22s+%12s+%17s \n" ,
186- "--------- " ,
187- "-------- " ,
188- "---------------------- " ,
189- "------------ " ,
190- "----------------- "
191- );
147+ printf ("[method] \n" );
148+ printf (ltrim ("$ methodAccessibility $ type $ methodName( $ formattedArguments) \n" , ' ' ));
149+ printf ("\n" );
150+ printf ("[code] \n" );
192151
193- printf ($ line );
152+ $ codeCounter = 0 ;
153+ printf (
154+ "%s \n" ,
155+ implode (
156+ "\n" ,
157+ array_map (
158+ function ($ codes ) use (&$ codeCounter , &$ debugTraces ) {
159+ return implode (
160+ ' ' ,
161+ array_map (
162+ function ($ code ) use (&$ codeCounter , &$ debugTraces ) {
163+ $ isMnemonic = in_array ($ codeCounter , $ debugTraces ['mnemonic_indexes ' ]);
164+ $ codeCounter ++;
165+ return ($ isMnemonic ? "\e[1m \e[35m " : "" ) . "<0x {$ code }> " . ($ isMnemonic ? "\e[m " : "" );
166+ },
167+ $ codes
168+ )
169+ );
170+ },
171+ array_chunk (str_split (bin2hex ($ debugTraces ['raw_code ' ]), 2 ), 20 )
172+ )
173+ )
174+ );
175+ printf ("\n" );
176+ printf ("[executed] \n" );
194177
195- foreach ($ this ->debugTraces ['executed ' ] as [$ opcode , $ mnemonic , $ localStorage , $ stacks , $ pointer ]) {
196178 printf (
197- "% 8s | 0x%02X | %-20.20s | %-10.10s | %-15.15s \n" ,
198- (int ) $ pointer ,
199- $ opcode ,
200- // Remove prefix
201- ltrim ($ mnemonic , '_ ' ),
202- count ($ stacks ),
203- count ($ localStorage )
179+ "% 8s | %-6.6s | %-20.20s | %-10.10s | %-15.15s \n" ,
180+ "PC " ,
181+ "OPCODE " ,
182+ "MNEMONIC " ,
183+ "OPERANDS " ,
184+ "LOCAL STORAGE "
204185 );
205- }
206186
207- printf ($ line );
187+ $ line = sprintf (
188+ "%8s+%8s+%22s+%12s+%17s \n" ,
189+ "--------- " ,
190+ "-------- " ,
191+ "---------------------- " ,
192+ "------------ " ,
193+ "----------------- "
194+ );
195+
196+ printf ($ line );
197+
198+ foreach ($ debugTraces ['executed ' ] as [$ opcode , $ mnemonic , $ localStorage , $ stacks , $ pointer ]) {
199+ printf (
200+ "% 8s | 0x%02X | %-20.20s | %-10.10s | %-15.15s \n" ,
201+ (int ) $ pointer ,
202+ $ opcode ,
203+ // Remove prefix
204+ ltrim ($ mnemonic , '_ ' ),
205+ count ($ stacks ),
206+ count ($ localStorage )
207+ );
208+ }
209+
210+ printf ($ line );
211+ }
208212 }
209213}
0 commit comments