X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/e06e5ee1f12b9b79b34570e65c1f5e9c12b9b8c3..5963ec5bc27cc5ce1ff3e6a60d0776de87c4f250:/Parser.hpp
diff --git a/Parser.hpp b/Parser.hpp
index 7197428..9dbb9b9 100644
--- a/Parser.hpp
+++ b/Parser.hpp
@@ -1,20 +1,20 @@
/* Cycript - Optimizing JavaScript Compiler/Runtime
- * Copyright (C) 2009-2012 Jay Freeman (saurik)
+ * Copyright (C) 2009-2013 Jay Freeman (saurik)
*/
-/* GNU Lesser General Public License, Version 3 {{{ */
+/* GNU General Public License, Version 3 {{{ */
/*
- * 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.
+ * Cycript is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation, either version 3 of the License,
+ * or (at your option) any later version.
*
- * 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.
+ * 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 General Public License for more details.
*
- * You should have received a copy of the GNU Lesser General Public License
+ * You should have received a copy of the GNU General Public License
* along with Cycript. If not, see .
**/
/* }}} */
@@ -39,7 +39,7 @@
#include "Pooling.hpp"
#include "Options.hpp"
-class CYContext;
+struct CYContext;
struct CYThing {
virtual ~CYThing() {
@@ -350,11 +350,14 @@ struct CYProgram :
};
struct CYNonLocal;
+struct CYThisScope;
struct CYContext {
CYOptions &options_;
CYScope *scope_;
+ CYThisScope *this_;
+
CYIdentifierUsageVector rename_;
CYNonLocal *nonlocal_;
@@ -364,6 +367,7 @@ struct CYContext {
CYContext(CYOptions &options) :
options_(options),
scope_(NULL),
+ this_(NULL),
nonlocal_(NULL),
nextlocal_(NULL),
unique_(0)
@@ -414,6 +418,25 @@ struct CYNonLocal {
}
};
+struct CYThisScope :
+ CYNext
+{
+ CYIdentifier *identifier_;
+
+ CYThisScope() :
+ identifier_(NULL)
+ {
+ }
+
+ CYIdentifier *Identifier(CYContext &context) {
+ if (next_ != NULL)
+ return next_->Identifier(context);
+ if (identifier_ == NULL)
+ identifier_ = context.Unique();
+ return identifier_;
+ }
+};
+
struct CYBlock :
CYStatement,
CYThing
@@ -430,7 +453,7 @@ struct CYBlock :
}
void AddPrev(CYStatement *statement) {
- CYSetLast(statement, statements_);
+ CYSetLast(statement) = statements_;
statements_ = statement;
}
@@ -446,19 +469,44 @@ enum CYState {
CYNewLine
};
+class CYStream :
+ public std::istream
+{
+ private:
+ class CYBuffer :
+ public std::streambuf
+ {
+ public:
+ CYBuffer(const char *start, const char *end) {
+ setg(const_cast(start), const_cast(start), const_cast(end));
+ }
+ } buffer_;
+
+ public:
+ CYStream(const char *start, const char *end) :
+ std::istream(&buffer_),
+ buffer_(start, end)
+ {
+ }
+};
+
class CYDriver {
public:
void *scanner_;
CYState state_;
- bool nobrace_;
std::stack in_;
- const char *data_;
- size_t size_;
- FILE *file_;
+ struct {
+ bool AtImplementation;
+ bool Function;
+ bool OpenBrace;
+ } no_;
+
+ std::istream &data_;
bool strict_;
+ bool commented_;
enum Condition {
RegExpCondition,
@@ -511,7 +559,7 @@ class CYDriver {
void ScannerDestroy();
public:
- CYDriver(const std::string &filename = "");
+ CYDriver(std::istream &data, const std::string &filename = "");
~CYDriver();
Condition GetCondition();
@@ -619,7 +667,7 @@ struct CYCompound :
}
void AddPrev(CYExpression *expression) {
- CYSetLast(expression, expressions_);
+ CYSetLast(expression) = expressions_;
expressions_ = expression;
}
@@ -653,6 +701,11 @@ struct CYComprehension :
CYNext,
CYThing
{
+ CYComprehension(CYComprehension *next = NULL) :
+ CYNext(next)
+ {
+ }
+
virtual const char *Name() const = 0;
virtual CYFunctionParameter *Parameter(CYContext &context) const = 0;
@@ -667,7 +720,8 @@ struct CYForInComprehension :
CYIdentifier *name_;
CYExpression *set_;
- CYForInComprehension(CYIdentifier *name, CYExpression *set) :
+ CYForInComprehension(CYIdentifier *name, CYExpression *set, CYComprehension *next = NULL) :
+ CYComprehension(next),
name_(name),
set_(set)
{
@@ -688,7 +742,8 @@ struct CYForOfComprehension :
CYIdentifier *name_;
CYExpression *set_;
- CYForOfComprehension(CYIdentifier *name, CYExpression *set) :
+ CYForOfComprehension(CYIdentifier *name, CYExpression *set, CYComprehension *next = NULL) :
+ CYComprehension(next),
name_(name),
set_(set)
{
@@ -1475,7 +1530,9 @@ struct CYFunction {
CYIdentifier *name_;
CYFunctionParameter *parameters_;
CYBlock code_;
+
CYNonLocal *nonlocal_;
+ CYThisScope this_;
CYFunction(CYIdentifier *name, CYFunctionParameter *parameters, CYStatement *statements) :
name_(name),
@@ -1510,6 +1567,23 @@ struct CYFunctionExpression :
virtual void Output(CYOutput &out, CYFlags flags) const;
};
+// XXX: this should derive from CYAnonymousFunction
+struct CYFatArrow :
+ CYFunction,
+ CYExpression
+{
+ CYFatArrow(CYFunctionParameter *parameters, CYStatement *statements) :
+ CYFunction(NULL, parameters, statements)
+ {
+ }
+
+ CYPrecedence(0)
+ CYRightHand(false)
+
+ virtual CYExpression *Replace(CYContext &context);
+ virtual void Output(CYOutput &out, CYFlags flags) const;
+};
+
// XXX: this should derive from CYAnonymousFunctionExpression
struct CYRubyProc :
CYFunctionExpression