From f3bd82bdae3ebce5289b1a1bed9105c5bf04fdbe Mon Sep 17 00:00:00 2001 From: Cliff Click Date: Sun, 29 Oct 2023 10:45:20 -0700 Subject: Fix div-by-0, some javadoc higher level parsers can return null, but their return is ignored anycase. div-by-0 is defined to be 0, backported to ch2,3,4,5 --- chapter02/src/main/java/com/seaofnodes/simple/node/DivNode.java | 8 +++++--- .../src/main/java/com/seaofnodes/simple/type/TypeInteger.java | 2 ++ 2 files changed, 7 insertions(+), 3 deletions(-) (limited to 'chapter02/src/main/java/com') diff --git a/chapter02/src/main/java/com/seaofnodes/simple/node/DivNode.java b/chapter02/src/main/java/com/seaofnodes/simple/node/DivNode.java index bc129690..0056c42d 100644 --- a/chapter02/src/main/java/com/seaofnodes/simple/node/DivNode.java +++ b/chapter02/src/main/java/com/seaofnodes/simple/node/DivNode.java @@ -22,9 +22,11 @@ public class DivNode extends Node { @Override public Type compute() { if (in(1)._type instanceof TypeInteger i0 && - in(2)._type instanceof TypeInteger i1) { - if (i1._con == 0) - throw new IllegalArgumentException("Divide by zero"); + in(2)._type instanceof TypeInteger i1) { + if (i0.isConstant() && i1.isConstant()) + return i1._con == 0 + ? TypeInteger.ZERO + : new TypeInteger(i0._con/i1._con); return new TypeInteger(i0._con / i1._con); } return TypeBot.BOTTOM; diff --git a/chapter02/src/main/java/com/seaofnodes/simple/type/TypeInteger.java b/chapter02/src/main/java/com/seaofnodes/simple/type/TypeInteger.java index db3d4c46..06cac15e 100644 --- a/chapter02/src/main/java/com/seaofnodes/simple/type/TypeInteger.java +++ b/chapter02/src/main/java/com/seaofnodes/simple/type/TypeInteger.java @@ -5,6 +5,8 @@ package com.seaofnodes.simple.type; */ public class TypeInteger extends Type { + public final static TypeInteger ZERO= new TypeInteger(0); + /** * The constant value observed for this type */ -- cgit v1.2.3