@@ -84,10 +84,7 @@ public Object addSpecial(VirtualFrame frame, DynamicObject a, DynamicObject b) {
84
84
return addSpecial (frame , a , b , 0 );
85
85
}
86
86
87
- @ Specialization (guards = {
88
- "isRubyBigDecimal(a)" ,
89
- "!isRubyBigDecimal(b)"
90
- })
87
+ @ Specialization (guards = "!isRubyBigDecimal(b)" )
91
88
public Object addCoerced (DynamicObject a , Object b ,
92
89
@ Cached ("createPrivate()" ) CallDispatchHeadNode redoCoerced ) {
93
90
return redoCoerced .call (a , "redo_coerced" , coreStrings ().PLUS .getSymbol (), b );
@@ -115,6 +112,12 @@ protected Object add(VirtualFrame frame, DynamicObject a, DynamicObject b, int p
115
112
protected Object addSpecial (VirtualFrame frame , DynamicObject a , DynamicObject b , int precision ) {
116
113
return super .addSpecial (frame , a , b , precision );
117
114
}
115
+
116
+ @ Specialization (guards = "!isRubyBigDecimal(b)" )
117
+ public Object addCoerced (DynamicObject a , Object b , int precision ,
118
+ @ Cached ("createPrivate()" ) CallDispatchHeadNode redoCoerced ) {
119
+ return redoCoerced .call (a , "redo_coerced" , getSymbol ("add" ), b , precision );
120
+ }
118
121
}
119
122
120
123
@ CoreMethod (names = "-" , required = 1 )
@@ -136,10 +139,7 @@ public Object subSpecial(VirtualFrame frame, DynamicObject a, DynamicObject b) {
136
139
return subSpecial (frame , a , b , 0 );
137
140
}
138
141
139
- @ Specialization (guards = {
140
- "isRubyBigDecimal(a)" ,
141
- "!isRubyBigDecimal(b)"
142
- })
142
+ @ Specialization (guards = "!isRubyBigDecimal(b)" )
143
143
public Object subCoerced (DynamicObject a , Object b ,
144
144
@ Cached ("createPrivate()" ) CallDispatchHeadNode redoCoerced ) {
145
145
return redoCoerced .call (a , "redo_coerced" , coreStrings ().MINUS .getSymbol (), b );
@@ -167,6 +167,12 @@ public Object subNormal(VirtualFrame frame, DynamicObject a, DynamicObject b, in
167
167
public Object subSpecial (VirtualFrame frame , DynamicObject a , DynamicObject b , int precision ) {
168
168
return super .subSpecial (frame , a , b , precision );
169
169
}
170
+
171
+ @ Specialization (guards = "!isRubyBigDecimal(b)" )
172
+ public Object subCoerced (DynamicObject a , Object b , int precision ,
173
+ @ Cached ("createPrivate()" ) CallDispatchHeadNode redoCoerced ) {
174
+ return redoCoerced .call (a , "redo_coerced" , getSymbol ("sub" ), b , precision );
175
+ }
170
176
}
171
177
172
178
@ CoreMethod (names = "-@" )
@@ -252,6 +258,12 @@ public Object multSpecialNormal(VirtualFrame frame, DynamicObject a, DynamicObje
252
258
public Object multSpecial (VirtualFrame frame , DynamicObject a , DynamicObject b ) {
253
259
return multSpecial (frame , a , b , 0 );
254
260
}
261
+
262
+ @ Specialization (guards = "!isRubyBigDecimal(b)" )
263
+ public Object multCoerced (DynamicObject a , Object b ,
264
+ @ Cached ("createPrivate()" ) CallDispatchHeadNode redoCoerced ) {
265
+ return redoCoerced .call (a , "redo_coerced" , coreStrings ().MULTIPLY .getSymbol (), b );
266
+ }
255
267
}
256
268
257
269
@ CoreMethod (names = "mult" , required = 2 , lowerFixnum = 2 )
@@ -293,6 +305,12 @@ public Object multSpecialNormal(VirtualFrame frame, DynamicObject a, DynamicObje
293
305
public Object multSpecial (VirtualFrame frame , DynamicObject a , DynamicObject b , int precision ) {
294
306
return super .multSpecial (frame , a , b , precision );
295
307
}
308
+
309
+ @ Specialization (guards = "!isRubyBigDecimal(b)" )
310
+ public Object multCoerced (DynamicObject a , Object b , int precision ,
311
+ @ Cached ("createPrivate()" ) CallDispatchHeadNode redoCoerced ) {
312
+ return redoCoerced .call (a , "redo_coerced" , getSymbol ("mult" ), b , precision );
313
+ }
296
314
}
297
315
298
316
@ CoreMethod (names = { "/" , "quo" }, required = 1 )
@@ -330,6 +348,12 @@ public Object divSpecialNormal(VirtualFrame frame, DynamicObject a, DynamicObjec
330
348
public Object divSpecialSpecial (VirtualFrame frame , DynamicObject a , DynamicObject b ) {
331
349
return divSpecialSpecial (frame , a , b , 0 );
332
350
}
351
+
352
+ @ Specialization (guards = "!isRubyBigDecimal(b)" )
353
+ public Object divCoerced (DynamicObject a , Object b ,
354
+ @ Cached ("createPrivate()" ) CallDispatchHeadNode redoCoerced ) {
355
+ return redoCoerced .call (a , "redo_coerced" , coreStrings ().DIVIDE .getSymbol (), b );
356
+ }
333
357
}
334
358
335
359
@ CoreMethod (names = "div" , required = 1 , optional = 1 , lowerFixnum = 2 )
@@ -469,6 +493,18 @@ public Object divSpecialSpecial(
469
493
public Object divSpecialSpecial (VirtualFrame frame , DynamicObject a , DynamicObject b , int precision ) {
470
494
return super .divSpecialSpecial (frame , a , b , precision );
471
495
}
496
+
497
+ @ Specialization (guards = "!isRubyBigDecimal(b)" )
498
+ public Object divCoerced (DynamicObject a , Object b , NotProvided precision ,
499
+ @ Cached ("createPrivate()" ) CallDispatchHeadNode redoCoerced ) {
500
+ return redoCoerced .call (a , "redo_coerced" , getSymbol ("div" ), b );
501
+ }
502
+
503
+ @ Specialization (guards = "!isRubyBigDecimal(b)" )
504
+ public Object divCoerced (DynamicObject a , Object b , int precision ,
505
+ @ Cached ("createPrivate()" ) CallDispatchHeadNode redoCoerced ) {
506
+ return redoCoerced .call (a , "redo_coerced" , getSymbol ("div" ), b , precision );
507
+ }
472
508
}
473
509
474
510
@ CoreMethod (names = "divmod" , required = 1 )
@@ -568,6 +604,12 @@ public Object divmodSpecial(
568
604
throw new UnsupportedOperationException ("unreachable code branch" );
569
605
}
570
606
607
+ @ Specialization (guards = "!isRubyBigDecimal(b)" )
608
+ public Object divmodCoerced (DynamicObject a , Object b ,
609
+ @ Cached ("createPrivate()" ) CallDispatchHeadNode redoCoerced ) {
610
+ return redoCoerced .call (a , "redo_coerced" , getSymbol ("divmod" ), b );
611
+ }
612
+
571
613
}
572
614
573
615
@ CoreMethod (names = "remainder" , required = 1 )
@@ -614,6 +656,12 @@ public Object remainderSpecial(
614
656
return createBigDecimal (frame , BigDecimalType .NAN );
615
657
}
616
658
}
659
+
660
+ @ Specialization (guards = "!isRubyBigDecimal(b)" )
661
+ public Object remainderCoerced (DynamicObject a , Object b ,
662
+ @ Cached ("createPrivate()" ) CallDispatchHeadNode redoCoerced ) {
663
+ return redoCoerced .call (a , "redo_coerced" , getSymbol ("remainder" ), b );
664
+ }
617
665
}
618
666
619
667
@ CoreMethod (names = { "modulo" , "%" }, required = 1 )
@@ -691,6 +739,12 @@ public Object moduloSpecial(
691
739
692
740
throw new UnsupportedOperationException ("unreachable code branch" );
693
741
}
742
+
743
+ @ Specialization (guards = "!isRubyBigDecimal(b)" )
744
+ public Object moduloCoerced (DynamicObject a , Object b ,
745
+ @ Cached ("createPrivate()" ) CallDispatchHeadNode redoCoerced ) {
746
+ return redoCoerced .call (a , "redo_coerced" , getSymbol ("modulo" ), b );
747
+ }
694
748
}
695
749
696
750
@ CoreMethod (names = { "**" , "power" }, required = 1 , optional = 1 , lowerFixnum = { 1 , 2 })
@@ -1062,15 +1116,10 @@ public Object compareSpecial(DynamicObject a, DynamicObject b) {
1062
1116
return aCompare .compareTo (bCompare );
1063
1117
}
1064
1118
1065
- @ Specialization (guards = "isNil(b)" )
1066
- public Object compareNil (DynamicObject a , DynamicObject b ) {
1067
- return nil ();
1068
- }
1069
-
1070
- @ Specialization (guards = { "!isRubyBigDecimal(b)" , "!isNil(b)" })
1119
+ @ Specialization (guards = "!isRubyBigDecimal(b)" )
1071
1120
public Object compareCoerced (DynamicObject a , DynamicObject b ,
1072
- @ Cached ("createPrivate()" ) CallDispatchHeadNode redoCoerced ) {
1073
- return redoCoerced .call (a , "redo_coerced" , coreStrings (). SPACESHIP . getSymbol () , b );
1121
+ @ Cached ("createPrivate()" ) CallDispatchHeadNode redoCompare ) {
1122
+ return redoCompare .call (a , "redo_compare_no_error" , b );
1074
1123
}
1075
1124
1076
1125
@ TruffleBoundary
0 commit comments