Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Teach P6int/P6num/P6str to be box targets.
  • Loading branch information
jnthn committed Jan 7, 2013
1 parent f353a12 commit 1099d65
Show file tree
Hide file tree
Showing 3 changed files with 93 additions and 0 deletions.
31 changes: 31 additions & 0 deletions src/org/perl6/nqp/sixmodel/reprs/P6int.java
Expand Up @@ -6,6 +6,8 @@
import org.apache.bcel.generic.Instruction;
import org.apache.bcel.generic.InstructionConstants;
import org.apache.bcel.generic.InstructionFactory;
import org.apache.bcel.generic.InstructionList;
import org.apache.bcel.generic.MethodGen;
import org.apache.bcel.generic.Type;
import org.perl6.nqp.runtime.ThreadContext;
import org.perl6.nqp.sixmodel.REPR;
Expand Down Expand Up @@ -72,4 +74,33 @@ public Instruction[] inlineGet(ThreadContext tc, STable st, ClassGen c, Constant
ins[7] = InstructionConstants.RETURN;
return ins;
}

public void generateBoxingMethods(ThreadContext tc, STable st, ClassGen c, ConstantPoolGen cp, String prefix) {
InstructionFactory f = new InstructionFactory(cp);

InstructionList getIl = new InstructionList();
MethodGen getMeth = new MethodGen(Constants.ACC_PUBLIC, Type.LONG,
new Type[] { Type.getType("Lorg/perl6/nqp/runtime/ThreadContext;") },
new String[] { "tc" },
"get_int", c.getClassName(), getIl, cp);
getIl.append(InstructionConstants.ALOAD_0);
getIl.append(f.createFieldAccess(c.getClassName(), prefix, Type.LONG, Constants.GETFIELD));
getIl.append(InstructionConstants.LRETURN);
getMeth.setMaxStack();
c.addMethod(getMeth.getMethod());
getIl.dispose();

InstructionList setIl = new InstructionList();
MethodGen setMeth = new MethodGen(Constants.ACC_PUBLIC, Type.VOID,
new Type[] { Type.getType("Lorg/perl6/nqp/runtime/ThreadContext;"), Type.LONG },
new String[] { "tc", "value" },
"set_int", c.getClassName(), setIl, cp);
setIl.append(InstructionConstants.ALOAD_0);
setIl.append(InstructionFactory.createLoad(Type.LONG, 2));
setIl.append(f.createFieldAccess(c.getClassName(), prefix, Type.LONG, Constants.PUTFIELD));
setIl.append(InstructionConstants.RETURN);
setMeth.setMaxStack();
c.addMethod(setMeth.getMethod());
setIl.dispose();
}
}
31 changes: 31 additions & 0 deletions src/org/perl6/nqp/sixmodel/reprs/P6num.java
Expand Up @@ -6,6 +6,8 @@
import org.apache.bcel.generic.Instruction;
import org.apache.bcel.generic.InstructionConstants;
import org.apache.bcel.generic.InstructionFactory;
import org.apache.bcel.generic.InstructionList;
import org.apache.bcel.generic.MethodGen;
import org.apache.bcel.generic.Type;
import org.perl6.nqp.runtime.ThreadContext;
import org.perl6.nqp.sixmodel.REPR;
Expand Down Expand Up @@ -73,4 +75,33 @@ public Instruction[] inlineGet(ThreadContext tc, STable st, ClassGen c, Constant
ins[7] = InstructionConstants.RETURN;
return ins;
}

public void generateBoxingMethods(ThreadContext tc, STable st, ClassGen c, ConstantPoolGen cp, String prefix) {
InstructionFactory f = new InstructionFactory(cp);

InstructionList getIl = new InstructionList();
MethodGen getMeth = new MethodGen(Constants.ACC_PUBLIC, Type.DOUBLE,
new Type[] { Type.getType("Lorg/perl6/nqp/runtime/ThreadContext;") },
new String[] { "tc" },
"get_num", c.getClassName(), getIl, cp);
getIl.append(InstructionConstants.ALOAD_0);
getIl.append(f.createFieldAccess(c.getClassName(), prefix, Type.DOUBLE, Constants.GETFIELD));
getIl.append(InstructionConstants.DRETURN);
getMeth.setMaxStack();
c.addMethod(getMeth.getMethod());
getIl.dispose();

InstructionList setIl = new InstructionList();
MethodGen setMeth = new MethodGen(Constants.ACC_PUBLIC, Type.VOID,
new Type[] { Type.getType("Lorg/perl6/nqp/runtime/ThreadContext;"), Type.DOUBLE },
new String[] { "tc", "value" },
"set_num", c.getClassName(), setIl, cp);
setIl.append(InstructionConstants.ALOAD_0);
setIl.append(InstructionFactory.createLoad(Type.DOUBLE, 2));
setIl.append(f.createFieldAccess(c.getClassName(), prefix, Type.DOUBLE, Constants.PUTFIELD));
setIl.append(InstructionConstants.RETURN);
setMeth.setMaxStack();
c.addMethod(setMeth.getMethod());
setIl.dispose();
}
}
31 changes: 31 additions & 0 deletions src/org/perl6/nqp/sixmodel/reprs/P6str.java
Expand Up @@ -6,6 +6,8 @@
import org.apache.bcel.generic.Instruction;
import org.apache.bcel.generic.InstructionConstants;
import org.apache.bcel.generic.InstructionFactory;
import org.apache.bcel.generic.InstructionList;
import org.apache.bcel.generic.MethodGen;
import org.apache.bcel.generic.Type;
import org.perl6.nqp.runtime.ThreadContext;
import org.perl6.nqp.sixmodel.REPR;
Expand Down Expand Up @@ -72,4 +74,33 @@ public Instruction[] inlineGet(ThreadContext tc, STable st, ClassGen c, Constant
ins[7] = InstructionConstants.RETURN;
return ins;
}

public void generateBoxingMethods(ThreadContext tc, STable st, ClassGen c, ConstantPoolGen cp, String prefix) {
InstructionFactory f = new InstructionFactory(cp);

InstructionList getIl = new InstructionList();
MethodGen getMeth = new MethodGen(Constants.ACC_PUBLIC, Type.STRING,
new Type[] { Type.getType("Lorg/perl6/nqp/runtime/ThreadContext;") },
new String[] { "tc" },
"get_str", c.getClassName(), getIl, cp);
getIl.append(InstructionConstants.ALOAD_0);
getIl.append(f.createFieldAccess(c.getClassName(), prefix, Type.STRING, Constants.GETFIELD));
getIl.append(InstructionConstants.ARETURN);
getMeth.setMaxStack();
c.addMethod(getMeth.getMethod());
getIl.dispose();

InstructionList setIl = new InstructionList();
MethodGen setMeth = new MethodGen(Constants.ACC_PUBLIC, Type.VOID,
new Type[] { Type.getType("Lorg/perl6/nqp/runtime/ThreadContext;"), Type.STRING },
new String[] { "tc", "value" },
"set_str", c.getClassName(), setIl, cp);
setIl.append(InstructionConstants.ALOAD_0);
setIl.append(InstructionFactory.createLoad(Type.STRING, 2));
setIl.append(f.createFieldAccess(c.getClassName(), prefix, Type.STRING, Constants.PUTFIELD));
setIl.append(InstructionConstants.RETURN);
setMeth.setMaxStack();
c.addMethod(setMeth.getMethod());
setIl.dispose();
}
}

0 comments on commit 1099d65

Please sign in to comment.