]> git.saurik.com Git - cycript.git/blobdiff - Parser.hpp
Stupid mistake while outputting statement blocks: last statement was getting center...
[cycript.git] / Parser.hpp
index 49e072263f13824e6a576f6d8601b45bc204061c..48ba4f0d8cbf8ed22eec74a1ed37d72361f0856c 100644 (file)
@@ -1,40 +1,22 @@
-/* Cycript - Inlining/Optimizing JavaScript Compiler
- * Copyright (C) 2009  Jay Freeman (saurik)
+/* Cycript - Optimizing JavaScript Compiler/Runtime
+ * Copyright (C) 2009-2010  Jay Freeman (saurik)
 */
 
-/* Modified BSD License {{{ */
+/* GNU Lesser General Public License, Version 3 {{{ */
 /*
- *        Redistribution and use in source and binary
- * forms, with or without modification, are permitted
- * provided that the following conditions are met:
+ * Cycript is free software: you can redistribute it and/or modify it under
+ * the terms of the GNU Lesser General Public License as published by the
+ * Free Software Foundation, either version 3 of the License, or (at your
+ * option) any later version.
  *
- * 1. Redistributions of source code must retain the
- *    above copyright notice, this list of conditions
- *    and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the
- *    above copyright notice, this list of conditions
- *    and the following disclaimer in the documentation
- *    and/or other materials provided with the
- *    distribution.
- * 3. The name of the author may not be used to endorse
- *    or promote products derived from this software
- *    without specific prior written permission.
+ * Cycript is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU Lesser General Public
+ * License for more details.
  *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS''
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE
- * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
- * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
- * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
- * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
- * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
- * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
- * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
- * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-*/
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with Cycript.  If not, see <http://www.gnu.org/licenses/>.
+**/
 /* }}} */
 
 #ifndef CYPARSER_HPP
@@ -310,6 +292,7 @@ enum CYIdentifierFlags {
     CYIdentifierVariable,
     CYIdentifierOther,
     CYIdentifierMagic,
+    CYIdentifierCatch,
 };
 
 typedef std::set<const char *, CYCStringLess> CYCStringSet;
@@ -323,19 +306,27 @@ struct CYIdentifierUsage {
 
 typedef std::vector<CYIdentifierUsage> CYIdentifierUsageVector;
 
+// XXX: strategy pattern, maybe subclass
+enum CYScopeType {
+    CYScopeCatch,
+    CYScopeFunction,
+    CYScopeProgram,
+};
+
 struct CYScope {
+    CYScopeType type_;
+
+    CYContext &context_;
+    CYStatement *&statements_;
+
     CYScope *parent_;
 
     CYIdentifierAddressFlagsMap internal_;
     CYIdentifierValueSet identifiers_;
 
-    CYScope() :
-        parent_(NULL)
-    {
-    }
+    CYScope(CYScopeType type, CYContext &context, CYStatement *&statements);
 
-    virtual ~CYScope() {
-    }
+    void Close();
 
     void Declare(CYContext &context, CYIdentifier *identifier, CYIdentifierFlags flags);
     virtual CYIdentifier *Lookup(CYContext &context, CYIdentifier *identifier);
@@ -357,16 +348,24 @@ struct CYProgram :
     virtual void Output(CYOutput &out) const;
 };
 
+struct CYNonLocal;
+
 struct CYContext {
-    apr_pool_t *pool_;
     CYOptions &options_;
+
     CYScope *scope_;
     CYIdentifierUsageVector rename_;
 
-    CYContext(apr_pool_t *pool, CYOptions &options) :
-        pool_(pool),
+    CYNonLocal *nonlocal_;
+    CYNonLocal *nextlocal_;
+    unsigned unique_;
+
+    CYContext(CYOptions &options) :
         options_(options),
-        scope_(NULL)
+        scope_(NULL),
+        nonlocal_(NULL),
+        nextlocal_(NULL),
+        unique_(0)
     {
     }
 
@@ -384,6 +383,24 @@ struct CYContext {
             else break;
         }
     }
+
+    void NonLocal(CYStatement *&statements);
+    CYIdentifier *Unique();
+};
+
+struct CYNonLocal {
+    CYIdentifier *identifier_;
+
+    CYNonLocal() :
+        identifier_(NULL)
+    {
+    }
+
+    CYIdentifier *Target(CYContext &context) {
+        if (identifier_ == NULL)
+            identifier_ = context.Unique();
+        return identifier_;
+    }
 };
 
 struct CYBlock :
@@ -423,8 +440,6 @@ enum CYState {
 
 class CYDriver {
   public:
-    CYPool pool_;
-
     CYState state_;
     void *scanner_;
 
@@ -485,7 +500,7 @@ class CYDriver {
     void ScannerDestroy();
 
   public:
-    CYDriver(apr_pool_t *pool = NULL, const std::string &filename = "");
+    CYDriver(const std::string &filename = "");
     ~CYDriver();
 
     Condition GetCondition();
@@ -935,6 +950,11 @@ struct CYVariable :
     {
     }
 
+    CYVariable(const char *name) :
+        name_(new($pool) CYIdentifier(name))
+    {
+    }
+
     CYPrecedence(0)
     CYRightHand(false)
 
@@ -1261,7 +1281,7 @@ struct CYObject :
 {
     CYProperty *properties_;
 
-    CYObject(CYProperty *properties) :
+    CYObject(CYProperty *properties = NULL) :
         properties_(properties)
     {
     }
@@ -1319,13 +1339,16 @@ struct CYIndirectMember :
     virtual void Output(CYOutput &out, CYFlags flags) const;
 };
 
-struct CYNew :
+namespace cy {
+namespace Syntax {
+
+struct New :
     CYExpression
 {
     CYExpression *constructor_;
     CYArgument *arguments_;
 
-    CYNew(CYExpression *constructor, CYArgument *arguments) :
+    New(CYExpression *constructor, CYArgument *arguments) :
         constructor_(constructor),
         arguments_(arguments)
     {
@@ -1343,6 +1366,8 @@ struct CYNew :
     virtual CYExpression *AddArgument(CYContext &context, CYExpression *value);
 };
 
+} }
+
 struct CYCall :
     CYExpression
 {
@@ -1440,11 +1465,13 @@ struct CYFunction {
     CYIdentifier *name_;
     CYFunctionParameter *parameters_;
     CYBlock code_;
+    CYNonLocal *nonlocal_;
 
     CYFunction(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *statements) :
         name_(name),
         parameters_(parameters),
-        code_(statements)
+        code_(statements),
+        nonlocal_(NULL)
     {
     }
 
@@ -1623,7 +1650,7 @@ struct Throw :
 {
     CYExpression *value_;
 
-    Throw(CYExpression *value) :
+    Throw(CYExpression *value = NULL) :
         value_(value)
     {
     }