From 4bfb359cddf24e8bf31d08d624236fe1f403ac29 Mon Sep 17 00:00:00 2001 From: Joshua Warner Date: Wed, 30 Apr 2014 20:28:33 -0600 Subject: [PATCH] use ir::Type in Compiler::pop --- include/avian/codegen/compiler.h | 2 +- src/codegen/compiler.cpp | 9 ++++-- src/compile.cpp | 51 ++++++++++++++++---------------- 3 files changed, 34 insertions(+), 28 deletions(-) diff --git a/include/avian/codegen/compiler.h b/include/avian/codegen/compiler.h index 574015d1ff..88b87886e3 100644 --- a/include/avian/codegen/compiler.h +++ b/include/avian/codegen/compiler.h @@ -84,7 +84,7 @@ class Compiler { virtual void push(ir::Type type, Operand* value) = 0; virtual void save(ir::Type type, Operand* value) = 0; - virtual Operand* pop(unsigned footprint) = 0; + virtual Operand* pop(ir::Type type) = 0; virtual void pushed() = 0; virtual void popped(unsigned footprint) = 0; virtual unsigned topOfStack() = 0; diff --git a/src/codegen/compiler.cpp b/src/codegen/compiler.cpp index 2f694a3554..d1052c0ff0 100644 --- a/src/codegen/compiler.cpp +++ b/src/codegen/compiler.cpp @@ -2363,8 +2363,13 @@ class MyCompiler: public Compiler { } } - virtual Operand* pop(unsigned footprint) { - return compiler::pop(&c, footprint); + virtual Operand* pop(ir::Type type) + { + Operand* value = compiler::pop(&c, typeFootprint(&c, type)); + // TODO: once type information is flowed properly, enable this assert. + // Some time later, we can remove the parameter. + // assert(&c, static_cast(value)->type == type); + return value; } virtual void pushed() { diff --git a/src/compile.cpp b/src/compile.cpp index c2657a555c..b86cf25589 100644 --- a/src/compile.cpp +++ b/src/compile.cpp @@ -1688,12 +1688,13 @@ class Frame { pushQuiet(types.i8, o); } - Value popQuiet(unsigned footprint) { - return c->pop(footprint); + Value popQuiet(ir::Type type) + { + return c->pop(type); } Value popLongQuiet() { - return popQuiet(2); + return popQuiet(types.i8); } void pushInt(Value o) { @@ -1729,7 +1730,7 @@ class Frame { Value popInt() { poppedInt(); - return popQuiet(1); + return popQuiet(types.i4); } Value popLong() { @@ -1739,7 +1740,7 @@ class Frame { Value popObject() { poppedObject(); - return popQuiet(1); + return popQuiet(types.object); } void loadInt(unsigned index) { @@ -1773,7 +1774,7 @@ class Frame { } void storeObjectOrAddress(unsigned index) { - storeLocal(context, 1, popQuiet(1), index); + storeLocal(context, 1, popQuiet(types.i4), index); assert(t, sp >= 1); assert(t, sp - 1 >= localSize()); @@ -1793,8 +1794,8 @@ class Frame { } void dupX1() { - Value s0 = popQuiet(1); - Value s1 = popQuiet(1); + Value s0 = popQuiet(types.i4); + Value s1 = popQuiet(types.i4); pushQuiet(types.i4, s0); pushQuiet(types.i4, s1); @@ -1804,7 +1805,7 @@ class Frame { } void dupX2() { - Value s0 = popQuiet(1); + Value s0 = popQuiet(types.i4); if (get(sp - 2) == Long) { Value s1 = popLongQuiet(); @@ -1813,8 +1814,8 @@ class Frame { pushLongQuiet(s1); pushQuiet(types.i4, s0); } else { - Value s1 = popQuiet(1); - Value s2 = popQuiet(1); + Value s1 = popQuiet(types.i4); + Value s2 = popQuiet(types.i4); pushQuiet(types.i4, s0); pushQuiet(types.i4, s2); @@ -1829,8 +1830,8 @@ class Frame { if (get(sp - 1) == Long) { pushLongQuiet(c->peek(2, 0)); } else { - Value s0 = popQuiet(1); - Value s1 = popQuiet(1); + Value s0 = popQuiet(types.i4); + Value s1 = popQuiet(types.i4); pushQuiet(types.i4, s1); pushQuiet(types.i4, s0); @@ -1844,15 +1845,15 @@ class Frame { void dup2X1() { if (get(sp - 1) == Long) { Value s0 = popLongQuiet(); - Value s1 = popQuiet(1); + Value s1 = popQuiet(types.i4); pushLongQuiet(s0); pushQuiet(types.i4, s1); pushLongQuiet(s0); } else { - Value s0 = popQuiet(1); - Value s1 = popQuiet(1); - Value s2 = popQuiet(1); + Value s0 = popQuiet(types.i4); + Value s1 = popQuiet(types.i4); + Value s2 = popQuiet(types.i4); pushQuiet(types.i4, s1); pushQuiet(types.i4, s0); @@ -1875,8 +1876,8 @@ class Frame { pushLongQuiet(s1); pushLongQuiet(s0); } else { - Value s1 = popQuiet(1); - Value s2 = popQuiet(1); + Value s1 = popQuiet(types.i4); + Value s2 = popQuiet(types.i4); pushLongQuiet(s0); pushQuiet(types.i4, s2); @@ -1884,10 +1885,10 @@ class Frame { pushLongQuiet(s0); } } else { - Value s0 = popQuiet(1); - Value s1 = popQuiet(1); - Value s2 = popQuiet(1); - Value s3 = popQuiet(1); + Value s0 = popQuiet(types.i4); + Value s1 = popQuiet(types.i4); + Value s2 = popQuiet(types.i4); + Value s3 = popQuiet(types.i4); pushQuiet(types.i4, s1); pushQuiet(types.i4, s0); @@ -1901,8 +1902,8 @@ class Frame { } void swap() { - Value s0 = popQuiet(1); - Value s1 = popQuiet(1); + Value s0 = popQuiet(types.i4); + Value s1 = popQuiet(types.i4); pushQuiet(types.i4, s0); pushQuiet(types.i4, s1);