Modify src debuginfo to make stacktraces less cryptical

This commit is contained in:
Lucwousin
2020-01-02 13:41:35 +01:00
parent e2fc5ae3d9
commit eee8c73a5b
10 changed files with 198 additions and 23 deletions

View File

@@ -66,14 +66,3 @@ val compileTestKotlin: KotlinCompile by tasks
compileTestKotlin.kotlinOptions {
jvmTarget = "1.8"
}
publishing {
repositories {
mavenLocal()
}
publications {
register("asd", MavenPublication::class) {
from(components["java"])
}
}
}

View File

@@ -23,6 +23,8 @@ import com.openosrs.injector.injectors.raw.RasterizerAlpha;
import com.openosrs.injector.injectors.raw.RenderDraw;
import com.openosrs.injector.injectors.raw.ScriptVM;
import com.openosrs.injector.rsapi.RSApi;
import com.openosrs.injector.transformers.InjectTransformer;
import com.openosrs.injector.transformers.SourceChanger;
import java.io.File;
import java.io.IOException;
import net.runelite.deob.util.JarUtil;
@@ -78,6 +80,8 @@ public class Injection extends InjectData implements InjectTaskHandler
inject(new HidePlayerAttacks(this));
validate(new InjectorValidator(this));
transform(new SourceChanger(this));
}
public void save(File outputJar) throws IOException
@@ -113,6 +117,17 @@ public class Injection extends InjectData implements InjectTaskHandler
}
}
private void transform(InjectTransformer transformer)
{
final String name = transformer.getName();
log.info("Starting {}", name);
transformer.transform();
log.lifecycle("{} {}", name, transformer.getCompletionMsg());
}
public void runChildInjector(Injector injector) throws Injexception
{
inject(injector);

View File

@@ -9,14 +9,16 @@ package com.openosrs.injector;
import com.openosrs.injector.injection.InjectData;
import com.openosrs.injector.rsapi.RSApi;
import static com.openosrs.injector.rsapi.RSApi.API_BASE;
import com.openosrs.injector.rsapi.RSApiClass;
import com.openosrs.injector.rsapi.RSApiMethod;
import lombok.RequiredArgsConstructor;
import net.runelite.asm.ClassFile;
import net.runelite.asm.pool.Class;
import org.gradle.api.logging.Logger;
import org.gradle.api.logging.Logging;
import static com.openosrs.injector.rsapi.RSApi.API_BASE;
@RequiredArgsConstructor
public class InjectorValidator implements Validator
{
private static final Logger log = Logging.getLogger(InjectorValidator.class);
@@ -25,11 +27,6 @@ public class InjectorValidator implements Validator
private int missing = 0, okay = 0, wtf = 0;
InjectorValidator(InjectData inject)
{
this.inject = inject;
}
public boolean validate()
{
final RSApi rsApi = inject.getRsApi();

View File

@@ -7,7 +7,7 @@
*/
package com.openosrs.injector;
public class Injexception extends Exception
public class Injexception extends RuntimeException
{
public Injexception(String message)
{

View File

@@ -9,20 +9,17 @@ package com.openosrs.injector.injectors;
import com.google.common.base.Stopwatch;
import com.openosrs.injector.injection.InjectData;
import lombok.RequiredArgsConstructor;
import org.gradle.api.logging.Logger;
import org.gradle.api.logging.Logging;
@RequiredArgsConstructor
public abstract class AbstractInjector implements Injector
{
protected final InjectData inject;
protected final Logger log = Logging.getLogger(this.getClass());
private Stopwatch stopwatch;
protected AbstractInjector(InjectData inject)
{
this.inject = inject;
}
public void start()
{
stopwatch = Stopwatch.createStarted();

View File

@@ -0,0 +1,42 @@
/*
* Copyright (c) 2020, Lucas <https://github.com/Lucwousin>
* All rights reserved.
*
* This code is licensed under GPL3, see the complete license in
* the LICENSE file in the root directory of this source tree.
*/
package com.openosrs.injector.transformers;
import com.google.common.base.Stopwatch;
import com.openosrs.injector.injection.InjectData;
import lombok.RequiredArgsConstructor;
import net.runelite.asm.Named;
import org.gradle.api.logging.Logger;
import org.gradle.api.logging.Logging;
@RequiredArgsConstructor
public abstract class InjectTransformer implements Named
{
protected final InjectData inject;
protected final Logger log = Logging.getLogger(this.getClass());
private Stopwatch stopwatch;
public final void transform()
{
stopwatch = Stopwatch.createStarted();
transformImpl();
}
abstract void transformImpl();
public final String getCompletionMsg()
{
return "finished in " + stopwatch.toString();
}
@Override
public final String getName()
{
return this.getClass().getSimpleName();
}
}

View File

@@ -0,0 +1,39 @@
/*
* Copyright (c) 2020, Lucas <https://github.com/Lucwousin>
* All rights reserved.
*
* This code is licensed under GPL3, see the complete license in
* the LICENSE file in the root directory of this source tree.
*/
package com.openosrs.injector.transformers;
import com.openosrs.injector.injection.InjectData;
import net.runelite.asm.ClassFile;
/**
* This class changes the java source file debug information to the rs-client file name
*/
public class SourceChanger extends InjectTransformer
{
private int n = 0;
public SourceChanger(InjectData inject)
{
super(inject);
}
@Override
void transformImpl()
{
inject.forEachPair(this::rename);
log.info("Changed source file debug information for {} classes", n);
}
private void rename(ClassFile rsclient, ClassFile vanilla)
{
++n;
final String newSrc = rsclient.getSource();
log.debug("Changing src from {} to {}", vanilla.getSource(), newSrc);
vanilla.setSource(newSrc);
}
}

View File

@@ -0,0 +1,64 @@
/*
* Copyright (c) 2020, Lucas <https://github.com/Lucwousin>
* All rights reserved.
*
* This code is licensed under GPL3, see the complete license in
* the LICENSE file in the root directory of this source tree.
*/
package com.openosrs.injector.transformers;
import com.openosrs.injector.Injexception;
import com.openosrs.injector.injection.InjectData;
import com.openosrs.injector.injectors.Injector;
import com.openosrs.injector.transformers.srcchangeclasses.NewName;
import com.openosrs.injector.transformers.srcchangeclasses.OldName;
import java.lang.invoke.MethodHandles;
import java.util.function.BiConsumer;
import net.runelite.asm.ClassFile;
import net.runelite.asm.ClassGroup;
import net.runelite.asm.objectwebasm.NonloadingClassWriter;
import net.runelite.asm.visitors.ClassFileVisitor;
import org.junit.Ignore;
import org.junit.Test;
import org.objectweb.asm.ClassReader;
import org.objectweb.asm.ClassWriter;
public class SourceChangerTest
{
private static final String PACKAGE = "com.openosrs.injector.transformers.srcchangeclasses.";
@Test
@Ignore // Ignored because it's not really testing anything atm, but it works!
public void test() throws Exception
{
final ClassFileVisitor deob = new ClassFileVisitor(), vann = new ClassFileVisitor();
new ClassReader(PACKAGE + "NewName").accept(deob, ClassReader.SKIP_FRAMES);
new ClassReader(PACKAGE + "OldName").accept(vann, ClassReader.SKIP_FRAMES);
new SourceChanger(
new InjectData(new ClassGroup(), new ClassGroup(), null, null) {
public void runChildInjector(Injector injector) throws Injexception {}
@Override
public void forEachPair(BiConsumer<ClassFile, ClassFile> consumer)
{
consumer.accept(deob.getClassFile(), vann.getClassFile());
}
}).transformImpl();
final ClassGroup group = new ClassGroup();
group.addClass(vann.getClassFile());
final ClassWriter cw = new NonloadingClassWriter(group, 0);
vann.getClassFile().accept(cw);
OldName obj = (OldName) MethodHandles.privateLookupIn(
NewName.class,
MethodHandles.lookup())
.defineClass(cw.toByteArray())
.getDeclaredConstructor()
.newInstance();
obj.obfMethodName();
}
}

View File

@@ -0,0 +1,16 @@
/*
* Copyright (c) 2020, Lucas <https://github.com/Lucwousin>
* All rights reserved.
*
* This code is licensed under GPL3, see the complete license in
* the LICENSE file in the root directory of this source tree.
*/
package com.openosrs.injector.transformers.srcchangeclasses;
public class NewName
{
public void deobMethodName()
{
// do something interesting
}
}

View File

@@ -0,0 +1,16 @@
/*
* Copyright (c) 2020, Lucas <https://github.com/Lucwousin>
* All rights reserved.
*
* This code is licensed under GPL3, see the complete license in
* the LICENSE file in the root directory of this source tree.
*/
package com.openosrs.injector.transformers.srcchangeclasses;
public class OldName
{
public void obfMethodName()
{
new RuntimeException().printStackTrace();
}
}