From 3c72ded1b602080fd90e8498450627107176eb08 Mon Sep 17 00:00:00 2001 From: "rogerl%netscape.com" Date: Tue, 9 May 2000 19:01:00 +0000 Subject: [PATCH] playing with gencode git-svn-id: svn://10.0.0.236/trunk@68859 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/js/js2/js2.cpp | 91 ++++++++++++++++++----------- mozilla/js2/tests/cpp/js2_shell.cpp | 91 ++++++++++++++++++----------- 2 files changed, 116 insertions(+), 66 deletions(-) diff --git a/mozilla/js/js2/js2.cpp b/mozilla/js/js2/js2.cpp index b400cebe67b..686ec4133fc 100644 --- a/mozilla/js/js2/js2.cpp +++ b/mozilla/js/js2/js2.cpp @@ -83,41 +83,78 @@ static bool promptLine(LineReader &inReader, string &s, JavaScript::World world; JavaScript::Debugger::Shell jsd(world, stdin, JavaScript::stdOut, JavaScript::stdOut); + const bool showTokens = false; static Register genExpr(ICodeGenerator &icg, ExprNode *p) { - Register ret; + Register ret = NotARegister; switch (p->getKind()) { - case ExprNode::identifier : { - Register r1 = icg.allocateVariable((static_cast(p))->name); - ASSERT(r1 == icg.findVariable((static_cast(p))->name)); - - icg.saveName((static_cast(p))->name, icg.loadImmediate(0.0)); - ret = icg.loadName((static_cast(p))->name); + case ExprNode::call : + { + InvokeExprNode *i = static_cast(p); + Register fn = genExpr(icg, i->op); + RegisterList args; + ExprPairList *p = i->pairs; + while (p) { + args.push_back(genExpr(icg, p->value)); + p = p->next; } - break; - case ExprNode::number : - ret = icg.loadImmediate((static_cast(p))->value); - break; - case ExprNode::string : - ret = icg.loadString(world.identifiers[(static_cast(p))->str]); - break; - case ExprNode::add: { - BinaryExprNode *b = static_cast(p); - Register r1 = genExpr(icg, b->op1); - Register r2 = genExpr(icg, b->op2); - ret = icg.op(ADD, r1, r2); - } - break; + ret = icg.call(fn, args); + } + break; + case ExprNode::dot : + { + BinaryExprNode *b = static_cast(p); + Register base = genExpr(icg, b->op1); + ret = icg.getProperty(base, static_cast(b->op2)->name); + } + break; + case ExprNode::identifier : + { +// Register r1 = icg.allocateVariable((static_cast(p))->name); +// ASSERT(r1 == icg.findVariable((static_cast(p))->name)); +// icg.saveName((static_cast(p))->name, icg.loadImmediate(0.0)); + ret = icg.loadName((static_cast(p))->name); + } + break; + case ExprNode::number : + ret = icg.loadImmediate((static_cast(p))->value); + break; + case ExprNode::string : + ret = icg.loadString(world.identifiers[(static_cast(p))->str]); + break; + case ExprNode::add: + { + BinaryExprNode *b = static_cast(p); + Register r1 = genExpr(icg, b->op1); + Register r2 = genExpr(icg, b->op2); + ret = icg.op(ADD, r1, r2); + } + break; } return ret; } +static JSValue print(const JSValues &argv) +{ + size_t n = argv.size(); + if (n > 0) { + stdOut << argv[0]; + for (size_t i = 1; i < n; ++i) + stdOut << ' ' << argv[i]; + } + stdOut << "\n"; + return kUndefinedValue; +} + + static void genCode(ExprNode *p) { JSScope glob; Context cx(world, &glob); + StringAtom& printName = world.identifiers[widenCString("print")]; + glob.defineNativeFunction(printName, print); ICodeGenerator icg; @@ -384,18 +421,6 @@ static float64 testFunctionCall(World &world, float64 n) return result.f64; } -static JSValue print(const JSValues &argv) -{ - size_t n = argv.size(); - if (n > 0) { - stdOut << argv[0]; - for (size_t i = 1; i < n; ++i) - stdOut << ' ' << argv[i]; - } - stdOut << "\n"; - return kUndefinedValue; -} - static void testPrint(World &world) { JSScope glob; diff --git a/mozilla/js2/tests/cpp/js2_shell.cpp b/mozilla/js2/tests/cpp/js2_shell.cpp index b400cebe67b..686ec4133fc 100644 --- a/mozilla/js2/tests/cpp/js2_shell.cpp +++ b/mozilla/js2/tests/cpp/js2_shell.cpp @@ -83,41 +83,78 @@ static bool promptLine(LineReader &inReader, string &s, JavaScript::World world; JavaScript::Debugger::Shell jsd(world, stdin, JavaScript::stdOut, JavaScript::stdOut); + const bool showTokens = false; static Register genExpr(ICodeGenerator &icg, ExprNode *p) { - Register ret; + Register ret = NotARegister; switch (p->getKind()) { - case ExprNode::identifier : { - Register r1 = icg.allocateVariable((static_cast(p))->name); - ASSERT(r1 == icg.findVariable((static_cast(p))->name)); - - icg.saveName((static_cast(p))->name, icg.loadImmediate(0.0)); - ret = icg.loadName((static_cast(p))->name); + case ExprNode::call : + { + InvokeExprNode *i = static_cast(p); + Register fn = genExpr(icg, i->op); + RegisterList args; + ExprPairList *p = i->pairs; + while (p) { + args.push_back(genExpr(icg, p->value)); + p = p->next; } - break; - case ExprNode::number : - ret = icg.loadImmediate((static_cast(p))->value); - break; - case ExprNode::string : - ret = icg.loadString(world.identifiers[(static_cast(p))->str]); - break; - case ExprNode::add: { - BinaryExprNode *b = static_cast(p); - Register r1 = genExpr(icg, b->op1); - Register r2 = genExpr(icg, b->op2); - ret = icg.op(ADD, r1, r2); - } - break; + ret = icg.call(fn, args); + } + break; + case ExprNode::dot : + { + BinaryExprNode *b = static_cast(p); + Register base = genExpr(icg, b->op1); + ret = icg.getProperty(base, static_cast(b->op2)->name); + } + break; + case ExprNode::identifier : + { +// Register r1 = icg.allocateVariable((static_cast(p))->name); +// ASSERT(r1 == icg.findVariable((static_cast(p))->name)); +// icg.saveName((static_cast(p))->name, icg.loadImmediate(0.0)); + ret = icg.loadName((static_cast(p))->name); + } + break; + case ExprNode::number : + ret = icg.loadImmediate((static_cast(p))->value); + break; + case ExprNode::string : + ret = icg.loadString(world.identifiers[(static_cast(p))->str]); + break; + case ExprNode::add: + { + BinaryExprNode *b = static_cast(p); + Register r1 = genExpr(icg, b->op1); + Register r2 = genExpr(icg, b->op2); + ret = icg.op(ADD, r1, r2); + } + break; } return ret; } +static JSValue print(const JSValues &argv) +{ + size_t n = argv.size(); + if (n > 0) { + stdOut << argv[0]; + for (size_t i = 1; i < n; ++i) + stdOut << ' ' << argv[i]; + } + stdOut << "\n"; + return kUndefinedValue; +} + + static void genCode(ExprNode *p) { JSScope glob; Context cx(world, &glob); + StringAtom& printName = world.identifiers[widenCString("print")]; + glob.defineNativeFunction(printName, print); ICodeGenerator icg; @@ -384,18 +421,6 @@ static float64 testFunctionCall(World &world, float64 n) return result.f64; } -static JSValue print(const JSValues &argv) -{ - size_t n = argv.size(); - if (n > 0) { - stdOut << argv[0]; - for (size_t i = 1; i < n; ++i) - stdOut << ' ' << argv[i]; - } - stdOut << "\n"; - return kUndefinedValue; -} - static void testPrint(World &world) { JSScope glob;