diff --git a/mozilla/js/js2/icodegenerator.cpp b/mozilla/js/js2/icodegenerator.cpp index 564b8c45df5..a903a755d77 100644 --- a/mozilla/js/js2/icodegenerator.cpp +++ b/mozilla/js/js2/icodegenerator.cpp @@ -153,7 +153,7 @@ void ICodeGenerator::endWhileExpression(Register condition) void ICodeGenerator::endWhileStatement() { // recover the while stream - WhileCodeState *ics = dynamic_cast(stitcher.top()); + WhileCodeState *ics = static_cast(stitcher.top()); stitcher.pop(); // mark the start of the condition code diff --git a/mozilla/js/js2/js2.cpp b/mozilla/js/js2/js2.cpp index 09abdfe1d37..6a76a31cb6b 100644 --- a/mozilla/js/js2/js2.cpp +++ b/mozilla/js/js2/js2.cpp @@ -329,13 +329,63 @@ ProcessArgs(char **argv, int argc) } #endif +#include "icodegenerator.h" +void testICG(World &world) +{ + // + // testing ICG + // + SourcePosition pos = { 0, 0, 0 }; + ICodeGenerator icg; + + // var i,j; i = j + 2; + // i is bound to var #0, j to var #1 + + icg.beginStatement(pos); + Register r1 = icg.loadVariable(1); + Register r2 = icg.loadImmediate(2.0); + icg.saveVariable(0, icg.op(ADD, r1, r2)); + + // j = a.b + icg.beginStatement(pos); + Register r4 = icg.loadName(world.identifiers[widenCString("a")]); + Register r5 = icg.getProperty(world.identifiers[widenCString("b")], r4); + icg.saveVariable(1, r5); + + // while (i) i = i + j; + icg.beginWhileStatement(pos); + r1 = icg.loadVariable(0); + icg.endWhileExpression(r1); + icg.saveVariable(0, icg.op(ADD, icg.loadVariable(0), icg.loadVariable(1))); + icg.endWhileStatement(); + + // if (i) if (j) i = 3; else j = 4; + r1 = icg.loadVariable(0); + icg.beginIfStatement(pos, r1); + r2 = icg.loadVariable(1); + icg.beginIfStatement(pos, r2); + icg.saveVariable(0, icg.loadImmediate(3)); + icg.beginElseStatement(true); + icg.saveVariable(1, icg.loadImmediate(4)); + icg.endIfStatement(); + icg.beginElseStatement(false); + icg.endIfStatement(); + + std::cout << icg; +} + int main(int argc, char **argv) { #if defined(XP_MAC) && !defined(XP_MAC_MPW) initConsole("\pJavaScript Shell", "Welcome to the js2 shell.\n", argc, argv); #endif World world; +#if 0 + testICG(world); +#else readEvalPrint(std::cin, world); - return 0; +#endif + return 0; + //return ProcessArgs(argv + 1, argc - 1); } diff --git a/mozilla/js2/src/icodegenerator.cpp b/mozilla/js2/src/icodegenerator.cpp index 564b8c45df5..a903a755d77 100644 --- a/mozilla/js2/src/icodegenerator.cpp +++ b/mozilla/js2/src/icodegenerator.cpp @@ -153,7 +153,7 @@ void ICodeGenerator::endWhileExpression(Register condition) void ICodeGenerator::endWhileStatement() { // recover the while stream - WhileCodeState *ics = dynamic_cast(stitcher.top()); + WhileCodeState *ics = static_cast(stitcher.top()); stitcher.pop(); // mark the start of the condition code diff --git a/mozilla/js2/tests/cpp/js2_shell.cpp b/mozilla/js2/tests/cpp/js2_shell.cpp index 09abdfe1d37..6a76a31cb6b 100644 --- a/mozilla/js2/tests/cpp/js2_shell.cpp +++ b/mozilla/js2/tests/cpp/js2_shell.cpp @@ -329,13 +329,63 @@ ProcessArgs(char **argv, int argc) } #endif +#include "icodegenerator.h" +void testICG(World &world) +{ + // + // testing ICG + // + SourcePosition pos = { 0, 0, 0 }; + ICodeGenerator icg; + + // var i,j; i = j + 2; + // i is bound to var #0, j to var #1 + + icg.beginStatement(pos); + Register r1 = icg.loadVariable(1); + Register r2 = icg.loadImmediate(2.0); + icg.saveVariable(0, icg.op(ADD, r1, r2)); + + // j = a.b + icg.beginStatement(pos); + Register r4 = icg.loadName(world.identifiers[widenCString("a")]); + Register r5 = icg.getProperty(world.identifiers[widenCString("b")], r4); + icg.saveVariable(1, r5); + + // while (i) i = i + j; + icg.beginWhileStatement(pos); + r1 = icg.loadVariable(0); + icg.endWhileExpression(r1); + icg.saveVariable(0, icg.op(ADD, icg.loadVariable(0), icg.loadVariable(1))); + icg.endWhileStatement(); + + // if (i) if (j) i = 3; else j = 4; + r1 = icg.loadVariable(0); + icg.beginIfStatement(pos, r1); + r2 = icg.loadVariable(1); + icg.beginIfStatement(pos, r2); + icg.saveVariable(0, icg.loadImmediate(3)); + icg.beginElseStatement(true); + icg.saveVariable(1, icg.loadImmediate(4)); + icg.endIfStatement(); + icg.beginElseStatement(false); + icg.endIfStatement(); + + std::cout << icg; +} + int main(int argc, char **argv) { #if defined(XP_MAC) && !defined(XP_MAC_MPW) initConsole("\pJavaScript Shell", "Welcome to the js2 shell.\n", argc, argv); #endif World world; +#if 0 + testICG(world); +#else readEvalPrint(std::cin, world); - return 0; +#endif + return 0; + //return ProcessArgs(argv + 1, argc - 1); }