]> gerrit.simantics Code Review - simantics/platform.git/blob - bundles/org.simantics.scl.compiler.decompiler/src/org/simantics/scl/compiler/internal/decompiler/impl/DecompilerImpl.java
(refs #7245) The first version of decompiler for SCL compilations
[simantics/platform.git] / bundles / org.simantics.scl.compiler.decompiler / src / org / simantics / scl / compiler / internal / decompiler / impl / DecompilerImpl.java
1 package org.simantics.scl.compiler.internal.decompiler.impl;
2
3 import java.io.IOException;
4 import java.io.Writer;
5
6 import org.simantics.scl.compiler.internal.decompilation.IDecompiler;
7 import org.simantics.scl.compiler.runtime.MutableClassLoader;
8
9 import com.strobel.assembler.metadata.Buffer;
10 import com.strobel.assembler.metadata.ITypeLoader;
11 import com.strobel.core.VerifyArgument;
12 import com.strobel.decompiler.Decompiler;
13 import com.strobel.decompiler.DecompilerSettings;
14 import com.strobel.decompiler.PlainTextOutput;
15
16 public class DecompilerImpl implements IDecompiler {
17     @Override
18     public void decompile(MutableClassLoader classLoader, String className, Writer output) {
19         VerifyArgument.isNonNegative(3.0, "asd");
20         DecompilerSettings settings = DecompilerSettings.javaDefaults();
21         settings.setTypeLoader(new ITypeLoader() {
22             @Override
23             public boolean tryLoadType(String internalName, Buffer buffer) {
24                 byte[] bytes = classLoader.getBytes(internalName.replace('/', '.'));
25                 if(bytes == null)
26                     return false;
27                 
28                 buffer.reset(bytes.length);
29                 System.arraycopy(bytes, 0, buffer.array(), 0, bytes.length);
30                 return true;
31             }
32         });
33         Decompiler.decompile(
34                 className,
35                 new PlainTextOutput(output),
36                 settings);
37         try {
38             output.flush();
39         } catch (IOException e) {
40         }
41     }
42     
43 }