19
19
import org .jruby .truffle .nodes .objects .Allocator ;
20
20
import org .jruby .truffle .runtime .RubyContext ;
21
21
import org .jruby .truffle .runtime .core .*;
22
+ import org .jruby .truffle .runtime .object .BasicObjectType ;
22
23
23
24
import java .math .BigDecimal ;
24
25
import java .math .MathContext ;
27
28
@ CoreClass (name = "Truffle::BigDecimal" )
28
29
public abstract class BigDecimalNodes {
29
30
31
+ public static class BigDecimalType extends BasicObjectType {
32
+
33
+ }
34
+
35
+ public static final BigDecimalType BIG_DECIMAL_TYPE = new BigDecimalType ();
36
+
30
37
private static final HiddenKey VALUE_IDENTIFIER = new HiddenKey ("value" );
38
+ public static final Shape BIG_DECIMAL_SHAPE ;
31
39
private static final DynamicObjectFactory BIG_DECIMAL_FACTORY ;
32
40
public static final Property VALUE_PROPERTY ;
33
41
@@ -37,15 +45,8 @@ public abstract class BigDecimalNodes {
37
45
VALUE_IDENTIFIER ,
38
46
allocator .locationForType (BigDecimal .class , EnumSet .of (LocationModifier .NonNull )),
39
47
0 );
40
- final Shape shape = RubyBasicObject .EMPTY_SHAPE .addProperty (VALUE_PROPERTY );
41
- BIG_DECIMAL_FACTORY = shape .createFactory ();
42
- }
43
-
44
- // TODO (pitr 15-May-2015) figure out where to put RubyBigDecimal, or remove completely
45
- public static class RubyBigDecimal extends RubyBasicObject {
46
- public RubyBigDecimal (RubyClass rubyClass , DynamicObject dynamicObject ) {
47
- super (rubyClass , dynamicObject );
48
- }
48
+ BIG_DECIMAL_SHAPE = RubyBasicObject .LAYOUT .createShape (BIG_DECIMAL_TYPE ).addProperty (VALUE_PROPERTY );
49
+ BIG_DECIMAL_FACTORY = BIG_DECIMAL_SHAPE .createFactory ();
49
50
}
50
51
51
52
public static class RubyBigDecimalAllocator implements Allocator {
@@ -84,19 +85,15 @@ public static void setBigDecimalValue(RubyBasicObject bignum, BigDecimal value)
84
85
VALUE_PROPERTY .setSafe (bignum .getDynamicObject (), value , null );
85
86
}
86
87
87
- public static RubyBigDecimal createRubyBigDecimal (RubyClass rubyClass , BigDecimal value ) {
88
- return new RubyBigDecimal (rubyClass , BIG_DECIMAL_FACTORY .newInstance (value ));
88
+ public static RubyBasicObject createRubyBigDecimal (RubyClass rubyClass , BigDecimal value ) {
89
+ return new RubyBasicObject (rubyClass , BIG_DECIMAL_FACTORY .newInstance (value ));
89
90
}
90
91
91
92
public abstract static class BigDecimalCoreMethodNode extends CoreMethodArrayArgumentsNode {
92
93
93
94
public BigDecimalCoreMethodNode (RubyContext context , SourceSection sourceSection ) {
94
95
super (context , sourceSection );
95
96
}
96
-
97
- public static boolean isRubyBigDecimal (Object value ) {
98
- return value instanceof RubyBigDecimal ;
99
- }
100
97
}
101
98
102
99
@ CoreMethod (names = "initialize" , required = 1 )
@@ -107,12 +104,12 @@ public InitializeNode(RubyContext context, SourceSection sourceSection) {
107
104
}
108
105
109
106
@ Specialization (guards = "isRubyBigDecimal(v)" )
110
- public RubyBasicObject initialize (RubyBigDecimal self , RubyBasicObject v ) {
107
+ public RubyBasicObject initialize (RubyBasicObject self , RubyBasicObject v ) {
111
108
return v ;
112
109
}
113
110
114
111
@ Specialization (guards = "isRubyString(v)" )
115
- public RubyBasicObject initializeFromString (RubyBigDecimal self , RubyBasicObject v ) {
112
+ public RubyBasicObject initializeFromString (RubyBasicObject self , RubyBasicObject v ) {
116
113
// TODO (pitr 20-May-2015): add NaN, Infinity handling
117
114
switch (v .toString ()) {
118
115
case "NaN" :
0 commit comments