MCPcopy Create free account
hub / github.com/Moddable-OpenSource/moddable / fx_deepEqualSlots

Function fx_deepEqualSlots

modules/base/deepEqual/deepEqual.c:556–652  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

554}
555
556txBoolean fx_deepEqualSlots(txMachine* the, txSlot* limit, txBoolean strict)
557{
558 txSlot* left = the->stack + 1;
559 txSlot* right = the->stack;
560 txBoolean result = 0;
561again:
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))

Callers 4

fx_deepEqualFunction · 0.85
fx_deepEqualEntriesFunction · 0.85
fx_deepEqualInstancesFunction · 0.85
fx_deepEqualPropertiesFunction · 0.85

Calls 3

fxIsSameReferenceFunction · 0.85
fx_deepEqualInstancesFunction · 0.85
fxToNumberFunction · 0.85

Tested by

no test coverage detected