mirror of
				https://github.com/ton-blockchain/ton
				synced 2025-03-09 15:40:10 +00:00 
			
		
		
		
	* Add try-catch * Fix 'return' bugs * Update tests * Fix 'SETCONTVARARGS' bug * Fix 'SETCONTVARARGS' bug again * Check deep stack * Add throw_arg Co-authored-by: legaii <jgates.ardux@gmail.com>
		
			
				
	
	
		
			84 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
			
		
		
	
	
			84 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			Text
		
	
	
	
	
	
forall X -> int cast_to_int(X x) asm "NOP";
 | 
						|
forall X -> builder cast_to_builder(X x) asm "NOP";
 | 
						|
 | 
						|
_ test1_body() {
 | 
						|
  int a = 3;
 | 
						|
  builder b = begin_cell();
 | 
						|
  int c = 1;
 | 
						|
  try {
 | 
						|
    c = 3;
 | 
						|
    throw_arg(b, 100);
 | 
						|
  } catch (x, y) {
 | 
						|
    return (a + c + y, cast_to_builder(x));
 | 
						|
  }
 | 
						|
  return (0, null());
 | 
						|
}
 | 
						|
 | 
						|
() test1() impure {
 | 
						|
  var (x, y) = test1_body();
 | 
						|
  throw_unless(101, x == 104);
 | 
						|
  throw_unless(102, y.builder_refs() == y.builder_bits());
 | 
						|
}
 | 
						|
 | 
						|
_ test2_body(int a, int b, int c) {
 | 
						|
  try {
 | 
						|
    try {
 | 
						|
      try {
 | 
						|
        try {
 | 
						|
          throw_arg_if(1, 201, a + b + c == 3);
 | 
						|
          throw_arg_if(2, 201, a == 3);
 | 
						|
          throw_arg_unless(1, 202, b == 4);
 | 
						|
          return 1;
 | 
						|
        } catch (y, x) {
 | 
						|
          int y = y.cast_to_int();
 | 
						|
          throw_arg_unless(y, x, x == 202);
 | 
						|
          throw_arg(y + 1, 200);
 | 
						|
        }
 | 
						|
      } catch (y, x) {
 | 
						|
        int y = y.cast_to_int();
 | 
						|
        throw_arg_if(y, x, x == 200);
 | 
						|
        throw_arg_if(y + 2, x, y < 2);
 | 
						|
        throw_arg_if(y + 3, 203, a + b + c == 4);
 | 
						|
        throw_arg_unless(y + 4, 204, b == 4);
 | 
						|
        return 3;
 | 
						|
      }
 | 
						|
    } catch (y, x) {
 | 
						|
      int y = y.cast_to_int();
 | 
						|
      try {
 | 
						|
        throw_arg_if(y, x, x == 200);
 | 
						|
        throw_arg_if(y + 1, 200, x == 201);
 | 
						|
        throw_arg_if(x - 203, 200, x == 202);
 | 
						|
        throw_arg_if(y, 200, x == 203);
 | 
						|
        throw_arg_if(a + 4, 205, a + b + c == 5);
 | 
						|
        throw_arg(7, 200);
 | 
						|
      } catch (v, u) {
 | 
						|
        int v = v.cast_to_int();
 | 
						|
        throw_arg_unless(v, u, u == 205);
 | 
						|
        if (c == 0) {
 | 
						|
          return b + 4;
 | 
						|
        }
 | 
						|
        throw_arg(v + 1, 200);
 | 
						|
      }
 | 
						|
    }
 | 
						|
  } catch (y, x) {
 | 
						|
    throw_unless(x, x == 200);
 | 
						|
    return y.cast_to_int();
 | 
						|
  }
 | 
						|
  return null();
 | 
						|
}
 | 
						|
 | 
						|
() test2() impure {
 | 
						|
  throw_unless(201, test2_body(0, 4, 0) == 1);
 | 
						|
  throw_unless(202, test2_body(0, 5, 0) == 2);
 | 
						|
  throw_unless(203, test2_body(3, 4, 0) == 3);
 | 
						|
  throw_unless(204, test2_body(3, 0, 0) == 4);
 | 
						|
  throw_unless(205, test2_body(3, 1, 0) == 5);
 | 
						|
  throw_unless(206, test2_body(3, 2, 0) == 6);
 | 
						|
  throw_unless(207, test2_body(3, 1, 2) == 7);
 | 
						|
  throw_unless(208, test2_body(3, 1, 1) == 8);
 | 
						|
}
 | 
						|
 | 
						|
() main() {
 | 
						|
  test1();
 | 
						|
  test2();
 | 
						|
}
 |