]> git.saurik.com Git - cycript.git/commitdiff
When messages took no arguments, type returned NULL. v0.9.457
authorJay Freeman (saurik) <saurik@saurik.com>
Fri, 8 Jun 2012 10:11:13 +0000 (03:11 -0700)
committerJay Freeman (saurik) <saurik@saurik.com>
Fri, 8 Jun 2012 10:11:53 +0000 (03:11 -0700)
Cycript.yy.in
ObjectiveC/Replace.cpp
ObjectiveC/Syntax.hpp

index 6a4f179eedf77604a11979f0069476ddf181c790..15b76736674b407b3fdeedf2ca19d7c40a7257e3 100644 (file)
@@ -449,9 +449,10 @@ int cylex(YYSTYPE *, cy::location *, void *);
 %type <expression_> BoxableExpression
 %type <statement_> CategoryStatement
 %type <expression_> ClassExpression
 %type <expression_> BoxableExpression
 %type <statement_> CategoryStatement
 %type <expression_> ClassExpression
+%type <field_> ClassFieldListOpt
+%type <field_> ClassFields
 %type <statement_> ClassStatement
 %type <expression_> ClassSuperOpt
 %type <statement_> ClassStatement
 %type <expression_> ClassSuperOpt
-%type <field_> ClassFieldList
 %type <message_> ClassMessageDeclaration
 %type <message_> ClassMessageDeclarationListOpt
 %type <className_> ClassName
 %type <message_> ClassMessageDeclaration
 %type <message_> ClassMessageDeclarationListOpt
 %type <className_> ClassName
@@ -1300,17 +1301,13 @@ ClassSuperOpt
     | { $$ = NULL; }
     ;
 
     | { $$ = NULL; }
     ;
 
-ClassField
-    : Expression Identifier ";"
-    ;
-
-ClassFieldList
-    : BRACE ClassFieldListOpt "}" { $$ = NULL; }
+ClassFieldListOpt
+    : Expression Identifier ";" ClassFieldListOpt { $$ = CYNew CYField($1, $2, $4); }
+    | { $$ = NULL; }
     ;
 
     ;
 
-ClassFieldListOpt
-    : ClassFieldListOpt ClassField
-    |
+ClassFields
+    : BRACE ClassFieldListOpt "}" { $$ = $2; }
     ;
 
 MessageScope
     ;
 
 MessageScope
@@ -1378,11 +1375,11 @@ ClassProtocolListOpt
     ;
 
 ClassExpression
     ;
 
 ClassExpression
-    : "@implementation" LexPushInOff ClassNameOpt ClassSuperOpt ClassProtocolListOpt ClassFieldList ClassMessageDeclarationListOpt LexPopIn "@end" { $$ = CYNew CYClassExpression($3, $4, $5, $6, $7); }
+    : "@implementation" LexPushInOff ClassNameOpt ClassSuperOpt ClassProtocolListOpt ClassFields ClassMessageDeclarationListOpt LexPopIn "@end" { $$ = CYNew CYClassExpression($3, $4, $5, $6, $7); }
     ;
 
 ClassStatement
     ;
 
 ClassStatement
-    : ";@implementation" ClassName ClassSuperOpt ClassProtocolListOpt ClassFieldList ClassMessageDeclarationListOpt "@end" { $$ = CYNew CYClassStatement($2, $3, $4, $5, $6); }
+    : ";@implementation" ClassName ClassSuperOpt ClassProtocolListOpt ClassFields ClassMessageDeclarationListOpt "@end" { $$ = CYNew CYClassStatement($2, $3, $4, $5, $6); }
     ;
 
 CategoryName
     ;
 
 CategoryName
index 3e267ae2a1d0ce853491eaa80d8e4307cc2bf51b..99de585fdc262e7b4d10b0fe78e6b86969b10992 100644 (file)
@@ -32,7 +32,7 @@ static CYExpression *MessageType(CYContext &context, CYExpression *type, CYMessa
     if (extra != NULL)
         left = $ CYAdd(left, extra);
 
     if (extra != NULL)
         left = $ CYAdd(left, extra);
 
-    if (next == NULL)
+    if (next == NULL || next->name_ == NULL)
         return left;
 
     CYExpression *right(next->TypeSignature(context));
         return left;
 
     CYExpression *right(next->TypeSignature(context));
@@ -78,8 +78,18 @@ CYStatement *CYClassStatement::Replace(CYContext &context) {
     return $E(Replace_(context));
 }
 
     return $E(Replace_(context));
 }
 
-CYStatement *CYField::Replace(CYContext &context) const {
-    return NULL;
+CYStatement *CYField::Replace(CYContext &context) const { $T(NULL)
+    CYVariable *cyn($V("$cyn"));
+    CYVariable *cyt($V("$cyt"));
+
+    CYExpression *type($C0($M(type_, $S("toString"))));
+
+    return $ CYBlock($$->*
+        next_->Replace(context)->*
+        $E($ CYAssign(cyt, type))->*
+        $E($ CYAssign(cyn, $N1($V("Type"), cyt)))->*
+        $E($C5($V("class_addIvar"), $V("$cyc"), $S(name_->Word()), $M(cyn, $S("size")), $M(cyn, $S("alignment")), cyt))
+    );
 }
 
 CYStatement *CYImport::Replace(CYContext &context) {
 }
 
 CYStatement *CYImport::Replace(CYContext &context) {
index a9a9798b649fd9df413cdf554d4f122dc32bbe5f..580ea3adbaddbdf7a468be134c6724d1257c0994 100644 (file)
@@ -77,6 +77,16 @@ struct CYSelector :
 struct CYField :
     CYNext<CYField>
 {
 struct CYField :
     CYNext<CYField>
 {
+    CYExpression *type_;
+    CYIdentifier *name_;
+
+    CYField(CYExpression *type, CYIdentifier *name, CYField *next = NULL) :
+        CYNext<CYField>(next),
+        type_(type),
+        name_(name)
+    {
+    }
+
     CYStatement *Replace(CYContext &context) const;
     void Output(CYOutput &out) const;
 };
     CYStatement *Replace(CYContext &context) const;
     void Output(CYOutput &out) const;
 };