]> git.saurik.com Git - cycript.git/commitdiff
Try to use std::streambuf instead of std::istream.
authorJay Freeman (saurik) <saurik@saurik.com>
Sat, 19 Dec 2015 09:43:37 +0000 (01:43 -0800)
committerJay Freeman (saurik) <saurik@saurik.com>
Sat, 19 Dec 2015 09:43:37 +0000 (01:43 -0800)
Code.hpp
Complete.cpp
Console.cpp
Driver.cpp
Driver.hpp
Execute.cpp
Library.cpp
Scanner.lpp.in

index f6b331265e9cb78996723c58c7b781f174c98cb2..abb18056198a1f413feb4472045a5791db115ac3 100644 (file)
--- a/Code.hpp
+++ b/Code.hpp
 #include "String.hpp"
 
 class CYStream :
-    public std::istream
+    public std::streambuf
 {
-  private:
-    class CYBuffer :
-        public std::streambuf
-    {
-      public:
-        CYBuffer(const char *start, const char *end) {
-            setg(const_cast<char *>(start), const_cast<char *>(start), const_cast<char *>(end));
-        }
-    } buffer_;
-
   public:
-    CYStream(const char *start, const char *end) :
-        std::istream(&buffer_),
-        buffer_(start, end)
-    {
+    CYStream(const char *start, const char *end) {
+        setg(const_cast<char *>(start), const_cast<char *>(start), const_cast<char *>(end));
     }
 };
 
-CYUTF8String CYPoolCode(CYPool &pool, std::istream &stream);
+CYUTF8String CYPoolCode(CYPool &pool, std::streambuf &stream);
 
 #endif//CODE_HPP
index 6ce6671c7d0cdde879990da4faeebd4f70197cf8..d822d995adefe9f282ac92c064d735862c7c3c76 100644 (file)
@@ -28,7 +28,7 @@
 static CYExpression *ParseExpression(CYPool &pool, CYUTF8String code) {
     std::stringstream stream;
     stream << '(' << code << ')';
-    CYDriver driver(pool, stream);
+    CYDriver driver(pool, *stream.rdbuf());
     if (driver.Parse() || !driver.errors_.empty())
         return NULL;
 
@@ -51,7 +51,7 @@ static CYExpression *ParseExpression(CYPool &pool, CYUTF8String code) {
 _visible char **CYComplete(const char *word, const std::string &line, CYUTF8String (*run)(CYPool &pool, const std::string &)) {
     CYLocalPool pool;
 
-    std::istringstream stream(line);
+    std::stringbuf stream(line);
     CYDriver driver(pool, stream);
 
     driver.auto_ = true;
index 76ad5532b259f33e27e8e16a19d6a7c272856fb6..e01dd07beea56bdcb22c8024f45edf37521493f5 100644 (file)
@@ -420,7 +420,7 @@ static int CYConsoleKeyReturn(int count, int key) {
     else {
         std::string command(rl_line_buffer, rl_end);
         command += '\n';
-        std::istringstream stream(command);
+        std::stringbuf stream(command);
 
         size_t last(std::string::npos);
         for (size_t i(0); i != std::string::npos; i = command.find('\n', i + 1))
@@ -680,7 +680,7 @@ static void Console(CYOptions &options) {
         if (bypass)
             code = command;
         else try {
-            std::istringstream stream(command);
+            std::stringbuf stream(command);
 
             CYPool pool;
             CYDriver driver(pool, stream);
@@ -1066,7 +1066,7 @@ int Main(int argc, char * const argv[], char const * const envp[]) {
                 stream = new std::istringstream(buffer.str());
 
                 CYPool pool;
-                CYDriver driver(pool, *stream, script);
+                CYDriver driver(pool, *stream->rdbuf(), script);
                 Setup(driver);
 
                 uint64_t begin(CYGetTime());
@@ -1092,7 +1092,7 @@ int Main(int argc, char * const argv[], char const * const envp[]) {
         }
 
         CYPool pool;
-        CYDriver driver(pool, *stream, script);
+        CYDriver driver(pool, *stream->rdbuf(), script);
         Setup(driver);
 
         bool failed(driver.Parse());
index 788afee05c58a8546c93c16fcd4cdc73b2e2f35e..031625c5dac72512cb738b939697f8c3cd5611cc 100644 (file)
@@ -24,7 +24,7 @@
 
 bool CYParser(CYPool &pool, bool debug);
 
-CYDriver::CYDriver(CYPool &pool, std::istream &data, const std::string &filename) :
+CYDriver::CYDriver(CYPool &pool, std::streambuf &data, const std::string &filename) :
     pool_(pool),
     newline_(false),
     last_(false),
index bbce9fd4ac1bee3572d3c312fa60528f00c14b93..dce9213cea6fbbb12b45ebf14ec1e7098c7ff6bc 100644 (file)
@@ -64,7 +64,7 @@ class _visible CYDriver {
     bool newline_;
     bool last_;
 
-    std::istream &data_;
+    std::streambuf &data_;
 
     int debug_;
     bool strict_;
@@ -120,7 +120,7 @@ class _visible CYDriver {
     void ScannerDestroy();
 
   public:
-    CYDriver(CYPool &pool, std::istream &data, const std::string &filename = "");
+    CYDriver(CYPool &pool, std::streambuf &data, const std::string &filename = "");
     ~CYDriver();
 
     bool Parse(CYMark mark = CYMarkScript);
index b45007667854b9f0680e846984aeb6a5f3004c0f..9862755819203b065762a243fd7c7132a4615b40 100644 (file)
@@ -369,7 +369,7 @@ _visible void CYGarbageCollect(JSContextRef context) {
 static JSValueRef Cycript_compile_callAsFunction(JSContextRef context, JSObjectRef object, JSObjectRef _this, size_t count, const JSValueRef arguments[], JSValueRef *exception) { CYTry {
     CYPool pool;
     CYUTF8String before(CYPoolUTF8String(pool, context, CYJSString(context, arguments[0])));
-    std::stringstream value(std::string(before.data, before.size));
+    std::stringbuf value(std::string(before.data, before.size));
     CYUTF8String after(CYPoolCode(pool, value));
     return CYCastJSValue(context, CYJSString(after));
 } CYCatch_(NULL, "SyntaxError") }
@@ -1871,7 +1871,7 @@ static JSValueRef require(JSContextRef context, JSObjectRef object, JSObjectRef
 
         std::stringstream wrap;
         wrap << "(function (exports, require, module) { " << code << "\n});";
-        code = CYPoolCode(pool, wrap);
+        code = CYPoolCode(pool, *wrap.rdbuf());
 
         JSValueRef value(_jsccall(JSEvaluateScript, context, CYJSString(code), NULL, NULL, 0));
         JSObjectRef function(CYCastJSObject(context, value));
index 720322564e1fb181f6ac78407f6116164ffb8c8e..aa85e81cc595da8fa04ebebb1c8b90ce10b760a4 100644 (file)
@@ -224,7 +224,7 @@ _visible bool CYStartsWith(const CYUTF8String &haystack, const CYUTF8String &nee
     return haystack.size >= needle.size && strncmp(haystack.data, needle.data, needle.size) == 0;
 }
 
-CYUTF8String CYPoolCode(CYPool &pool, std::istream &stream) {
+CYUTF8String CYPoolCode(CYPool &pool, std::streambuf &stream) {
     CYLocalPool local;
     CYDriver driver(local, stream);
     _assert(!driver.Parse());
index 6d79127ed9aba86290632c19604c3d0085b740be..235dc8052285d9ba7e844fff0459f19178b5d38e 100644 (file)
@@ -184,15 +184,9 @@ static unsigned U(char *&local, const char *text, yy_size_t &i) {
     I(type, Type(P.strmemdup(yyextra->buffer_.data(), yyextra->buffer_.size()), yyextra->buffer_.size()), value, highlight); \
 } while (false)
 
-#define YY_INPUT(data, value, size) { \
-    if (yyextra->data_.eof()) \
-        value = YY_NULL; \
-    else { \
-        yyextra->data_.read(data, size); \
-        size_t copy(yyextra->data_.gcount()); \
-        value = copy == 0 ? YY_NULL : copy; \
-    } \
-}
+#define YY_INPUT(data, value, size) do { \
+    value = yyextra->data_.sgetn(data, size) ?: YY_NULL; \
+} while (false)
 
 %}