]> git.saurik.com Git - cycript.git/commitdiff
Maybe thread local storage is a performance issue.
authorJay Freeman (saurik) <saurik@saurik.com>
Thu, 26 Nov 2015 10:17:14 +0000 (02:17 -0800)
committerJay Freeman (saurik) <saurik@saurik.com>
Thu, 26 Nov 2015 10:17:14 +0000 (02:17 -0800)
Complete.cpp
Console.cpp
Cycript.l.in
Cycript.yy.in
Driver.cpp
Driver.hpp
Highlight.cpp
Library.cpp

index b378b60a406193d4e9ceb1ffc7e3b1259a2e3794..75b80c0c542d007f1435078364c8c1c72ffbb921 100644 (file)
 #include "Replace.hpp"
 #include "String.hpp"
 
-static CYExpression *ParseExpression(CYUTF8String code) {
+static CYExpression *ParseExpression(CYPool &pool, CYUTF8String code) {
     std::stringstream stream;
     stream << '(' << code << ')';
-    CYDriver driver(stream);
+    CYDriver driver(pool, stream);
 
     cy::parser parser(driver);
     if (parser.parse() != 0 || !driver.errors_.empty())
@@ -55,7 +55,7 @@ _visible char **CYComplete(const char *word, const std::string &line, CYUTF8Stri
     CYLocalPool pool;
 
     std::istringstream stream(line);
-    CYDriver driver(stream);
+    CYDriver driver(pool, stream);
 
     driver.auto_ = true;
 
@@ -99,7 +99,7 @@ _visible char **CYComplete(const char *word, const std::string &line, CYUTF8Stri
 
     std::string begin(prefix.str());
 
-    driver.program_ = $ CYProgram($ CYExpress($C3(ParseExpression(
+    driver.program_ = $ CYProgram($ CYExpress($C3(ParseExpression(pool,
     "   function(object, prefix, word) {\n"
     "       var names = [];\n"
     "       var before = prefix.length;\n"
@@ -122,7 +122,7 @@ _visible char **CYComplete(const char *word, const std::string &line, CYUTF8Stri
     CYUTF8String json(run(pool, code));
     // XXX: if this fails we should not try to parse it
 
-    CYExpression *result(ParseExpression(json));
+    CYExpression *result(ParseExpression(pool, json));
     if (result == NULL)
         return NULL;
 
index f57ecea83e19c0ddf577d37f50e2d290ba3599e9..f6ba47bfc16bdf1b62ce99518b71a5b465129676 100644 (file)
@@ -104,10 +104,10 @@ void Setup(CYDriver &driver) {
         driver.strict_ = true;
 }
 
-void Setup(CYPool &pool, CYOutput &out, CYDriver &driver, CYOptions &options, bool lower) {
+void Setup(CYOutput &out, CYDriver &driver, CYOptions &options, bool lower) {
     out.pretty_ = pretty_;
     if (lower)
-        driver.Replace(pool, options);
+        driver.Replace(options);
 }
 
 static CYUTF8String Run(CYPool &pool, int client, CYUTF8String code) {
@@ -379,11 +379,12 @@ static void Console(CYOptions &options) {
             code = command_;
         else {
             std::istringstream stream(command_);
-            CYDriver driver(stream);
-            Setup(driver);
 
             CYPool pool;
-            bool failed(driver.Parse(pool));
+            CYDriver driver(pool, stream);
+            Setup(driver);
+
+            bool failed(driver.Parse());
 
             if (failed || !driver.errors_.empty()) {
                 for (CYDriver::Errors::const_iterator error(driver.errors_.begin()); error != driver.errors_.end(); ++error) {
@@ -424,7 +425,7 @@ static void Console(CYOptions &options) {
 
             std::stringbuf str;
             CYOutput out(str, options);
-            Setup(pool, out, driver, options, lower);
+            Setup(out, driver, options, lower);
             out << *driver.program_;
             code = str.str();
         }
@@ -743,11 +744,11 @@ int Main(int argc, char * const argv[], char const * const envp[]) {
             _assert(!stream->fail());
         }
 
-        CYDriver driver(*stream, script);
+        CYPool pool;
+        CYDriver driver(pool, *stream, script);
         Setup(driver);
 
-        CYPool pool;
-        bool failed(driver.Parse(pool));
+        bool failed(driver.Parse());
 
         if (failed || !driver.errors_.empty()) {
             for (CYDriver::Errors::const_iterator i(driver.errors_.begin()); i != driver.errors_.end(); ++i)
@@ -755,7 +756,7 @@ int Main(int argc, char * const argv[], char const * const envp[]) {
         } else if (driver.program_ != NULL) {
             std::stringbuf str;
             CYOutput out(str, options);
-            Setup(pool, out, driver, options, true);
+            Setup(out, driver, options, true);
             out << *driver.program_;
             std::string code(str.str());
             if (compile)
index 8c183a42387318cb863ec7e2a56611ae6396884b..064d43a7b4d72d30a875400bdb783ae658460647 100644 (file)
@@ -49,8 +49,9 @@ typedef cy::parser::token tk;
     return token; \
 } while (false)
 
-#define A new($pool)
-#define Y $pool.strmemdup(yytext, yyleng)
+#define P yyextra->pool_
+#define A new(P)
+#define Y P.strmemdup(yytext, yyleng)
 
 #define I(type, Type, value, highlight) do { \
     yylval->type ## _ = A CY ## Type; \
index d797aedf24b4a12efe559c3fd286f2baf8f6fd29..29e943882110fb68e6cd51d1794581bc8f6fb9ca 100644 (file)
@@ -28,7 +28,7 @@
 #include "Driver.hpp"
 #include "Parser.hpp"
 #include "Stack.hpp"
-#define CYNew new($pool)
+#define CYNew new(driver.pool_)
 
 @begin ObjectiveC
 #include "ObjectiveC/Syntax.hpp"
index e529cbc07a86be8f426dc7f7bdac5958d2b848bb..5f3ffa1e2f802730cce806dc1586442741a4f133 100644 (file)
@@ -22,7 +22,8 @@
 #include "Cycript.tab.hh"
 #include "Driver.hpp"
 
-CYDriver::CYDriver(std::istream &data, const std::string &filename) :
+CYDriver::CYDriver(CYPool &pool, std::istream &data, const std::string &filename) :
+    pool_(pool),
     state_(CYClear),
     data_(data),
     debug_(0),
@@ -43,8 +44,8 @@ CYDriver::~CYDriver() {
     ScannerDestroy();
 }
 
-bool CYDriver::Parse(CYPool &pool) {
-    CYLocal<CYPool> local(&pool);
+bool CYDriver::Parse() {
+    CYLocal<CYPool> local(&pool_);
     cy::parser parser(*this);
 #ifdef YYDEBUG
     parser.set_debug_level(debug_);
@@ -52,8 +53,8 @@ bool CYDriver::Parse(CYPool &pool) {
     return parser.parse() != 0;
 }
 
-void CYDriver::Replace(CYPool &pool, CYOptions &options) {
-    CYLocal<CYPool> local(&pool);
+void CYDriver::Replace(CYOptions &options) {
+    CYLocal<CYPool> local(&pool_);
     CYContext context(options);
     program_->Replace(context);
 }
index cd39cfb922370369bebb0fcf7b29f21c78312a85..88956fb12bdcdfbb0c3a2214f9e9deab609b7b1d 100644 (file)
@@ -39,6 +39,7 @@ enum CYState {
 
 class _visible CYDriver {
   public:
+    CYPool &pool_;
     void *scanner_;
 
     CYState state_;
@@ -107,11 +108,11 @@ class _visible CYDriver {
     void ScannerDestroy();
 
   public:
-    CYDriver(std::istream &data, const std::string &filename = "");
+    CYDriver(CYPool &pool, std::istream &data, const std::string &filename = "");
     ~CYDriver();
 
-    bool Parse(CYPool &pool);
-    void Replace(CYPool &pool, CYOptions &options);
+    bool Parse();
+    void Replace(CYOptions &options);
 
     Condition GetCondition();
     void SetCondition(Condition condition);
index 73814ec597759c14ad8e0fa7abbd6411a40c128b..3e8aa7bff1ed90b4091c487d3956193be9bbef79 100644 (file)
@@ -56,15 +56,15 @@ struct CYColor {
 };
 
 _visible void CYLexerHighlight(const char *data, size_t size, std::ostream &output, bool ignore) {
+    CYLocalPool pool;
+
     CYStream stream(data, data + size);
-    CYDriver driver(stream);
+    CYDriver driver(pool, stream);
     driver.commented_ = true;
 
     size_t offset(0);
     CYPosition current;
 
-    CYLocalPool pool;
-
     YYSTYPE value;
     CYLocation location;
 
index b04f2caecff5e6eb99ad37f27a67f630e395714b..258ef61d004eb09e5de99307060f00793222a5be 100644 (file)
@@ -219,7 +219,7 @@ double CYCastDouble(const char *value) {
 
 CYUTF8String CYPoolCode(CYPool &pool, std::istream &stream) {
     CYLocalPool local;
-    CYDriver driver(stream);
+    CYDriver driver(local, stream);
 
     cy::parser parser(driver);
     _assert(parser.parse() == 0);