]> git.saurik.com Git - cycript.git/blobdiff - Syntax.hpp
Support 7a09b83's new boolean argument on startVm.
[cycript.git] / Syntax.hpp
index a3f03fab47eaca021196368cdc7cd29e965986ed..4b25b30738efa55e30a7122ac22ecc4df31f37f6 100644 (file)
@@ -1,5 +1,5 @@
-/* Cycript - Optimizing JavaScript Compiler/Runtime
- * Copyright (C) 2009-2015  Jay Freeman (saurik)
+/* Cycript - The Truly Universal Scripting Language
+ * Copyright (C) 2009-2016  Jay Freeman (saurik)
 */
 
 /* GNU Affero General Public License, Version 3 {{{ */
@@ -40,7 +40,14 @@ double CYCastDouble(const char *value);
 double CYCastDouble(CYUTF8String value);
 
 void CYNumerify(std::ostringstream &str, double value);
-void CYStringify(std::ostringstream &str, const char *data, size_t size, bool c = false);
+
+enum CYStringifyMode {
+    CYStringifyModeLegacy,
+    CYStringifyModeCycript,
+    CYStringifyModeNative,
+};
+
+void CYStringify(std::ostringstream &str, const char *data, size_t size, CYStringifyMode mode);
 
 // XXX: this really should not be here ... :/
 void *CYPoolFile(CYPool &pool, const char *path, size_t *psize);
@@ -120,6 +127,8 @@ struct CYOutput {
 
 struct CYExpression;
 struct CYAssignment;
+struct CYIdentifier;
+struct CYNumber;
 
 struct CYPropertyName {
     virtual bool Computed() const {
@@ -130,6 +139,14 @@ struct CYPropertyName {
         return false;
     }
 
+    virtual CYIdentifier *Identifier() {
+        return NULL;
+    }
+
+    virtual CYNumber *Number(CYContext &context) {
+        return NULL;
+    }
+
     virtual CYExpression *PropertyName(CYContext &context) = 0;
     virtual void PropertyName(CYOutput &out) const = 0;
 };
@@ -271,6 +288,10 @@ struct CYIdentifier :
     {
     }
 
+    CYIdentifier *Identifier() override {
+        return this;
+    }
+
     virtual const char *Word() const;
     CYIdentifier *Replace(CYContext &context, CYIdentifierKind);
 };
@@ -535,6 +556,10 @@ struct CYTarget :
         return false;
     }
 
+    virtual bool IsNew() const {
+        return false;
+    }
+
     virtual CYStatement *Initialize(CYContext &context, CYExpression *value);
 
     virtual CYTarget *Replace(CYContext &context) = 0;
@@ -776,6 +801,7 @@ struct CYString :
         return value_;
     }
 
+    virtual CYIdentifier *Identifier() const;
     virtual const char *Word() const;
 
     virtual CYNumber *Number(CYContext &context);
@@ -820,6 +846,8 @@ struct CYTemplate :
 
     CYPrecedence(0)
 
+    virtual CYString *String(CYContext &context);
+
     virtual CYTarget *Replace(CYContext &context);
     virtual void Output(CYOutput &out, CYFlags flags) const;
 };
@@ -1416,6 +1444,8 @@ struct CYObject :
     {
     }
 
+    CYTarget *Replace(CYContext &context, CYTarget *seed);
+
     virtual CYTarget *Replace(CYContext &context);
     void Output(CYOutput &out, CYFlags flags) const;
 };
@@ -1451,6 +1481,20 @@ struct CYDirectMember :
     virtual void Output(CYOutput &out, CYFlags flags) const;
 };
 
+struct CYAttemptMember :
+    CYMember
+{
+    CYAttemptMember(CYExpression *object, CYExpression *property) :
+        CYMember(object, property)
+    {
+    }
+
+    CYPrecedence(1)
+
+    virtual CYTarget *Replace(CYContext &context);
+    virtual void Output(CYOutput &out, CYFlags flags) const;
+};
+
 struct CYIndirectMember :
     CYMember
 {
@@ -1479,6 +1523,20 @@ struct CYResolveMember :
     virtual void Output(CYOutput &out, CYFlags flags) const;
 };
 
+struct CYSubscriptMember :
+    CYMember
+{
+    CYSubscriptMember(CYExpression *object, CYExpression *property) :
+        CYMember(object, property)
+    {
+    }
+
+    CYPrecedence(1)
+
+    virtual CYTarget *Replace(CYContext &context);
+    virtual void Output(CYOutput &out, CYFlags flags) const;
+};
+
 namespace cy {
 namespace Syntax {
 
@@ -1498,6 +1556,9 @@ struct New :
         return arguments_ == NULL ? 2 : 1;
     }
 
+    virtual bool IsNew() const {
+        return true;
+    }
 
     virtual CYTarget *Replace(CYContext &context);
     virtual void Output(CYOutput &out, CYFlags flags) const;
@@ -1551,26 +1612,55 @@ struct CYEval :
 
 struct CYRubyProc;
 
-struct CYRubyBlock :
+struct CYBraced :
     CYTarget
 {
-    CYExpression *call_;
-    CYRubyProc *proc_;
+    CYTarget *lhs_;
 
-    CYRubyBlock(CYExpression *call, CYRubyProc *proc) :
-        call_(call),
-        proc_(proc)
+    CYBraced(CYTarget *lhs = NULL) :
+        lhs_(lhs)
     {
     }
 
     CYPrecedence(1)
 
+    void SetLeft(CYTarget *lhs) {
+        lhs_ = lhs;
+    }
+};
+
+struct CYRubyBlock :
+    CYBraced
+{
+    CYRubyProc *proc_;
+
+    CYRubyBlock(CYTarget *lhs, CYRubyProc *proc) :
+        CYBraced(lhs),
+        proc_(proc)
+    {
+    }
+
     virtual CYTarget *Replace(CYContext &context);
     virtual void Output(CYOutput &out, CYFlags flags) const;
 
     virtual CYTarget *AddArgument(CYContext &context, CYExpression *value);
 };
 
+struct CYExtend :
+    CYBraced
+{
+    CYObject object_;
+
+    CYExtend(CYTarget *lhs, CYProperty *properties = NULL) :
+        CYBraced(lhs),
+        object_(properties)
+    {
+    }
+
+    virtual CYTarget *Replace(CYContext &context);
+    virtual void Output(CYOutput &out, CYFlags flags) const;
+};
+
 struct CYIf :
     CYStatement
 {
@@ -2020,6 +2110,20 @@ struct CYTypeCharacter :
     virtual void Output(CYOutput &out) const;
 };
 
+struct CYTypeInt128 :
+    CYTypeSpecifier
+{
+    CYTypeSigning signing_;
+
+    CYTypeInt128(CYTypeSigning signing) :
+        signing_(signing)
+    {
+    }
+
+    virtual CYTarget *Replace(CYContext &context);
+    virtual void Output(CYOutput &out) const;
+};
+
 struct CYTypeIntegral :
     CYTypeSpecifier
 {
@@ -2064,6 +2168,20 @@ struct CYTypeIntegral :
     virtual void Output(CYOutput &out) const;
 };
 
+struct CYTypeFloating :
+    CYTypeSpecifier
+{
+    int length_;
+
+    CYTypeFloating(int length) :
+        length_(length)
+    {
+    }
+
+    virtual CYTarget *Replace(CYContext &context);
+    virtual void Output(CYOutput &out) const;
+};
+
 struct CYTypeVoid :
     CYTypeSpecifier
 {
@@ -2074,12 +2192,19 @@ struct CYTypeVoid :
     virtual void Output(CYOutput &out) const;
 };
 
+enum CYTypeReferenceKind {
+    CYTypeReferenceStruct,
+    CYTypeReferenceEnum,
+};
+
 struct CYTypeReference :
     CYTypeSpecifier
 {
+    CYTypeReferenceKind kind_;
     CYIdentifier *name_;
 
-    CYTypeReference(CYIdentifier *name) :
+    CYTypeReference(CYTypeReferenceKind kind, CYIdentifier *name) :
+        kind_(kind),
         name_(name)
     {
     }
@@ -2122,8 +2247,8 @@ struct CYTypeModifier :
     virtual CYTarget *Replace_(CYContext &context, CYTarget *type) = 0;
     CYTarget *Replace(CYContext &context, CYTarget *type);
 
-    virtual void Output(CYOutput &out, CYIdentifier *identifier) const = 0;
-    void Output(CYOutput &out, int precedence, CYIdentifier *identifier) const;
+    virtual void Output(CYOutput &out, CYPropertyName *name) const = 0;
+    void Output(CYOutput &out, int precedence, CYPropertyName *name, bool space) const;
 
     virtual CYTypeFunctionWith *Function() { return NULL; }
 };
@@ -2142,7 +2267,7 @@ struct CYTypeArrayOf :
     CYPrecedence(1)
 
     virtual CYTarget *Replace_(CYContext &context, CYTarget *type);
-    virtual void Output(CYOutput &out, CYIdentifier *identifier) const;
+    void Output(CYOutput &out, CYPropertyName *name) const override;
 };
 
 struct CYTypeConstant :
@@ -2156,7 +2281,7 @@ struct CYTypeConstant :
     CYPrecedence(0)
 
     virtual CYTarget *Replace_(CYContext &context, CYTarget *type);
-    virtual void Output(CYOutput &out, CYIdentifier *identifier) const;
+    void Output(CYOutput &out, CYPropertyName *name) const override;
 };
 
 struct CYTypePointerTo :
@@ -2170,7 +2295,7 @@ struct CYTypePointerTo :
     CYPrecedence(0)
 
     virtual CYTarget *Replace_(CYContext &context, CYTarget *type);
-    virtual void Output(CYOutput &out, CYIdentifier *identifier) const;
+    void Output(CYOutput &out, CYPropertyName *name) const override;
 };
 
 struct CYTypeVolatile :
@@ -2184,50 +2309,63 @@ struct CYTypeVolatile :
     CYPrecedence(0)
 
     virtual CYTarget *Replace_(CYContext &context, CYTarget *type);
-    virtual void Output(CYOutput &out, CYIdentifier *identifier) const;
+    void Output(CYOutput &out, CYPropertyName *name) const override;
 };
 
-struct CYTypedIdentifier :
-    CYNext<CYTypedIdentifier>,
+struct CYType :
     CYThing
 {
-    CYLocation location_;
-    CYIdentifier *identifier_;
     CYTypeSpecifier *specifier_;
     CYTypeModifier *modifier_;
 
-    CYTypedIdentifier(const CYLocation &location, CYIdentifier *identifier = NULL) :
-        location_(location),
-        identifier_(identifier),
-        specifier_(NULL),
-        modifier_(NULL)
-    {
-    }
-
-    CYTypedIdentifier(CYTypeSpecifier *specifier, CYTypeModifier *modifier = NULL) :
-        identifier_(NULL),
+    CYType(CYTypeSpecifier *specifier = NULL, CYTypeModifier *modifier = NULL) :
         specifier_(specifier),
         modifier_(modifier)
     {
     }
 
-    inline CYTypedIdentifier *Modify(CYTypeModifier *modifier) {
+    inline CYType *Modify(CYTypeModifier *modifier) {
         CYSetLast(modifier_) = modifier;
         return this;
     }
 
+    void Output(CYOutput &out, CYPropertyName *name) const;
+
     virtual CYTarget *Replace(CYContext &context);
     virtual void Output(CYOutput &out) const;
 
     CYTypeFunctionWith *Function();
 };
 
+struct CYTypedLocation :
+    CYType
+{
+    CYLocation location_;
+
+    CYTypedLocation(const CYLocation &location) :
+        location_(location)
+    {
+    }
+};
+
+struct CYTypedName :
+    CYTypedLocation
+{
+    CYPropertyName *name_;
+
+    CYTypedName(const CYLocation &location, CYPropertyName *name = NULL) :
+        CYTypedLocation(location),
+        name_(name)
+    {
+    }
+};
+
 struct CYEncodedType :
     CYTarget
 {
-    CYTypedIdentifier *typed_;
+    CYType *typed_;
 
-    CYEncodedType(CYTypedIdentifier *typed) :
+    CYEncodedType(CYType *typed) :
         typed_(typed)
     {
     }
@@ -2242,11 +2380,13 @@ struct CYTypedParameter :
     CYNext<CYTypedParameter>,
     CYThing
 {
-    CYTypedIdentifier *typed_;
+    CYType *type_;
+    CYIdentifier *name_;
 
-    CYTypedParameter(CYTypedIdentifier *typed, CYTypedParameter *next) :
+    CYTypedParameter(CYType *type, CYIdentifier *name, CYTypedParameter *next = NULL) :
         CYNext<CYTypedParameter>(next),
-        typed_(typed)
+        type_(type),
+        name_(name)
     {
     }
 
@@ -2271,11 +2411,11 @@ struct CYTypedFormal {
 struct CYLambda :
     CYTarget
 {
-    CYTypedIdentifier *typed_;
+    CYType *typed_;
     CYTypedParameter *parameters_;
     CYStatement *code_;
 
-    CYLambda(CYTypedIdentifier *typed, CYTypedParameter *parameters, CYStatement *code) :
+    CYLambda(CYType *typed, CYTypedParameter *parameters, CYStatement *code) :
         typed_(typed),
         parameters_(parameters),
         code_(code)
@@ -2353,15 +2493,37 @@ struct CYImportDeclaration :
     virtual void Output(CYOutput &out, CYFlags flags) const;
 };
 
-struct CYExternal :
+struct CYExternalExpression :
+    CYTarget
+{
+    CYString *abi_;
+    CYType *type_;
+    CYPropertyName *name_;
+
+    CYExternalExpression(CYString *abi, CYType *type, CYPropertyName *name) :
+        abi_(abi),
+        type_(type),
+        name_(name)
+    {
+    }
+
+    CYPrecedence(0)
+
+    virtual CYTarget *Replace(CYContext &context);
+    virtual void Output(CYOutput &out, CYFlags flags) const;
+};
+
+struct CYExternalDefinition :
     CYStatement
 {
     CYString *abi_;
-    CYTypedIdentifier *typed_;
+    CYType *type_;
+    CYIdentifier *name_;
 
-    CYExternal(CYString *abi, CYTypedIdentifier *typed) :
+    CYExternalDefinition(CYString *abi, CYType *type, CYIdentifier *name) :
         abi_(abi),
-        typed_(typed)
+        type_(type),
+        name_(name)
     {
     }
 
@@ -2374,9 +2536,9 @@ struct CYExternal :
 struct CYTypeExpression :
     CYTarget
 {
-    CYTypedIdentifier *typed_;
+    CYType *typed_;
 
-    CYTypeExpression(CYTypedIdentifier *typed) :
+    CYTypeExpression(CYType *typed) :
         typed_(typed)
     {
     }
@@ -2390,10 +2552,12 @@ struct CYTypeExpression :
 struct CYTypeDefinition :
     CYStatement
 {
-    CYTypedIdentifier *typed_;
+    CYType *type_;
+    CYIdentifier *name_;
 
-    CYTypeDefinition(CYTypedIdentifier *typed) :
-        typed_(typed)
+    CYTypeDefinition(CYType *type, CYIdentifier *name) :
+        type_(type),
+        name_(name)
     {
     }
 
@@ -2417,7 +2581,7 @@ struct CYTypeBlockWith :
     CYPrecedence(0)
 
     virtual CYTarget *Replace_(CYContext &context, CYTarget *type);
-    virtual void Output(CYOutput &out, CYIdentifier *identifier) const;
+    void Output(CYOutput &out, CYPropertyName *name) const override;
 };
 
 struct CYTypeFunctionWith :
@@ -2436,7 +2600,7 @@ struct CYTypeFunctionWith :
     CYPrecedence(1)
 
     virtual CYTarget *Replace_(CYContext &context, CYTarget *type);
-    virtual void Output(CYOutput &out, CYIdentifier *identifier) const;
+    void Output(CYOutput &out, CYPropertyName *name) const override;
 
     virtual CYTypeFunctionWith *Function() { return this; }
 };
@@ -2444,11 +2608,13 @@ struct CYTypeFunctionWith :
 struct CYTypeStructField :
     CYNext<CYTypeStructField>
 {
-    CYTypedIdentifier *typed_;
+    CYType *type_;
+    CYPropertyName *name_;
 
-    CYTypeStructField(CYTypedIdentifier *typed, CYTypeStructField *next = NULL) :
+    CYTypeStructField(CYType *type, CYPropertyName *name, CYTypeStructField *next = NULL) :
         CYNext<CYTypeStructField>(next),
-        typed_(typed)
+        type_(type),
+        name_(name)
     {
     }
 };
@@ -2501,6 +2667,38 @@ struct CYStructDefinition :
     virtual void Output(CYOutput &out, CYFlags flags) const;
 };
 
+struct CYEnumConstant :
+    CYNext<CYEnumConstant>
+{
+    CYIdentifier *name_;
+    CYNumber *value_;
+
+    CYEnumConstant(CYIdentifier *name, CYNumber *value, CYEnumConstant *next = NULL) :
+        CYNext<CYEnumConstant>(next),
+        name_(name),
+        value_(value)
+    {
+    }
+};
+
+struct CYTypeEnum :
+    CYTypeSpecifier
+{
+    CYIdentifier *name_;
+    CYTypeSpecifier *specifier_;
+    CYEnumConstant *constants_;
+
+    CYTypeEnum(CYIdentifier *name, CYTypeSpecifier *specifier, CYEnumConstant *constants) :
+        name_(name),
+        specifier_(specifier),
+        constants_(constants)
+    {
+    }
+
+    virtual CYTarget *Replace(CYContext &context);
+    virtual void Output(CYOutput &out) const;
+};
+
 namespace cy {
 namespace Syntax {