Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Primitives for in-process JAST => JVM bytecode.
  • Loading branch information
jnthn committed Feb 27, 2013
1 parent 9fb6e7e commit fd60679
Show file tree
Hide file tree
Showing 4 changed files with 64 additions and 1 deletion.
14 changes: 14 additions & 0 deletions src/org/perl6/nqp/jast2bc/JASTToJVMBytecode.java
Expand Up @@ -4,8 +4,10 @@
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.io.StringReader;

import org.apache.bcel.Constants;
import org.apache.bcel.classfile.JavaClass;
import org.apache.bcel.generic.*;

public class JASTToJVMBytecode {
Expand All @@ -29,6 +31,18 @@ public static void main(String[] argv)

}

public static JavaClass buildClassFromString(String in) {
try {
BufferedReader br = new BufferedReader(new StringReader(in));
ClassGen c = buildClassFrom(br);
c.setMajor(49);
return c.getJavaClass();
}
catch (Exception e) {
throw new RuntimeException(e);
}
}

private static ClassGen buildClassFrom(BufferedReader in) throws Exception
{
// Read in class name, superclass and any fields.
Expand Down
13 changes: 13 additions & 0 deletions src/org/perl6/nqp/runtime/ByteClassLoader.java
@@ -0,0 +1,13 @@
package org.perl6.nqp.runtime;

public class ByteClassLoader extends ClassLoader {
private byte[] bytes;

public ByteClassLoader(byte[] bytes) {
this.bytes = bytes;
}

public Class<?> findClass(String name) {
return defineClass(name, this.bytes, 0, this.bytes.length);
}
}
9 changes: 9 additions & 0 deletions src/org/perl6/nqp/runtime/EvalResult.java
@@ -0,0 +1,9 @@
package org.perl6.nqp.runtime;

import org.perl6.nqp.sixmodel.SixModelObject;
import org.apache.bcel.classfile.JavaClass;

public class EvalResult extends SixModelObject {
public JavaClass jc;
public CompilationUnit cu;
}
29 changes: 28 additions & 1 deletion src/org/perl6/nqp/runtime/Ops.java
Expand Up @@ -21,7 +21,7 @@
import java.util.Collections;
import java.util.HashMap;
import java.util.List;

import org.perl6.nqp.jast2bc.JASTToJVMBytecode;
import org.perl6.nqp.sixmodel.*;
import org.perl6.nqp.sixmodel.reprs.*;

Expand Down Expand Up @@ -3164,4 +3164,31 @@ public static String join_literal(String[] parts) {
retval.append(parts[i]);
return retval.toString();
}

/* Evaluation of code; JVM-specific ops. */
public static SixModelObject compilejast(String dump, ThreadContext tc) {
EvalResult res = new EvalResult();
res.jc = JASTToJVMBytecode.buildClassFromString(dump);
return res;
}
public static SixModelObject loadcompunit(SixModelObject obj, ThreadContext tc) {
try {
EvalResult res = (EvalResult)obj;
ByteClassLoader cl = new ByteClassLoader(res.jc.getBytes());
res.cu = (CompilationUnit)cl.findClass(res.jc.getClassName()).newInstance();
res.cu.initializeCompilationUnit(tc);
res.jc = null;
return obj;
}
catch (Exception e) {
throw new RuntimeException(e);
}
}
public static long iscompunit(SixModelObject obj, ThreadContext tc) {
return obj instanceof EvalResult ? 1 : 0;
}
public static SixModelObject compunitmainline(SixModelObject obj, ThreadContext tc) {
EvalResult res = (EvalResult)obj;
return res.cu.codeRefs[0];
}
}

0 comments on commit fd60679

Please sign in to comment.