Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit debb942

Browse files
smowtonigfoo
authored andcommitted
Implement mtime and class version extraction
1 parent a0671ca commit debb942

2 files changed

Lines changed: 49 additions & 14 deletions

File tree

java/kotlin-extractor/src/main/java/com/semmle/extractor/java/OdasaOutput.java

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,16 @@
1212
import com.github.codeql.Logger;
1313
import com.github.codeql.Severity;
1414
import static com.github.codeql.ClassNamesKt.getIrClassBinaryPath;
15+
import static com.github.codeql.ClassNamesKt.getIrClassVirtualFile;
1516

1617
import org.jetbrains.kotlin.ir.declarations.IrClass;
1718

19+
import com.intellij.openapi.vfs.VirtualFile;
20+
21+
import org.jetbrains.org.objectweb.asm.ClassVisitor;
22+
import org.jetbrains.org.objectweb.asm.ClassReader;
23+
import org.jetbrains.org.objectweb.asm.Opcodes;
24+
1825
import com.semmle.util.concurrent.LockDirectory;
1926
import com.semmle.util.concurrent.LockDirectory.LockingMode;
2027
import com.semmle.util.exception.CatastrophicError;
@@ -500,7 +507,25 @@ else if (majorVersion==0)
500507
tcv.lastModified < lastModified);
501508
}
502509
private static TrapClassVersion fromSymbol(IrClass sym) {
503-
return new TrapClassVersion(100, 101, 102);
510+
VirtualFile vf = getIrClassVirtualFile(sym);
511+
if(vf == null)
512+
return new TrapClassVersion(0, 0, 0);
513+
514+
final int[] versionStore = new int[1];
515+
516+
try {
517+
ClassVisitor versionGetter = new ClassVisitor(Opcodes.ASM7) {
518+
public void visit​(int version, int access, java.lang.String name, java.lang.String signature, java.lang.String superName, java.lang.String[] interfaces) {
519+
versionStore[0] = version;
520+
}
521+
};
522+
(new ClassReader(vf.contentsToByteArray())).accept(versionGetter, ClassReader.SKIP_CODE | ClassReader.SKIP_DEBUG | ClassReader.SKIP_FRAMES);
523+
524+
return new TrapClassVersion(versionStore[0] & 0xffff, versionStore[0] >> 16, vf.getTimeStamp());
525+
}
526+
catch(IOException e) {
527+
return new TrapClassVersion(0, 0, 0);
528+
}
504529
}
505530
private boolean isValid() {
506531
return majorVersion>=0 && minorVersion>=0;

java/kotlin-extractor/src/main/kotlin/utils/ClassNames.kt

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,11 @@ import org.jetbrains.kotlin.ir.declarations.IrDeclarationParent
66
import org.jetbrains.kotlin.ir.declarations.IrPackageFragment
77
import org.jetbrains.kotlin.load.java.sources.JavaSourceElement
88
import org.jetbrains.kotlin.load.java.structure.impl.classFiles.BinaryJavaClass
9+
import org.jetbrains.kotlin.load.kotlin.VirtualFileKotlinClass
910
import org.jetbrains.kotlin.load.kotlin.KotlinJvmBinarySourceElement
1011

12+
import com.intellij.openapi.vfs.VirtualFile
13+
1114
// Taken from Kotlin's interpreter/Utils.kt function 'internalName'
1215
// Translates class names into their JLS section 13.1 binary name
1316
fun getClassBinaryName(that: IrClass): String {
@@ -23,20 +26,27 @@ fun getClassBinaryName(that: IrClass): String {
2326
return internalName.toString()
2427
}
2528

29+
fun getIrClassVirtualFile(irClass: IrClass): VirtualFile? {
30+
val cSource = irClass.source
31+
when(cSource) {
32+
is JavaSourceElement -> {
33+
val element = cSource.javaElement
34+
when(element) {
35+
is BinaryJavaClass -> return element.virtualFile
36+
}
37+
}
38+
is KotlinJvmBinarySourceElement -> {
39+
val binaryClass = cSource.binaryClass
40+
when(binaryClass) {
41+
is VirtualFileKotlinClass -> return binaryClass.file
42+
}
43+
}
44+
}
45+
return null
46+
}
47+
2648
fun getRawIrClassBinaryPath(irClass: IrClass): String? {
27-
val cSource = irClass.source
28-
when(cSource) {
29-
is JavaSourceElement -> {
30-
val element = cSource.javaElement
31-
when(element) {
32-
is BinaryJavaClass -> return element.virtualFile.getPath()
33-
}
34-
}
35-
is KotlinJvmBinarySourceElement -> {
36-
return cSource.binaryClass.location
37-
}
38-
}
39-
return null
49+
return getIrClassVirtualFile(irClass)?.getPath()
4050
}
4151

4252
fun getIrClassBinaryPath(irClass: IrClass): String {

0 commit comments

Comments
 (0)