Browse Source

Fix undefined if

feature/witness_bin
Jordi Baylina 6 years ago
parent
commit
bfdf17fd89
No known key found for this signature in database GPG Key ID: 7480C80C1BE43112
3 changed files with 52 additions and 18 deletions
  1. +24
    -18
      src/exec.js
  2. +14
    -0
      test/cases.js
  3. +14
    -0
      test/circuits/undefinedif.circom

+ 24
- 18
src/exec.js

@ -547,15 +547,17 @@ function execFor(ctx, ast) {
let v = exec(ctx, ast.condition); let v = exec(ctx, ast.condition);
if (ctx.error) return; if (ctx.error) return;
while ((v.value.neq(0))&&(!ctx.returnValue)) {
exec(ctx, ast.body);
if (ctx.error) return;
if (typeof v.value != "undefined") {
while ((v.value.neq(0))&&(!ctx.returnValue)) {
exec(ctx, ast.body);
if (ctx.error) return;
exec(ctx, ast.step);
if (ctx.error) return;
exec(ctx, ast.step);
if (ctx.error) return;
v = exec(ctx, ast.condition);
if (ctx.error) return;
v = exec(ctx, ast.condition);
if (ctx.error) return;
}
} }
} }
@ -563,12 +565,14 @@ function execWhile(ctx, ast) {
let v = exec(ctx, ast.condition); let v = exec(ctx, ast.condition);
if (ctx.error) return; if (ctx.error) return;
while ((v.value.neq(0))&&(!ctx.returnValue)) {
exec(ctx, ast.body);
if (ctx.error) return;
if (typeof v.value != "undefined") {
while ((v.value.neq(0))&&(!ctx.returnValue)) {
exec(ctx, ast.body);
if (ctx.error) return;
v = exec(ctx, ast.condition);
if (ctx.error) return;
v = exec(ctx, ast.condition);
if (ctx.error) return;
}
} }
} }
@ -576,13 +580,15 @@ function execIf(ctx, ast) {
let v = exec(ctx, ast.condition); let v = exec(ctx, ast.condition);
if (ctx.error) return; if (ctx.error) return;
if ((v.value.neq(0))&&(!ctx.returnValue)) {
exec(ctx, ast.then);
if (ctx.error) return;
} else {
if (ast.else) {
exec(ctx, ast.else);
if (typeof v.value != "undefined") {
if ((v.value.neq(0))&&(!ctx.returnValue)) {
exec(ctx, ast.then);
if (ctx.error) return; if (ctx.error) return;
} else {
if (ast.else) {
exec(ctx, ast.else);
if (ctx.error) return;
}
} }
} }
} }

+ 14
- 0
test/cases.js

@ -0,0 +1,14 @@
const chai = require("chai");
const path = require("path");
const snarkjs = require("snarkjs");
const crypto = require("crypto");
const compiler = require("../index.js");
const assert = chai.assert;
describe("Sum test", () => {
it("Should compile a code with an undefined if", async() => {
await compiler(path.join(__dirname, "circuits", "undefinedif.circom"));
});
});

+ 14
- 0
test/circuits/undefinedif.circom

@ -0,0 +1,14 @@
template X() {
signal input i;
signal input j;
signal output out;
if (i == 0) {
out <-- i;
}
else {
out <-- j;
}
}
component main = X();

Loading…
Cancel
Save