1
package org.perl6.nqp.sixmodel.reprs;
3
import org.objectweb.asm.ClassWriter;
4
import org.objectweb.asm.MethodVisitor;
5
import org.objectweb.asm.Opcodes;
6
import org.perl6.nqp.runtime.ThreadContext;
7
import org.perl6.nqp.sixmodel.REPR;
8
import org.perl6.nqp.sixmodel.STable;
9
import org.perl6.nqp.sixmodel.SerializationReader;
10
import org.perl6.nqp.sixmodel.SerializationWriter;
11
import org.perl6.nqp.sixmodel.SixModelObject;
12
import org.perl6.nqp.sixmodel.StorageSpec;
13
import org.perl6.nqp.sixmodel.TypeObject;
15
public class P6num extends REPR {
16
public SixModelObject type_object_for(ThreadContext tc, SixModelObject HOW) {
17
STable st = new STable(this, HOW);
18
SixModelObject obj = new TypeObject();
22
StorageSpec ss = new StorageSpec();
23
ss.inlineable = StorageSpec.INLINED;
24
ss.boxed_primitive = StorageSpec.BP_NUM;
26
ss.can_box = StorageSpec.CAN_BOX_NUM;
32
public void compose(ThreadContext tc, STable st, SixModelObject repr_info) {
33
SixModelObject floatInfo = repr_info.at_key_boxed(tc, "float");
34
if (floatInfo != null) {
35
SixModelObject bits = floatInfo.at_key_boxed(tc, "bits");
37
((StorageSpec)st.REPRData).bits = (short)bits.get_int(tc);
41
public SixModelObject allocate(ThreadContext tc, STable st) {
42
P6numInstance obj = new P6numInstance();
44
obj.value = Double.NaN;
48
public StorageSpec get_storage_spec(ThreadContext tc, STable st) {
49
return (StorageSpec)st.REPRData;
52
public void inlineStorage(ThreadContext tc, STable st, ClassWriter cw, String prefix) {
53
cw.visitField(Opcodes.ACC_PUBLIC, prefix, "D", null, null);
56
public void inlineBind(ThreadContext tc, STable st, MethodVisitor mv, String className, String prefix) {
57
mv.visitVarInsn(Opcodes.ALOAD, 1);
58
mv.visitInsn(Opcodes.ICONST_0 + ThreadContext.NATIVE_NUM);
59
mv.visitFieldInsn(Opcodes.PUTFIELD, "org/perl6/nqp/runtime/ThreadContext", "native_type", "I");
60
mv.visitVarInsn(Opcodes.ALOAD, 0);
61
mv.visitVarInsn(Opcodes.ALOAD, 1);
62
mv.visitFieldInsn(Opcodes.GETFIELD, "org/perl6/nqp/runtime/ThreadContext", "native_n", "D");
63
mv.visitFieldInsn(Opcodes.PUTFIELD, className, prefix, "D");
64
mv.visitInsn(Opcodes.RETURN);
67
public void inlineGet(ThreadContext tc, STable st, MethodVisitor mv, String className, String prefix) {
68
mv.visitVarInsn(Opcodes.ALOAD, 1);
69
mv.visitInsn(Opcodes.DUP);
70
mv.visitInsn(Opcodes.ICONST_0 + ThreadContext.NATIVE_NUM);
71
mv.visitFieldInsn(Opcodes.PUTFIELD, "org/perl6/nqp/runtime/ThreadContext", "native_type", "I");
72
mv.visitVarInsn(Opcodes.ALOAD, 0);
73
mv.visitFieldInsn(Opcodes.GETFIELD, className, prefix, "D");
74
mv.visitFieldInsn(Opcodes.PUTFIELD, "org/perl6/nqp/runtime/ThreadContext", "native_n", "D");
75
mv.visitInsn(Opcodes.RETURN);
78
public void inlineDeserialize(ThreadContext tc, STable st, MethodVisitor mv, String className, String prefix) {
79
mv.visitVarInsn(Opcodes.ALOAD, 0);
80
mv.visitVarInsn(Opcodes.ALOAD, 3);
81
mv.visitMethodInsn(Opcodes.INVOKEVIRTUAL, "org/perl6/nqp/sixmodel/SerializationReader", "readDouble", "()D");
82
mv.visitFieldInsn(Opcodes.PUTFIELD, className, prefix, "D");
85
public void generateBoxingMethods(ThreadContext tc, STable st, ClassWriter cw, String className, String prefix) {
86
MethodVisitor getMeth = cw.visitMethod(Opcodes.ACC_PUBLIC, "get_num",
87
"(Lorg/perl6/nqp/runtime/ThreadContext;)D", null, null);
88
getMeth.visitVarInsn(Opcodes.ALOAD, 0);
89
getMeth.visitFieldInsn(Opcodes.GETFIELD, className, prefix, "D");
90
getMeth.visitInsn(Opcodes.DRETURN);
91
getMeth.visitMaxs(0, 0);
93
MethodVisitor setMeth = cw.visitMethod(Opcodes.ACC_PUBLIC, "set_num",
94
"(Lorg/perl6/nqp/runtime/ThreadContext;D)V", null, null);
95
setMeth.visitVarInsn(Opcodes.ALOAD, 0);
96
setMeth.visitVarInsn(Opcodes.DLOAD, 2);
97
setMeth.visitFieldInsn(Opcodes.PUTFIELD, className, prefix, "D");
98
setMeth.visitInsn(Opcodes.RETURN);
99
setMeth.visitMaxs(0, 0);
102
// We don't depend on any details of the STable, so no description is needed
103
@Override public boolean inline_description(ThreadContext tc, STable st, StringBuilder out) {
106
@Override public boolean box_description(ThreadContext tc, STable st, StringBuilder out) {
110
public SixModelObject deserialize_stub(ThreadContext tc, STable st) {
111
P6numInstance obj = new P6numInstance();
116
public void deserialize_finish(ThreadContext tc, STable st,
117
SerializationReader reader, SixModelObject obj) {
118
((P6numInstance)obj).value = reader.readDouble();
121
public void serialize(ThreadContext tc, SerializationWriter writer, SixModelObject obj) {
122
writer.writeNum(((P6numInstance)obj).value);
125
public void serialize_inlined(ThreadContext tc, STable st, SerializationWriter writer,
126
String prefix, SixModelObject obj) {
128
writer.writeNum((double)obj.getClass().getField(prefix).get(obj));
129
} catch (Exception e) {
130
throw new RuntimeException(e);
135
* REPR data serialization. Serializes the per-type representation data that
136
* is attached to the supplied STable.
138
public void serialize_repr_data(ThreadContext tc, STable st, SerializationWriter writer)
140
writer.writeInt(((StorageSpec)st.REPRData).bits);
144
* REPR data deserialization. Deserializes the per-type representation data and
145
* attaches it to the supplied STable.
147
public void deserialize_repr_data(ThreadContext tc, STable st, SerializationReader reader)
149
StorageSpec ss = new StorageSpec();
150
ss.inlineable = StorageSpec.INLINED;
151
ss.boxed_primitive = StorageSpec.BP_NUM;
152
if (reader.version >= 7)
153
ss.bits = (short)reader.readLong();
156
ss.can_box = StorageSpec.CAN_BOX_NUM;