]> git.saurik.com Git - cycript.git/commitdiff
Add typedef-expressions syntax to replace @encode.
authorJay Freeman (saurik) <saurik@saurik.com>
Sat, 19 Dec 2015 02:23:20 +0000 (18:23 -0800)
committerJay Freeman (saurik) <saurik@saurik.com>
Sat, 19 Dec 2015 02:23:20 +0000 (18:23 -0800)
Execute.cpp
ObjectiveC/Replace.cpp
Output.cpp
Parser.ypp.in
Replace.cpp
Syntax.hpp

index c71bc9f92044bfd2322fded09726238dd2fc8116..bb337ba79a62728221794fd128f157563bcd7739 100644 (file)
@@ -1484,7 +1484,7 @@ static JSValueRef Type_callAsFunction_toCYON(JSContextRef context, JSObjectRef o
     std::stringbuf out;
     CYOptions options;
     CYOutput output(out, options);
-    (new(pool) CYEncodedType(Decode(pool, internal->type_)))->Output(output, CYNoFlags);
+    (new(pool) CYTypeExpression(Decode(pool, internal->type_)))->Output(output, CYNoFlags);
     return CYCastJSValue(context, CYJSString(out.str().c_str()));
 } CYCatch(NULL) }
 
index 04ed11c65680e69b4e19137651602990b03c8a56..6dd8e5500dc16cdd5c536df9aa3550750dd9029d 100644 (file)
@@ -133,7 +133,7 @@ CYTarget *CYBox::Replace(CYContext &context) {
 }
 
 CYTarget *CYObjCBlock::Replace(CYContext &context) {
-    return $C1($ CYEncodedType(($ CYTypedIdentifier(*typed_))->Modify($ CYTypeBlockWith(parameters_))), $ CYFunctionExpression(NULL, parameters_->Parameters(context), code_));
+    return $C1($ CYTypeExpression(($ CYTypedIdentifier(*typed_))->Modify($ CYTypeBlockWith(parameters_))), $ CYFunctionExpression(NULL, parameters_->Parameters(context), code_));
 }
 
 CYStatement *CYProtocol::Replace(CYContext &context) const { $T(NULL)
index 2125d751a545c072d5948ef0a8ca94fde3e2d61f..cbd853f836f00b6a1521c638010c3c0310e65242 100644 (file)
@@ -640,6 +640,10 @@ void CYTypeDefinition::Output(CYOutput &out, CYFlags flags) const {
     out << "typedef" << ' ' << *typed_;
 }
 
+void CYTypeExpression::Output(CYOutput &out, CYFlags flags) const {
+    out << '(' << "typedef" << ' ' << *typed_ << ')';
+}
+
 void CYLexical::Output(CYOutput &out, CYFlags flags) const {
     out << "let" << ' ';
     bindings_->Output(out, flags); // XXX: flags
index 50cacb3ed1add2d47a19283e0437adde8ce8a839..8e0576dd61e3910936ecd5cef6529f747245d4b1 100644 (file)
@@ -2222,6 +2222,10 @@ IdentifierNoOf
 Statement__
     : "typedef" NewLineNot TypedIdentifier[typed] { if ($typed->identifier_ == NULL) CYERR($typed->location_, "expected identifier"); } Terminator { $$ = CYNew CYTypeDefinition($typed); }
     ;
+
+PrimaryExpression
+    : "(" LexOf "typedef" NewLineOpt TypedIdentifier[typed] { if ($typed->identifier_ != NULL) CYERR($typed->location_, "unexpected identifier"); } ")" { $$ = CYNew CYTypeExpression($typed); }
+    ;
 /* }}} */
 /* Cycript (C): extern "C" {{{ */
 IdentifierNoOf
index d2704cb6b4350209ea611abda6063afad5f978e0..c812c358e3524344ebda7d1a93296e1203516cc6 100644 (file)
@@ -1149,7 +1149,9 @@ CYTarget *CYTypeConstant::Replace_(CYContext &context, CYTarget *type) {
 }
 
 CYStatement *CYTypeDefinition::Replace(CYContext &context) {
-    return $E($ CYAssign($V(typed_->identifier_), typed_->Replace(context)));
+    CYIdentifier *identifier(typed_->identifier_);
+    typed_->identifier_ = NULL;
+    return $ CYLexical(false, $B1($B(identifier, $ CYTypeExpression(typed_))));
 }
 
 CYTarget *CYTypeError::Replace(CYContext &context) {
@@ -1157,6 +1159,10 @@ CYTarget *CYTypeError::Replace(CYContext &context) {
     return NULL;
 }
 
+CYTarget *CYTypeExpression::Replace(CYContext &context) {
+    return typed_->Replace(context);
+}
+
 CYTarget *CYTypeModifier::Replace(CYContext &context, CYTarget *type) { $T(type)
     return Replace_(context, type);
 }
index d7d783bc3ecc1eca07dd1bdd71b24168c1bc397b..89bca7336c23251c34089bc9e578e3c1fc428991 100644 (file)
@@ -2256,6 +2256,22 @@ struct CYExternal :
     virtual void Output(CYOutput &out, CYFlags flags) const;
 };
 
+struct CYTypeExpression :
+    CYTarget
+{
+    CYTypedIdentifier *typed_;
+
+    CYTypeExpression(CYTypedIdentifier *typed) :
+        typed_(typed)
+    {
+    }
+
+    CYPrecedence(0)
+
+    virtual CYTarget *Replace(CYContext &context);
+    virtual void Output(CYOutput &out, CYFlags flags) const;
+};
+
 struct CYTypeDefinition :
     CYStatement
 {