@@ -68,23 +68,6 @@ extern "C"
6868 }
6969 }
7070
71- /* ! Assigns special value to the given value. */
72- void value_assign_special (ValueData *v, SpecialValue specialValue)
73- {
74- value_free (v);
75-
76- if (specialValue == SpecialValue::Infinity)
77- v->type = ValueType::Infinity;
78- else if (specialValue == SpecialValue::NegativeInfinity)
79- v->type = ValueType::NegativeInfinity;
80- else if (specialValue == SpecialValue::NaN)
81- v->type = ValueType::NaN;
82- else {
83- v->type = ValueType::Number;
84- v->numberValue = 0 ;
85- }
86- }
87-
8871 /* ! Assigns another value to the given value. */
8972 void value_assign_copy (ValueData *v, const libscratchcpp::ValueData *another)
9073 {
@@ -112,8 +95,6 @@ extern "C"
11295 bool value_isInfinity (const libscratchcpp::ValueData *v)
11396 {
11497 switch (v->type ) {
115- case ValueType::Infinity:
116- return true ;
11798 case ValueType::Number:
11899 return value_isInf (v->numberValue );
119100 case ValueType::String:
@@ -127,8 +108,6 @@ extern "C"
127108 bool value_isNegativeInfinity (const libscratchcpp::ValueData *v)
128109 {
129110 switch (v->type ) {
130- case ValueType::NegativeInfinity:
131- return true ;
132111 case ValueType::Number:
133112 return value_isNegativeInf (v->numberValue );
134113 case ValueType::String:
@@ -142,8 +121,6 @@ extern "C"
142121 bool value_isNaN (const libscratchcpp::ValueData *v)
143122 {
144123 switch (v->type ) {
145- case ValueType::NaN:
146- return true ;
147124 case ValueType::Number:
148125 return std::isnan (v->numberValue );
149126 case ValueType::String:
@@ -168,8 +145,6 @@ extern "C"
168145 if (value_isInfinity (v) || value_isNegativeInfinity (v))
169146 return true ;
170147
171- assert (v->type != ValueType::Infinity && v->type != ValueType::NegativeInfinity);
172-
173148 switch (v->type ) {
174149 case ValueType::Number:
175150 case ValueType::Bool:
@@ -187,11 +162,12 @@ extern "C"
187162 // https://github.com/scratchfoundation/scratch-vm/blob/112989da0e7306eeb405a5c52616e41c2164af24/src/util/cast.js#L157-L181
188163 switch (v->type ) {
189164 case ValueType::Bool:
190- case ValueType::Infinity:
191- case ValueType::NegativeInfinity:
192- case ValueType::NaN:
193165 return true ;
166+
194167 case ValueType::Number: {
168+ if (std::isinf (v->numberValue ) || std::isnan (v->numberValue ))
169+ return true ;
170+
195171 double intpart;
196172 std::modf (v->numberValue , &intpart);
197173 return v->numberValue == intpart;
@@ -220,9 +196,9 @@ extern "C"
220196 /* ! Returns the long representation of the given value. */
221197 long value_toLong (const libscratchcpp::ValueData *v)
222198 {
223- if (v->type == ValueType::Number)
199+ if (v->type == ValueType::Number) {
224200 return v->numberValue ;
225- else if (v->type == ValueType::Bool)
201+ } else if (v->type == ValueType::Bool)
226202 return v->boolValue ;
227203 else if (v->type == ValueType::String)
228204 return value_stringToLong (v->stringValue );
@@ -252,10 +228,6 @@ extern "C"
252228 return v->boolValue ;
253229 else if (v->type == ValueType::String)
254230 return value_stringToDouble (v->stringValue );
255- else if (v->type == ValueType::Infinity)
256- return std::numeric_limits<double >::infinity ();
257- else if (v->type == ValueType::NegativeInfinity)
258- return -std::numeric_limits<double >::infinity ();
259231 else
260232 return 0 ;
261233 }
@@ -269,10 +241,6 @@ extern "C"
269241 return v->numberValue != 0 ;
270242 } else if (v->type == ValueType::String) {
271243 return value_stringToBool (v->stringValue );
272- } else if (v->type == ValueType::Infinity || v->type == ValueType::NegativeInfinity) {
273- return true ;
274- } else if (v->type == ValueType::NaN) {
275- return false ;
276244 } else {
277245 return false ;
278246 }
@@ -287,12 +255,6 @@ extern "C"
287255 value_doubleToString (v->numberValue , dst);
288256 else if (v->type == ValueType::Bool)
289257 dst->assign (v->boolValue ? " true" : " false" );
290- else if (v->type == ValueType::Infinity)
291- dst->assign (" Infinity" );
292- else if (v->type == ValueType::NegativeInfinity)
293- dst->assign (" -Infinity" );
294- else if (v->type == ValueType::NaN)
295- dst->assign (" NaN" );
296258 else
297259 dst->clear ();
298260 }
@@ -396,7 +358,7 @@ extern "C"
396358 double b = value_toDouble (v2);
397359
398360 if ((b == 0 ) || std::isinf (a))
399- value_assign_special (dst, SpecialValue::NaN );
361+ value_assign_double (dst, std::numeric_limits< double >:: quiet_NaN () );
400362 else if (std::isinf (b))
401363 value_assign_double (dst, value_toDouble (v1));
402364 else if (value_isNegative (v1) || value_isNegative (v2))
@@ -413,9 +375,12 @@ extern "C"
413375 // https://github.com/scratchfoundation/scratch-vm/blob/112989da0e7306eeb405a5c52616e41c2164af24/src/util/cast.js#L121-L150
414376 assert (v1 && v2);
415377
416- if (v1->type == ValueType::Number && v2->type == ValueType::Number)
378+ if (v1->type == ValueType::Number && v2->type == ValueType::Number) {
379+ if (std::isnan (v1->numberValue ) && std::isnan (v2->numberValue ))
380+ return true ;
381+
417382 return v1->numberValue == v2->numberValue ;
418- else if (v1->type == ValueType::Bool && v2->type == ValueType::Bool)
383+ } else if (v1->type == ValueType::Bool && v2->type == ValueType::Bool)
419384 return v1->boolValue == v2->boolValue ;
420385
421386 bool ok;
@@ -436,8 +401,8 @@ extern "C"
436401
437402 // Handle the special case of Infinity
438403 if ((static_cast <int >(v1->type ) < 0 ) && (static_cast <int >(v2->type ) < 0 )) {
439- assert (v1-> type != ValueType::NaN );
440- assert (v2-> type != ValueType::NaN );
404+ assert (! value_isNaN (v1) );
405+ assert (! value_isNaN (v2) );
441406 return v1->type == v2->type ;
442407 }
443408
0 commit comments