Skip to content

Commit d2b370a

Browse files
authored
Fix Berry on old ESP32 (arendst#19830)
1 parent 84eaae5 commit d2b370a

File tree

1 file changed

+39
-0
lines changed

1 file changed

+39
-0
lines changed

lib/libesp32/berry/src/be_vm.c

+39
Original file line numberDiff line numberDiff line change
@@ -671,8 +671,17 @@ static void vm_exec(bvm *vm)
671671
if (var_isint(a) && var_isint(b)) {
672672
var_setint(dst, ibinop(-, a, b));
673673
} else if (var_isnumber(a) && var_isnumber(b)) {
674+
#if CONFIG_IDF_TARGET_ESP32 /* when running on ESP32 in IRAM, there is a bug in early chip revision */
675+
union bvaldata x, y; // TASMOTA workaround for ESP32 rev0 bug
676+
x.i = a->v.i;
677+
if (var_isint(a)) { x.r = (breal) x.i; }
678+
y.i = b->v.i;
679+
if (var_isint(b)) { y.r = (breal) y.i; }
680+
var_setreal(dst, x.r - y.r);
681+
#else // CONFIG_IDF_TARGET_ESP32
674682
breal x = var2real(a), y = var2real(b);
675683
var_setreal(dst, x - y);
684+
#endif // CONFIG_IDF_TARGET_ESP32
676685
} else if (var_isinstance(a)) {
677686
ins_binop(vm, "-", ins);
678687
} else {
@@ -685,8 +694,17 @@ static void vm_exec(bvm *vm)
685694
if (var_isint(a) && var_isint(b)) {
686695
var_setint(dst, ibinop(*, a, b));
687696
} else if (var_isnumber(a) && var_isnumber(b)) {
697+
#if CONFIG_IDF_TARGET_ESP32 /* when running on ESP32 in IRAM, there is a bug in early chip revision */
698+
union bvaldata x, y; // TASMOTA workaround for ESP32 rev0 bug
699+
x.i = a->v.i;
700+
if (var_isint(a)) { x.r = (breal) x.i; }
701+
y.i = b->v.i;
702+
if (var_isint(b)) { y.r = (breal) y.i; }
703+
var_setreal(dst, x.r * y.r);
704+
#else // CONFIG_IDF_TARGET_ESP32
688705
breal x = var2real(a), y = var2real(b);
689706
var_setreal(dst, x * y);
707+
#endif // CONFIG_IDF_TARGET_ESP32
690708
} else if (var_isinstance(a)) {
691709
ins_binop(vm, "*", ins);
692710
} else {
@@ -704,11 +722,23 @@ static void vm_exec(bvm *vm)
704722
var_setint(dst, x / y);
705723
}
706724
} else if (var_isnumber(a) && var_isnumber(b)) {
725+
#if CONFIG_IDF_TARGET_ESP32 /* when running on ESP32 in IRAM, there is a bug in early chip revision */
726+
union bvaldata x, y; // TASMOTA workaround for ESP32 rev0 bug
727+
x.i = a->v.i;
728+
if (var_isint(a)) { x.r = (breal) x.i; }
729+
y.i = b->v.i;
730+
if (var_isint(b)) { y.r = (breal) y.i; }
731+
if (y.r == cast(breal, 0)) {
732+
vm_error(vm, "divzero_error", "division by zero");
733+
}
734+
var_setreal(dst, x.r / y.r);
735+
#else // CONFIG_IDF_TARGET_ESP32
707736
breal x = var2real(a), y = var2real(b);
708737
if (y == cast(breal, 0)) {
709738
vm_error(vm, "divzero_error", "division by zero");
710739
}
711740
var_setreal(dst, x / y);
741+
#endif // CONFIG_IDF_TARGET_ESP32
712742
} else if (var_isinstance(a)) {
713743
ins_binop(vm, "/", ins);
714744
} else {
@@ -721,7 +751,16 @@ static void vm_exec(bvm *vm)
721751
if (var_isint(a) && var_isint(b)) {
722752
var_setint(dst, ibinop(%, a, b));
723753
} else if (var_isnumber(a) && var_isnumber(b)) {
754+
#if CONFIG_IDF_TARGET_ESP32 /* when running on ESP32 in IRAM, there is a bug in early chip revision */
755+
union bvaldata x, y; // TASMOTA workaround for ESP32 rev0 bug
756+
x.i = a->v.i;
757+
if (var_isint(a)) { x.r = (breal) x.i; }
758+
y.i = b->v.i;
759+
if (var_isint(b)) { y.r = (breal) y.i; }
760+
var_setreal(dst, mathfunc(fmod)(x.r, y.r));
761+
#else // CONFIG_IDF_TARGET_ESP32
724762
var_setreal(dst, mathfunc(fmod)(var_toreal(a), var_toreal(b)));
763+
#endif // CONFIG_IDF_TARGET_ESP32
725764
} else if (var_isinstance(a)) {
726765
ins_binop(vm, "%", ins);
727766
} else {

0 commit comments

Comments
 (0)