This is the mail archive of the frysk-cvs@sources.redhat.com mailing list for the frysk project.
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |
Other format: | [Raw text] |
The branch, master has been updated via b8552bc35614296282376192e1057d0c4f2bd065 (commit) from c51aa91611f6b182762c6e81f5684650ac0082ef (commit) Those revisions listed above that are new to this repository have not appeared on any other notification email. - Log ----------------------------------------------------------------- commit b8552bc35614296282376192e1057d0c4f2bd065 Author: Teresa Thomas <tthomas@redhat.com> Date: Wed Nov 14 14:23:42 2007 -0500 Implement logical expressions for non-integer types; Simplify. frysk-core/frysk/value/ChangeLog 2007-11-14 Teresa Thomas <tthomas@redhat.com> * ArithmeticUnit.java (logicalAnd): Implement here, use getLogicalValue. (logicalOr): Ditto. (logicalNegation): Ditto. (wordSize): New. * AddressUnit.java: Update. (getLogicalValue): New. (wordSize): Delete. * IntegerUnit.java: Update. (getLogicalValue): New. * FloatingPointUnit.java: Update. (getLogicalValue): New. * TestValue.java: Add tests for above. frysk-core/frysk/expr/ChangeLog 2007-11-14 Teresa Thomas <tthomas@redhat.com> * CExprEvaluator.g: Give task memory to all logical operators. ----------------------------------------------------------------------- Summary of changes: frysk-core/frysk/expr/CExprEvaluator.g | 13 +++---- frysk-core/frysk/expr/ChangeLog | 7 +++- frysk-core/frysk/value/AddressUnit.java | 14 +++----- frysk-core/frysk/value/ArithmeticUnit.java | 22 ++++++++++-- frysk-core/frysk/value/ChangeLog | 16 +++++++++ frysk-core/frysk/value/FloatingPointUnit.java | 13 +++----- frysk-core/frysk/value/IntegerUnit.java | 26 +++------------ frysk-core/frysk/value/TestValue.java | 42 ++++++++++++++++-------- 8 files changed, 89 insertions(+), 64 deletions(-) First 500 lines of diff: diff --git a/frysk-core/frysk/expr/CExprEvaluator.g b/frysk-core/frysk/expr/CExprEvaluator.g index 4f06c19..2fb26a7 100644 --- a/frysk-core/frysk/expr/CExprEvaluator.g +++ b/frysk-core/frysk/expr/CExprEvaluator.g @@ -256,14 +256,12 @@ expr returns [Value returnVar=null] .bitWiseOr(v1, v2); } | #(AND v1=expr v2=expr) { - returnVar = v1.getType().getALU(v2.getType(), - exprSymTab.getWordSize()) - .logicalAnd(v1, v2); + returnVar = v1.getType().getALU(exprSymTab.getWordSize()) + .logicalAnd(v1, v2, exprSymTab.taskMemory()); } | #(OR v1=expr v2=expr) { - returnVar = v1.getType().getALU(v2.getType(), - exprSymTab.getWordSize()) - .logicalOr(v1, v2); + returnVar = v1.getType().getALU(exprSymTab.getWordSize()) + .logicalOr(v1, v2,exprSymTab.taskMemory()); } | #(NOT v1=expr) { // byte buffer needed for Pointer/Address types @@ -277,7 +275,8 @@ expr returns [Value returnVar=null] | #(COND_EXPR log_expr=expr v1=expr v2=expr) { returnVar = ((log_expr.getType().getALU(log_expr.getType(), exprSymTab.getWordSize()) - .getLogicalValue(log_expr)) ? v1 : v2); + .getLogicalValue(log_expr, exprSymTab.taskMemory())) + ? v1 : v2); } | o:OCTALINT { char c = o.getText().charAt(o.getText().length() - 1); diff --git a/frysk-core/frysk/expr/ChangeLog b/frysk-core/frysk/expr/ChangeLog index 4d06e8a..f4519d1 100644 --- a/frysk-core/frysk/expr/ChangeLog +++ b/frysk-core/frysk/expr/ChangeLog @@ -1,5 +1,10 @@ +2007-11-14 Teresa Thomas <tthomas@redhat.com> + + * CExprEvaluator.g: Give task memory to + all logical operators. + 2007-11-13 Teresa Thomas <tthomas@redhat.com> - + * CExprEvaluator.g: Update. 2007-11-09 Teresa Thomas <tthomas@redhat.com> diff --git a/frysk-core/frysk/value/AddressUnit.java b/frysk-core/frysk/value/AddressUnit.java index 8917459..32b7503 100644 --- a/frysk-core/frysk/value/AddressUnit.java +++ b/frysk-core/frysk/value/AddressUnit.java @@ -41,25 +41,22 @@ package frysk.value; import inua.eio.ByteOrder; import inua.eio.ByteBuffer; + /** * Operation handling for pointers and addresses. */ public class AddressUnit extends ArithmeticUnit -{ - private final int wordSize; - +{ public AddressUnit (ArrayType t, int wordSize) { super (wordSize); retType = new PointerType(t.getName(), ByteOrder.BIG_ENDIAN, wordSize, t.getType()); - this.wordSize = wordSize; } public AddressUnit (PointerType t, int wordSize) { super (wordSize); retType = t; - this.wordSize = wordSize; } /** @@ -124,9 +121,8 @@ extends ArithmeticUnit Value v2Neg = new Value (v2.getType(), l); return add (v1, v2Neg); } - - public Value logicalNegation(Value v1, ByteBuffer mem) { - return intType.createValue - (v1.toPrint(Format.NATURAL, mem).equals("0x0")? 1:0); + + public boolean getLogicalValue (Value v1, ByteBuffer mem) { + return (v1.toPrint(Format.NATURAL, mem).equals("0x0")? false:true); } } \ No newline at end of file diff --git a/frysk-core/frysk/value/ArithmeticUnit.java b/frysk-core/frysk/value/ArithmeticUnit.java index acfe985..5bfaea7 100644 --- a/frysk-core/frysk/value/ArithmeticUnit.java +++ b/frysk-core/frysk/value/ArithmeticUnit.java @@ -55,6 +55,8 @@ public abstract class ArithmeticUnit // Integer return type for relational, equality // and logical operations. protected IntegerType intType; + + protected int wordSize; protected ArithmeticUnit(int wordSize) { // XXX: Is endianness okay? @@ -62,6 +64,7 @@ public abstract class ArithmeticUnit // size of machine. intType = new UnsignedType ("int", ByteOrder.LITTLE_ENDIAN, wordSize); + this.wordSize = wordSize; } // Multiplicative and Additive expressions @@ -145,17 +148,28 @@ public abstract class ArithmeticUnit throw new InvalidOperatorException (v1.getType(), v2.getType(), "&&"); } + // Logical expressions - valid for any scalar types. + public Value logicalAnd (Value v1, Value v2, ByteBuffer mem) { + boolean op1 = v1.getType().getALU(wordSize).getLogicalValue(v1, mem); + boolean op2 = v2.getType().getALU(wordSize).getLogicalValue(v2, mem); + return intType.createValue( (op1 && op2) ? 1:0); + } public Value logicalOr (Value v1, Value v2) { throw new InvalidOperatorException (v1.getType(), v2.getType(), "||"); } + public Value logicalOr (Value v1, Value v2, ByteBuffer mem) { + boolean op1 = v1.getType().getALU(wordSize).getLogicalValue(v1, mem); + boolean op2 = v2.getType().getALU(wordSize).getLogicalValue(v2, mem); + return intType.createValue( op1 || op2 ? 1:0); + } public Value logicalNegation(Value v1, ByteBuffer mem) { - throw new InvalidOperatorException - (v1.getType(), "!"); + boolean op1 = v1.getType().getALU(wordSize).getLogicalValue(v1, mem); + return intType.createValue( op1 ? 0:1); } - public boolean getLogicalValue (Value v1) { + public boolean getLogicalValue (Value v1, ByteBuffer mem) { throw new InvalidOperatorException - (v1.getType(), "bool"); + (v1.getType(), "getLogicalValue"); } // Assigment expressions. diff --git a/frysk-core/frysk/value/ChangeLog b/frysk-core/frysk/value/ChangeLog index 43d1291..037936f 100644 --- a/frysk-core/frysk/value/ChangeLog +++ b/frysk-core/frysk/value/ChangeLog @@ -1,3 +1,19 @@ +2007-11-14 Teresa Thomas <tthomas@redhat.com> + + * ArithmeticUnit.java (logicalAnd): Implement here, + use getLogicalValue. + (logicalOr): Ditto. + (logicalNegation): Ditto. + (wordSize): New. + * AddressUnit.java: Update. + (getLogicalValue): New. + (wordSize): Delete. + * IntegerUnit.java: Update. + (getLogicalValue): New. + * FloatingPointUnit.java: Update. + (getLogicalValue): New. + * TestValue.java: Add tests for above. + 2007-11-13 Teresa Thomas <tthomas@redhat.com> * ArithmeticUnit.java (logicalNegation): Add task mem to diff --git a/frysk-core/frysk/value/FloatingPointUnit.java b/frysk-core/frysk/value/FloatingPointUnit.java index 3e1ff5e..6b57434 100644 --- a/frysk-core/frysk/value/FloatingPointUnit.java +++ b/frysk-core/frysk/value/FloatingPointUnit.java @@ -38,6 +38,7 @@ // exception. package frysk.value; + import inua.eio.ByteBuffer; /** @@ -102,13 +103,9 @@ public class FloatingPointUnit public Value notEqual (Value v1, Value v2) { return retType.createValue (v1.doubleValue() != v2.doubleValue() ? 1:0); - } + } - /** - * @param mem - unused here. - */ - public Value logicalNegation(Value v1, ByteBuffer mem) { - return intType.createValue - (v1.doubleValue() == 0.0? 1 : 0); - } + public boolean getLogicalValue (Value v1, ByteBuffer mem) { + return ((v1.doubleValue() == 0.0) ? false : true); + } } \ No newline at end of file diff --git a/frysk-core/frysk/value/IntegerUnit.java b/frysk-core/frysk/value/IntegerUnit.java index e43adbd..ce3f505 100644 --- a/frysk-core/frysk/value/IntegerUnit.java +++ b/frysk-core/frysk/value/IntegerUnit.java @@ -133,26 +133,10 @@ public class IntegerUnit public Value bitWiseComplement(Value v1) { return retType.createValue (v1.asBigInteger().not()); - } - - public Value logicalAnd(Value v1, Value v2) { - return retType.createValue - ((v1.asBigInteger().compareTo(BigInteger.ZERO) == 0 ? false : true) - && (v2.asBigInteger().compareTo(BigInteger.ZERO) == 0 ? false : true) ? 1 : 0); - } - public Value logicalOr(Value v1, Value v2) { - return retType.createValue - ((v1.asBigInteger().compareTo(BigInteger.ZERO) == 0 ? false : true) - || (v1.asBigInteger().compareTo(BigInteger.ZERO) == 0 ? false : true) ? 1 : 0); - } - /** - * @ param mem - unused here. - */ - public Value logicalNegation(Value v1, ByteBuffer mem) { - return retType.createValue - (v1.asBigInteger().compareTo(BigInteger.ZERO) == 0 ? 1 : 0); - } - public boolean getLogicalValue (Value v1) { - return ((v1.asBigInteger().compareTo(BigInteger.ZERO) == 0) ? false : true); + } + + public boolean getLogicalValue (Value v1, ByteBuffer mem) { + return ((v1.asBigInteger().compareTo(BigInteger.ZERO) == 0) + ? false : true); } } \ No newline at end of file diff --git a/frysk-core/frysk/value/TestValue.java b/frysk-core/frysk/value/TestValue.java index d8c8289..30507f5 100644 --- a/frysk-core/frysk/value/TestValue.java +++ b/frysk-core/frysk/value/TestValue.java @@ -41,6 +41,7 @@ package frysk.value; import inua.eio.ArrayByteBuffer; import inua.eio.ByteOrder; +import frysk.Config; import frysk.junit.TestCase; public class TestValue @@ -57,6 +58,9 @@ public class TestValue private ArithmeticType byteType = new SignedType("byte", ByteOrder.LITTLE_ENDIAN, 1); private ArithmeticType floatType = new FloatingPointType("float", ByteOrder.LITTLE_ENDIAN, 4); private ArithmeticType doubleType = new FloatingPointType("double", ByteOrder.LITTLE_ENDIAN, 8); + + private int wordSize = Config.getWordSize(); + public void testNumber () { Value v1 = byteType.createValue(1); @@ -137,13 +141,13 @@ public class TestValue assertEquals ("9 ^ 4", 9 ^ 4, v3.asLong()); v3 = v1.getType().getALU(v2.getType(), 0).bitWiseComplement(v1); assertEquals ("~4", ~4, v3.asLong()); - v3 = v1.getType().getALU(v2.getType(), 0).logicalAnd(v2, v1); - assertEquals ("9 & 4", 1, v3.asLong()); - v3 = v1.getType().getALU(v2.getType(), 0).logicalOr(v2, v1); - assertEquals ("9 | 4", 1, v3.asLong()); - v3 = v1.getType().getALU(v1.getType(), 0).logicalNegation(v1, null); + v3 = v1.getType().getALU(wordSize).logicalAnd(v2, v1, null); + assertEquals ("9 && 4", 1, v3.asLong()); + v3 = v1.getType().getALU(wordSize).logicalOr(v2, v1, null); + assertEquals ("9 || 4", 1, v3.asLong()); + v3 = v1.getType().getALU(wordSize).logicalNegation(v1, null); assertEquals ("!4", 0, v3.asLong()); - bool = v2.getType().getALU(v2.getType(), 0).getLogicalValue(v2); + bool = v2.getType().getALU(wordSize).getLogicalValue(v2, null); assertEquals ("bool(9)", true, bool); v3 = v3.assign(v1); assertEquals ("v3 = 4", 4, v3.asLong()); @@ -162,11 +166,11 @@ public class TestValue v3 = v1.getType().getALU(v2.getType(), 0).shiftRightEqual(v3, v1); assertEquals ("v3 >>= 4", 0, v3.asLong()); v3 = v1.getType().getALU(v2.getType(), 0).bitWiseOrEqual(v3, v1); - assertEquals ("v3 ||= 4", 4, v3.asLong()); + assertEquals ("v3 |= 4", 4, v3.asLong()); v3 = v1.getType().getALU(v2.getType(), 0).bitWiseXorEqual(v3, v1); assertEquals ("v3 ^= 4", 0, v3.asLong()); v3 =v1.getType().getALU(v2.getType(), 0).bitWiseAndEqual(v3, v1); - assertEquals ("v3 &&= 4", 0, v3.asLong()); + assertEquals ("v3 &= 4", 0, v3.asLong()); } public void testFloatOps () @@ -207,11 +211,16 @@ public class TestValue v3 = v3.getType().getALU(v1.getType(), 0).modEqual(v3, v1); assertEquals ("v3 %= 4", 0, v3.doubleValue(), 0); // Note: Return type of logical expression is int. - v3 = v1.getType().getALU(v1.getType(), 0).logicalNegation(v1, null); + v3 = v1.getType().getALU(wordSize).logicalAnd(v2, v1, null); + assertEquals ("9 && 4", 1, v3.asLong()); + v3 = v1.getType().getALU(wordSize).logicalOr(v2, v1, null); + assertEquals ("9 || 4", 1, v3.asLong()); + v3 = v1.getType().getALU(wordSize).logicalNegation(v1, null); assertEquals ("!4", 0, v3.asLong()); } - public void testAddressOps() { + public void testAddressOps() + { // Construct a buffer with a string in it. ArrayByteBuffer memory = new ArrayByteBuffer("0123Hello World\0>>>".getBytes()); @@ -220,9 +229,14 @@ public class TestValue 1, true)); // Construct the pointer to it. Location l = new ScratchLocation(new byte[] { 4 }); - Value string = new Value (t, l); - - Value v = t.getALU(8).logicalNegation(string, memory); - assertEquals("!string", 0, v.asLong()); + Value ptr = new Value (t, l); + Value v1 = intType.createValue(4); + + Value v = v1.getType().getALU(wordSize).logicalAnd(v1, ptr, memory); + assertEquals ("ptr && 4", 1, v.asLong()); + v = v1.getType().getALU(wordSize).logicalOr(v1, ptr, memory); + assertEquals ("ptr || 4", 1, v.asLong()); + v = t.getALU(8).logicalNegation(ptr, memory); + assertEquals("!ptr", 0, v.asLong()); } } hooks/post-receive -- frysk system monitor/debugger
Index Nav: | [Date Index] [Subject Index] [Author Index] [Thread Index] | |
---|---|---|
Message Nav: | [Date Prev] [Date Next] | [Thread Prev] [Thread Next] |