| 554 | } |
| 555 | |
| 556 | txBoolean fx_deepEqualSlots(txMachine* the, txSlot* limit, txBoolean strict) |
| 557 | { |
| 558 | txSlot* left = the->stack + 1; |
| 559 | txSlot* right = the->stack; |
| 560 | txBoolean result = 0; |
| 561 | again: |
| 562 | if (left->kind == right->kind) { |
| 563 | if ((XS_UNDEFINED_KIND == left->kind) || (XS_NULL_KIND == left->kind)) |
| 564 | result = 1; |
| 565 | else if (XS_BOOLEAN_KIND == left->kind) |
| 566 | result = left->value.boolean == right->value.boolean; |
| 567 | else if (XS_INTEGER_KIND == left->kind) |
| 568 | result = left->value.integer == right->value.integer; |
| 569 | else if (XS_NUMBER_KIND == left->kind) { |
| 570 | if (strict) |
| 571 | result = ((c_isnan(left->value.number) && c_isnan(right->value.number)) || ((left->value.number == right->value.number) && (c_signbit(left->value.number) == c_signbit(right->value.number)))); |
| 572 | else |
| 573 | result = ((c_isnan(left->value.number) && c_isnan(right->value.number)) || (left->value.number == right->value.number)); |
| 574 | mxFloatingPointOp("fx_deepEqual"); |
| 575 | } |
| 576 | else if ((XS_STRING_KIND == left->kind) || (XS_STRING_X_KIND == left->kind)) |
| 577 | result = c_strcmp(left->value.string, right->value.string) == 0; |
| 578 | else if (XS_SYMBOL_KIND == left->kind) |
| 579 | result = left->value.symbol == right->value.symbol; |
| 580 | else if (XS_REFERENCE_KIND == left->kind) { |
| 581 | if (fxIsSameReference(the, left, right)) |
| 582 | result = 1; |
| 583 | else |
| 584 | result = fx_deepEqualInstances(the, limit, strict); |
| 585 | } |
| 586 | #if mxHostFunctionPrimitive |
| 587 | else if (XS_HOST_FUNCTION_KIND == left->kind) |
| 588 | result = left->value.hostFunction.builder == right->value.hostFunction.builder; |
| 589 | #endif |
| 590 | else if ((XS_BIGINT_KIND == left->kind) || (XS_BIGINT_X_KIND == left->kind)) |
| 591 | result = gxTypeBigInt.compare(the, 0, 1, 0, left, right); |
| 592 | else |
| 593 | result = 0; |
| 594 | } |
| 595 | else if ((XS_INTEGER_KIND == left->kind) && (XS_NUMBER_KIND == right->kind)) { |
| 596 | if (strict) { |
| 597 | txNumber aNumber = left->value.integer; |
| 598 | result = (aNumber == right->value.number) && (signbit(aNumber) == signbit(right->value.number)); |
| 599 | } |
| 600 | else |
| 601 | result = (!c_isnan(right->value.number)) && ((txNumber)(left->value.integer) == right->value.number); |
| 602 | mxFloatingPointOp("fx_deepEqual"); |
| 603 | } |
| 604 | else if ((XS_NUMBER_KIND == left->kind) && (XS_INTEGER_KIND == right->kind)) { |
| 605 | if (strict) { |
| 606 | txNumber bNumber = right->value.integer; |
| 607 | result = (left->value.number == bNumber) && (signbit(left->value.number) == signbit(bNumber)); |
| 608 | } |
| 609 | else |
| 610 | result = (!c_isnan(left->value.number)) && (left->value.number == (txNumber)(right->value.integer)); |
| 611 | mxFloatingPointOp("fx_deepEqual"); |
| 612 | } |
| 613 | else if ((XS_STRING_KIND == left->kind) && (XS_STRING_X_KIND == right->kind)) |
no test coverage detected