add division by zero error
This commit is contained in:
@@ -1,7 +1,3 @@
|
||||
func main() -> int {
|
||||
int x = 0.1
|
||||
if x + 0.2 == 0.3 {
|
||||
return 1
|
||||
}
|
||||
return 0
|
||||
return 1.123 / 0
|
||||
}
|
||||
76
vm_src/vm.c
76
vm_src/vm.c
@@ -165,15 +165,15 @@ ResultType(voidPtr, charptr) vmClock(CometVM* vm) {
|
||||
}
|
||||
|
||||
case INST_ADDI: {
|
||||
int64_t a = pop(vm);
|
||||
int64_t b = pop(vm);
|
||||
int64_t a = pop(vm);
|
||||
|
||||
push(vm, a + b);
|
||||
break;
|
||||
}
|
||||
case INST_ADDF: {
|
||||
int64_t a = pop(vm);
|
||||
int64_t b = pop(vm);
|
||||
int64_t a = pop(vm);
|
||||
|
||||
double aDouble;
|
||||
memcpy(&aDouble, &a, sizeof(double));
|
||||
@@ -188,15 +188,15 @@ ResultType(voidPtr, charptr) vmClock(CometVM* vm) {
|
||||
break;
|
||||
}
|
||||
case INST_SUBI: {
|
||||
int64_t a = pop(vm);
|
||||
int64_t b = pop(vm);
|
||||
int64_t a = pop(vm);
|
||||
|
||||
push(vm, a - b);
|
||||
break;
|
||||
}
|
||||
case INST_SUBF: {
|
||||
int64_t a = pop(vm);
|
||||
int64_t b = pop(vm);
|
||||
int64_t a = pop(vm);
|
||||
|
||||
double aDouble;
|
||||
memcpy(&aDouble, &a, sizeof(double));
|
||||
@@ -211,15 +211,15 @@ ResultType(voidPtr, charptr) vmClock(CometVM* vm) {
|
||||
break;
|
||||
}
|
||||
case INST_MULI: {
|
||||
int64_t a = pop(vm);
|
||||
int64_t b = pop(vm);
|
||||
int64_t a = pop(vm);
|
||||
|
||||
push(vm, a * b);
|
||||
break;
|
||||
}
|
||||
case INST_MULF: {
|
||||
int64_t a = pop(vm);
|
||||
int64_t b = pop(vm);
|
||||
int64_t a = pop(vm);
|
||||
|
||||
double aDouble;
|
||||
memcpy(&aDouble, &a, sizeof(double));
|
||||
@@ -234,9 +234,14 @@ ResultType(voidPtr, charptr) vmClock(CometVM* vm) {
|
||||
break;
|
||||
}
|
||||
case INST_DIVI: {
|
||||
int64_t a = pop(vm);
|
||||
int64_t b = pop(vm);
|
||||
|
||||
if (b == 0) {
|
||||
return Error(voidPtr, charptr, "Division by zero");
|
||||
}
|
||||
|
||||
int64_t a = pop(vm);
|
||||
|
||||
double result = (double)a / (double)b;
|
||||
int64_t casted;
|
||||
memcpy(&casted, &result, sizeof(int64_t));
|
||||
@@ -245,13 +250,21 @@ ResultType(voidPtr, charptr) vmClock(CometVM* vm) {
|
||||
break;
|
||||
}
|
||||
case INST_DIVF: {
|
||||
int64_t a = pop(vm);
|
||||
int64_t b = pop(vm);
|
||||
|
||||
double bDouble;
|
||||
memcpy(&bDouble, &b, sizeof(double));
|
||||
|
||||
if (bDouble == 0) {
|
||||
return Error(voidPtr, charptr, "Division by zero");
|
||||
}
|
||||
|
||||
int64_t a = pop(vm);
|
||||
|
||||
|
||||
double aDouble;
|
||||
memcpy(&aDouble, &a, sizeof(double));
|
||||
double bDouble;
|
||||
memcpy(&bDouble, &b, sizeof(double));
|
||||
|
||||
|
||||
double result = aDouble / bDouble;
|
||||
int64_t outputtedResult;
|
||||
@@ -262,20 +275,23 @@ ResultType(voidPtr, charptr) vmClock(CometVM* vm) {
|
||||
}
|
||||
|
||||
case INST_EQI: {
|
||||
int64_t a = pop(vm);
|
||||
int64_t b = pop(vm);
|
||||
int64_t a = pop(vm);
|
||||
|
||||
|
||||
push(vm, a == b);
|
||||
break;
|
||||
}
|
||||
case INST_EQF: {
|
||||
int64_t b = pop(vm);
|
||||
double bDouble;
|
||||
memcpy(&bDouble, &b, sizeof(double));
|
||||
|
||||
int64_t a = pop(vm);
|
||||
double aDouble;
|
||||
memcpy(&aDouble, &a, sizeof(double));
|
||||
|
||||
int64_t b = pop(vm);
|
||||
double bDouble;
|
||||
memcpy(&bDouble, &b, sizeof(double));
|
||||
|
||||
|
||||
push(vm, aDouble == bDouble);
|
||||
break;
|
||||
@@ -288,14 +304,14 @@ ResultType(voidPtr, charptr) vmClock(CometVM* vm) {
|
||||
break;
|
||||
}
|
||||
case INST_LTF: {
|
||||
int64_t a = pop(vm);
|
||||
double aDouble;
|
||||
memcpy(&aDouble, &a, sizeof(double));
|
||||
|
||||
int64_t b = pop(vm);
|
||||
double bDouble;
|
||||
memcpy(&bDouble, &b, sizeof(double));
|
||||
|
||||
int64_t a = pop(vm);
|
||||
double aDouble;
|
||||
memcpy(&aDouble, &a, sizeof(double));
|
||||
|
||||
push(vm, aDouble < bDouble);
|
||||
break;
|
||||
}
|
||||
@@ -307,14 +323,14 @@ ResultType(voidPtr, charptr) vmClock(CometVM* vm) {
|
||||
break;
|
||||
}
|
||||
case INST_GTF: {
|
||||
int64_t a = pop(vm);
|
||||
double aDouble;
|
||||
memcpy(&aDouble, &a, sizeof(double));
|
||||
|
||||
int64_t b = pop(vm);
|
||||
double bDouble;
|
||||
memcpy(&bDouble, &b, sizeof(double));
|
||||
|
||||
int64_t a = pop(vm);
|
||||
double aDouble;
|
||||
memcpy(&aDouble, &a, sizeof(double));
|
||||
|
||||
push(vm, aDouble > bDouble);
|
||||
break;
|
||||
}
|
||||
@@ -326,14 +342,14 @@ ResultType(voidPtr, charptr) vmClock(CometVM* vm) {
|
||||
break;
|
||||
}
|
||||
case INST_LTEF: {
|
||||
int64_t a = pop(vm);
|
||||
double aDouble;
|
||||
memcpy(&aDouble, &a, sizeof(double));
|
||||
|
||||
int64_t b = pop(vm);
|
||||
double bDouble;
|
||||
memcpy(&bDouble, &b, sizeof(double));
|
||||
|
||||
int64_t a = pop(vm);
|
||||
double aDouble;
|
||||
memcpy(&aDouble, &a, sizeof(double));
|
||||
|
||||
push(vm, aDouble <= bDouble);
|
||||
break;
|
||||
}
|
||||
@@ -345,14 +361,14 @@ ResultType(voidPtr, charptr) vmClock(CometVM* vm) {
|
||||
break;
|
||||
}
|
||||
case INST_GTEF: {
|
||||
int64_t a = pop(vm);
|
||||
double aDouble;
|
||||
memcpy(&aDouble, &a, sizeof(double));
|
||||
|
||||
int64_t b = pop(vm);
|
||||
double bDouble;
|
||||
memcpy(&bDouble, &b, sizeof(double));
|
||||
|
||||
int64_t a = pop(vm);
|
||||
double aDouble;
|
||||
memcpy(&aDouble, &a, sizeof(double));
|
||||
|
||||
push(vm, aDouble >= bDouble);
|
||||
break;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user