From 56886d9ebf1d43e3ec49bc57b462ab51476b1060 Mon Sep 17 00:00:00 2001 From: gavin1012_hw Date: Wed, 10 Aug 2022 16:33:40 +0800 Subject: [PATCH] Support fast-preview for base64 input expression Issue: I5LKH7 Signed-off-by: gavin1012_hw Change-Id: I0139bb64d8d299175c3d741437076d3e9badc8c9 --- es2panda/aot/main.cpp | 8 +++--- es2panda/aot/options.cpp | 58 +++++++++++++++++++++++++--------------- es2panda/aot/options.h | 8 +----- ts2panda/src/index.ts | 7 +++-- 4 files changed, 46 insertions(+), 35 deletions(-) diff --git a/es2panda/aot/main.cpp b/es2panda/aot/main.cpp index 3660a2af0b..f96cb711a1 100644 --- a/es2panda/aot/main.cpp +++ b/es2panda/aot/main.cpp @@ -55,8 +55,8 @@ public: } }; -static void DebuggerEvaluateExpression(panda::pandasm::Program *prog, - panda::pandasm::AsmEmitter::PandaFileToPandaAsmMaps *mapsp) +static void GenerateBase64Output(panda::pandasm::Program *prog, + panda::pandasm::AsmEmitter::PandaFileToPandaAsmMaps *mapsp) { auto pandaFile = panda::pandasm::AsmEmitter::Emit(*prog, mapsp); const uint8_t *buffer = pandaFile->GetBase(); @@ -118,8 +118,8 @@ static int GenerateProgram(panda::pandasm::Program *prog, std::unique_ptrisDebuggerEvaluateExpressionMode()) { - DebuggerEvaluateExpression(prog, mapsp); + if (output.empty()) { + GenerateBase64Output(prog, mapsp); return 0; } diff --git a/es2panda/aot/options.cpp b/es2panda/aot/options.cpp index dcbb292ec6..0f430e302e 100644 --- a/es2panda/aot/options.cpp +++ b/es2panda/aot/options.cpp @@ -65,8 +65,10 @@ bool Options::Parse(int argc, const char **argv) panda::PandArg opSizeStat("dump-size-stat", false, "Dump size statistics"); panda::PandArg opDumpLiteralBuffer("dump-literal-buffer", false, "Dump literal buffer"); panda::PandArg outputFile("output", "", "Compiler binary output (.abc)"); - panda::PandArg debuggerEvaluateExpression("debugger-evaluate-expression", "", - "input base64 data of an expression to be evaluated in debugger mode"); + panda::PandArg debuggerEvaluateExpression("debugger-evaluate-expression", false, + "evaluate expression in debugger mode"); + panda::PandArg base64Input("base64Input", "", "base64 input of js content"); + panda::PandArg base64Output("base64Output", false, "output panda file content as base64 to std out"); // tail arguments panda::PandArg inputFile("input", "", "input file"); @@ -80,6 +82,8 @@ bool Options::Parse(int argc, const char **argv) argparser_->Add(&opDebugInfo); argparser_->Add(&opDumpDebugInfo); argparser_->Add(&debuggerEvaluateExpression); + argparser_->Add(&base64Input); + argparser_->Add(&base64Output); argparser_->Add(&opOptLevel); argparser_->Add(&opThreadCount); @@ -93,7 +97,8 @@ bool Options::Parse(int argc, const char **argv) argparser_->EnableTail(); argparser_->EnableRemainder(); - if (!argparser_->Parse(argc, argv) || opHelp.GetValue()) { + if (!argparser_->Parse(argc, argv) || opHelp.GetValue() || (inputFile.GetValue().empty() + && base64Input.GetValue().empty())) { std::stringstream ss; ss << argparser_->GetErrorString() << std::endl; @@ -109,9 +114,16 @@ bool Options::Parse(int argc, const char **argv) } bool inputIsEmpty = inputFile.GetValue().empty(); - bool base64InputIsEmpty = debuggerEvaluateExpression.GetValue().empty(); - if (inputIsEmpty == base64InputIsEmpty) { - errorMsg_ = "--input and --debugger-evaluate-expression can not be used or unused simultaneously"; + bool base64InputIsEmpty = base64Input.GetValue().empty(); + bool outputIsEmpty = outputFile.GetValue().empty(); + + if (!inputIsEmpty && !base64InputIsEmpty) { + errorMsg_ = "--input and --base64Input can not be used simultaneously"; + return false; + } + + if (!outputIsEmpty && base64Output.GetValue()) { + errorMsg_ = "--output and --base64Output can not be used simultaneously"; return false; } @@ -129,22 +141,23 @@ bool Options::Parse(int argc, const char **argv) std::stringstream ss; ss << inputStream.rdbuf(); parserInput_ = ss.str(); - sourceFile_ = BaseName(sourceFile_); - if (!outputFile.GetValue().empty()) { - compilerOutput_ = outputFile.GetValue(); - } else { - compilerOutput_ = RemoveExtension(sourceFile_).append(".abc"); - } + sourceFile_ = BaseName(sourceFile_); } else { - // in watch expression mode: base64 input to be evaluated - parserInput_ = ExtractExpressionFromBase64(debuggerEvaluateExpression.GetValue()); + // input content is base64 string + parserInput_ = ExtractContentFromBase64Input(base64Input.GetValue()); if (parserInput_.empty()) { - errorMsg_ = "The input is not a valid base64 data"; + errorMsg_ = "The input string is not a valid base64 data"; return false; } - options_ |= OptionFlags::DEBUGGER_EVALUATE_EXPRESSION; - compilerOptions_.isDebuggerEvaluateExpressionMode = true; + } + + if (base64Output.GetValue()) { + compilerOutput_ = ""; + } else if (!outputIsEmpty) { + compilerOutput_ = outputFile.GetValue(); + } else if (outputIsEmpty && !inputIsEmpty) { + compilerOutput_ = RemoveExtension(sourceFile_).append(".abc"); } std::string extension = inputExtension.GetValue(); @@ -192,21 +205,22 @@ bool Options::Parse(int argc, const char **argv) compilerOptions_.isDebug = opDebugInfo.GetValue(); compilerOptions_.parseOnly = opParseOnly.GetValue(); compilerOptions_.dumpLiteralBuffer = opDumpLiteralBuffer.GetValue(); + compilerOptions_.isDebuggerEvaluateExpressionMode = debuggerEvaluateExpression.GetValue(); return true; } -std::string Options::ExtractExpressionFromBase64(const std::string &watchedExpressionBase64String) +std::string Options::ExtractContentFromBase64Input(const std::string &inputBase64String) { - std::string watchedExpression = util::Base64Decode(watchedExpressionBase64String); - if (watchedExpression == "") { + std::string inputContent = util::Base64Decode(inputBase64String); + if (inputContent == "") { return ""; } - bool validBase64Input = util::Base64Encode(watchedExpression) == watchedExpressionBase64String; + bool validBase64Input = util::Base64Encode(inputContent) == inputBase64String; if (!validBase64Input) { return ""; } - return watchedExpression; + return inputContent; } } // namespace panda::es2panda::aot diff --git a/es2panda/aot/options.h b/es2panda/aot/options.h index b8e8e82c06..49286015ae 100644 --- a/es2panda/aot/options.h +++ b/es2panda/aot/options.h @@ -36,7 +36,6 @@ enum class OptionFlags { DEFAULT = 0, PARSE_ONLY = 1 << 1, SIZE_STAT = 1 << 2, - DEBUGGER_EVALUATE_EXPRESSION = 1 << 3, }; inline std::underlying_type_t operator&(OptionFlags a, OptionFlags b) @@ -117,12 +116,7 @@ public: return (options_ & OptionFlags::SIZE_STAT) != 0; } - bool isDebuggerEvaluateExpressionMode() const - { - return (options_ & OptionFlags::DEBUGGER_EVALUATE_EXPRESSION) != 0; - } - - std::string ExtractExpressionFromBase64(const std::string &watchedExpression); + std::string ExtractContentFromBase64Input(const std::string &inputBase64String); private: es2panda::ScriptExtension extension_ {es2panda::ScriptExtension::JS}; diff --git a/ts2panda/src/index.ts b/ts2panda/src/index.ts index 972d123a06..944570172b 100644 --- a/ts2panda/src/index.ts +++ b/ts2panda/src/index.ts @@ -173,10 +173,13 @@ const watchFileName = "watch_expressions"; // this path is only available in sdk const es2abcBinaryPath = path["join"](__dirname, "..", "bin", path.sep); const es2abcBinaryName = /^win/.test(require('os').platform()) ? "es2abc.exe" : "es2abc"; -const es2abcCommandLineArgs = "--debugger-evaluate-expression"; +const es2abcBase64Input = "--base64Input"; +const es2abcDebuggerEvaluateFlag = "--debugger-evaluate-expression"; +const es2abcBase64Output = "--base64Output"; function callEs2pandaToolChain(ideIputStr: string) { - let commandLine = es2abcBinaryPath + es2abcBinaryName + " " + es2abcCommandLineArgs + " \"" + ideIputStr + "\""; + let commandLine = es2abcBinaryPath + es2abcBinaryName + " " + es2abcBase64Input + " \"" + ideIputStr + "\" " + + es2abcDebuggerEvaluateFlag + " " + es2abcBase64Output; var exec = require('child_process').exec; exec(`${commandLine}`, function(error, stdout) { if (error) { -- Gitee