~ubuntu-branches/ubuntu/vivid/nqp/vivid-proposed

« back to all changes in this revision

Viewing changes to src/vm/jvm/runtime/org/perl6/nqp/sixmodel/reprs/P6num.java

  • Committer: Package Import Robot
  • Author(s): Alessandro Ghedini
  • Date: 2013-11-01 12:09:18 UTC
  • mfrom: (1.1.4)
  • Revision ID: package-import@ubuntu.com-20131101120918-kx51sl0sxl3exsxi
Tags: 2013.10-1
* New upstream release
* Bump versioned (Build-)Depends on parrot
* Update patches
* Install new README.pod
* Fix vcs-field-not-canonical
* Do not install rubyish examples
* Do not Depends on parrot-devel anymore
* Add 07_disable-serialization-tests.patch

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
package org.perl6.nqp.sixmodel.reprs;
 
2
 
 
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;
 
14
 
 
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();
 
19
        obj.st = st;
 
20
        st.WHAT = obj;
 
21
        
 
22
        StorageSpec ss = new StorageSpec();
 
23
        ss.inlineable = StorageSpec.INLINED;
 
24
        ss.boxed_primitive = StorageSpec.BP_NUM;
 
25
        ss.bits = 64;
 
26
        ss.can_box = StorageSpec.CAN_BOX_NUM;
 
27
        st.REPRData = ss;
 
28
        
 
29
        return st.WHAT;
 
30
    }
 
31
    
 
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");
 
36
            if (bits != null)
 
37
                ((StorageSpec)st.REPRData).bits = (short)bits.get_int(tc);
 
38
        }
 
39
    }
 
40
 
 
41
    public SixModelObject allocate(ThreadContext tc, STable st) {
 
42
        P6numInstance obj = new P6numInstance();
 
43
        obj.st = st;
 
44
        obj.value = Double.NaN;
 
45
        return obj;
 
46
    }
 
47
    
 
48
    public StorageSpec get_storage_spec(ThreadContext tc, STable st) {
 
49
        return (StorageSpec)st.REPRData;
 
50
    }
 
51
    
 
52
    public void inlineStorage(ThreadContext tc, STable st, ClassWriter cw, String prefix) {
 
53
        cw.visitField(Opcodes.ACC_PUBLIC, prefix, "D", null, null);
 
54
    }
 
55
    
 
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);
 
65
    }
 
66
    
 
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);        
 
76
    }
 
77
    
 
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");
 
83
    }
 
84
 
 
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);
 
92
 
 
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);
 
100
    }
 
101
 
 
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) {
 
104
        return true;
 
105
    }
 
106
    @Override public boolean box_description(ThreadContext tc, STable st, StringBuilder out) {
 
107
        return true;
 
108
    }
 
109
 
 
110
    public SixModelObject deserialize_stub(ThreadContext tc, STable st) {
 
111
        P6numInstance obj = new P6numInstance();
 
112
        obj.st = st;
 
113
        return obj;
 
114
    }
 
115
 
 
116
    public void deserialize_finish(ThreadContext tc, STable st,
 
117
            SerializationReader reader, SixModelObject obj) {
 
118
        ((P6numInstance)obj).value = reader.readDouble();
 
119
    }
 
120
    
 
121
    public void serialize(ThreadContext tc, SerializationWriter writer, SixModelObject obj) {
 
122
        writer.writeNum(((P6numInstance)obj).value);
 
123
    }
 
124
    
 
125
    public void serialize_inlined(ThreadContext tc, STable st, SerializationWriter writer,
 
126
            String prefix, SixModelObject obj) {
 
127
        try {
 
128
            writer.writeNum((double)obj.getClass().getField(prefix).get(obj));
 
129
        } catch (Exception e) {
 
130
            throw new RuntimeException(e);
 
131
        }
 
132
    }
 
133
    
 
134
    /**
 
135
     * REPR data serialization. Serializes the per-type representation data that
 
136
     * is attached to the supplied STable.
 
137
     */
 
138
    public void serialize_repr_data(ThreadContext tc, STable st, SerializationWriter writer)
 
139
    {
 
140
        writer.writeInt(((StorageSpec)st.REPRData).bits);
 
141
    }
 
142
    
 
143
    /**
 
144
     * REPR data deserialization. Deserializes the per-type representation data and
 
145
     * attaches it to the supplied STable.
 
146
     */
 
147
    public void deserialize_repr_data(ThreadContext tc, STable st, SerializationReader reader)
 
148
    {
 
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();
 
154
        else
 
155
            ss.bits = 64;
 
156
        ss.can_box = StorageSpec.CAN_BOX_NUM;
 
157
        st.REPRData = ss;
 
158
    }
 
159
}