/* Cycript - Optimizing JavaScript Compiler/Runtime
- * Copyright (C) 2009-2010 Jay Freeman (saurik)
+ * Copyright (C) 2009-2012 Jay Freeman (saurik)
*/
/* GNU Lesser General Public License, Version 3 {{{ */
#include <iostream>
+#include <stack>
#include <string>
#include <vector>
#include <map>
typedef std::vector<CYIdentifierUsage> CYIdentifierUsageVector;
-// XXX: strategy pattern, maybe subclass
-enum CYScopeType {
- CYScopeCatch,
- CYScopeFunction,
- CYScopeProgram,
-};
-
struct CYScope {
- CYScopeType type_;
+ bool transparent_;
CYContext &context_;
CYStatement *&statements_;
CYIdentifierAddressFlagsMap internal_;
CYIdentifierValueSet identifiers_;
- CYScope(CYScopeType type, CYContext &context, CYStatement *&statements);
+ CYScope(bool transparent, CYContext &context, CYStatement *&statements);
virtual ~CYScope();
void Close();
}
void AddPrev(CYStatement *statement) {
- CYSetLast(statement, statements_);
+ CYSetLast(statement) = statements_;
statements_ = statement;
}
class CYDriver {
public:
- CYState state_;
void *scanner_;
+ CYState state_;
+ bool nobrace_;
+ std::stack<bool> in_;
+
const char *data_;
size_t size_;
FILE *file_;
virtual ~CYForInitialiser() {
}
- virtual void For(CYOutput &out) const = 0;
virtual CYExpression *Replace(CYContext &context) = 0;
+ virtual void Output(CYOutput &out, CYFlags flags) const = 0;
};
struct CYForInInitialiser {
virtual CYExpression *Replace(CYContext &context) = 0;
virtual CYAssignment *Assignment(CYContext &context) = 0;
+
+ virtual void Output(CYOutput &out, CYFlags flags) const = 0;
};
struct CYNumber;
return true;
}
- virtual void For(CYOutput &out) const;
virtual void ForIn(CYOutput &out, CYFlags flags) const;
virtual CYStatement *ForEachIn(CYContext &out, CYExpression *value);
}
void AddPrev(CYExpression *expression) {
- CYSetLast(expression, expressions_);
+ CYSetLast(expression) = expressions_;
expressions_ = expression;
}
virtual CYExpression *Replace(CYContext &context);
void Output(CYOutput &out, CYFlags flags) const;
+
+ virtual CYExpression *Primitive(CYContext &context);
};
+struct CYDeclaration;
+
struct CYFunctionParameter :
CYNext<CYFunctionParameter>,
CYThing
{
- CYIdentifier *name_;
+ CYForInInitialiser *initialiser_;
- CYFunctionParameter(CYIdentifier *name, CYFunctionParameter *next = NULL) :
+ CYFunctionParameter(CYForInInitialiser *initialiser, CYFunctionParameter *next = NULL) :
CYNext<CYFunctionParameter>(next),
- name_(name)
- {
- }
-
- virtual CYFunctionParameter *Replace(CYContext &context, CYBlock &code);
- virtual void Output(CYOutput &out) const;
-};
-
-struct CYOptionalFunctionParameter :
- CYFunctionParameter
-{
- CYExpression *initializer_;
-
- CYOptionalFunctionParameter(CYIdentifier *name, CYExpression *initializer, CYFunctionParameter *next = NULL) :
- CYFunctionParameter(name, next),
- initializer_(initializer)
+ initialiser_(initialiser)
{
}
- virtual CYFunctionParameter *Replace(CYContext &context, CYBlock &code);
- virtual void Output(CYOutput &out) const;
+ void Replace(CYContext &context, CYBlock &code);
+ void Output(CYOutput &out) const;
};
struct CYComprehension :
CYNext<CYComprehension>,
CYThing
{
+ CYComprehension(CYComprehension *next = NULL) :
+ CYNext<CYComprehension>(next)
+ {
+ }
+
virtual const char *Name() const = 0;
virtual CYFunctionParameter *Parameter(CYContext &context) const = 0;
CYIdentifier *name_;
CYExpression *set_;
- CYForInComprehension(CYIdentifier *name, CYExpression *set) :
+ CYForInComprehension(CYIdentifier *name, CYExpression *set, CYComprehension *next = NULL) :
+ CYComprehension(next),
name_(name),
set_(set)
{
virtual void Output(CYOutput &out) const;
};
-struct CYForEachInComprehension :
+struct CYForOfComprehension :
CYComprehension
{
CYIdentifier *name_;
CYExpression *set_;
- CYForEachInComprehension(CYIdentifier *name, CYExpression *set) :
+ CYForOfComprehension(CYIdentifier *name, CYExpression *set, CYComprehension *next = NULL) :
+ CYComprehension(next),
name_(name),
set_(set)
{
{
}
- void Replace(CYContext &context);
+ CYArgument *Replace(CYContext &context);
void Output(CYOutput &out) const;
};
virtual CYStatement *ForEachIn(CYContext &out, CYExpression *value);
virtual CYExpression *Replace(CYContext &context);
+
virtual CYAssignment *Assignment(CYContext &context);
+ CYVariable *Variable(CYContext &context);
virtual void Output(CYOutput &out, CYFlags flags) const;
};
struct CYDeclarations :
CYNext<CYDeclarations>,
- CYThing,
- CYForInitialiser
+ CYThing
{
CYDeclaration *declaration_;
{
}
- virtual void For(CYOutput &out) const;
+ void Replace(CYContext &context);
- virtual CYCompound *Replace(CYContext &context);
+ CYCompound *Compound(CYContext &context);
CYProperty *Property(CYContext &context);
+ CYArgument *Argument(CYContext &context);
+ CYFunctionParameter *Parameter(CYContext &context);
virtual void Output(CYOutput &out) const;
virtual void Output(CYOutput &out, CYFlags flags) const;
};
+struct CYForDeclarations :
+ CYForInitialiser
+{
+ CYDeclarations *declarations_;
+
+ CYForDeclarations(CYDeclarations *declarations) :
+ declarations_(declarations)
+ {
+ }
+
+ virtual CYCompound *Replace(CYContext &context);
+ virtual void Output(CYOutput &out, CYFlags flags) const;
+};
+
struct CYVar :
CYStatement
{
virtual void Output(CYOutput &out, CYFlags flags) const;
};
-struct CYLet :
+struct CYLetStatement :
CYStatement
{
CYDeclarations *declarations_;
- CYBlock code_;
+ CYStatement *code_;
- CYLet(CYDeclarations *declarations, CYStatement *statements) :
+ CYLetStatement(CYDeclarations *declarations, CYStatement *code) :
declarations_(declarations),
- code_(statements)
+ code_(code)
{
}
virtual void Output(CYOutput &out, CYFlags flags) const;
};
-struct CYForEachIn :
+struct CYForOf :
CYStatement
{
CYForInInitialiser *initialiser_;
CYExpression *set_;
CYStatement *code_;
- CYForEachIn(CYForInInitialiser *initialiser, CYExpression *set, CYStatement *code) :
+ CYForOf(CYForInInitialiser *initialiser, CYExpression *set, CYStatement *code) :
initialiser_(initialiser),
set_(set),
code_(code)
void SetLeft(CYExpression *object) {
object_ = object;
}
-
- void Replace_(CYContext &context);
};
struct CYDirectMember :
virtual void Output(CYOutput &out, CYFlags flags) const;
};
+struct CYDebugger :
+ CYStatement
+{
+ CYDebugger()
+ {
+ }
+
+ virtual CYStatement *Replace(CYContext &context);
+ virtual void Output(CYOutput &out, CYFlags flags) const;
+};
+
struct CYCondition :
CYExpression
{