]> git.saurik.com Git - cycript.git/blobdiff - ObjectiveC/Replace.cpp
Use start conditions to parse regular expressions.
[cycript.git] / ObjectiveC / Replace.cpp
index d90eecfd1a80b648b8548d2184dbb3809761a9e3..1b71e02db0d18cb766dfcd2543ba9a3a86cee87f 100644 (file)
@@ -1,5 +1,5 @@
 /* Cycript - Optimizing JavaScript Compiler/Runtime
- * Copyright (C) 2009-2014  Jay Freeman (saurik)
+ * Copyright (C) 2009-2015  Jay Freeman (saurik)
 */
 
 /* GNU Affero General Public License, Version 3 {{{ */
 #include <sstream>
 
 static CYExpression *MessageType(CYContext &context, CYTypedIdentifier *type, CYMessageParameter *next, CYExpression *extra = NULL) {
-    if (type == NULL)
-        return NULL;
-
     CYExpression *left($C0($M(type->Replace(context), $S("toString"))));
     if (extra != NULL)
         left = $ CYAdd(left, extra);
 
-    if (next == NULL || next->name_ == NULL)
+    if (next == NULL || next->type_ == NULL)
         return left;
 
     CYExpression *right(next->TypeSignature(context));
@@ -53,12 +50,12 @@ CYStatement *CYCategory::Replace(CYContext &context) {
     ), name_->ClassName(context, true)));
 }
 
-CYExpression *CYClass::Replace_(CYContext &context) {
+CYStatement *CYClassStatement::Replace(CYContext &context) {
     CYVariable *cyc($V("$cyc")), *cys($V("$cys"));
 
-    CYExpression *name(name_ != NULL ? name_->ClassName(context, false) : $C1($V("$cyq"), $S("CY$")));
+    CYExpression *name(name_->ClassName(context, false));
 
-    return $C1($F(NULL, $P6($L("$cys"), $L("$cyp"), $L("$cyc"), $L("$cyn"), $L("$cyt"), $L("$cym")), $$->*
+    return $E($C1($F(NULL, $P6($L("$cys"), $L("$cyp"), $L("$cyc"), $L("$cyn"), $L("$cyt"), $L("$cym")), $$->*
         $E($ CYAssign($V("$cyp"), $C1($V("object_getClass"), cys)))->*
         $E($ CYAssign(cyc, $C3($V("objc_allocateClassPair"), cys, name, $D(0))))->*
         $E($ CYAssign($V("$cym"), $C1($V("object_getClass"), cyc)))->*
@@ -67,18 +64,10 @@ CYExpression *CYClass::Replace_(CYContext &context) {
         messages_->Replace(context, false)->*
         $E($C1($V("objc_registerClassPair"), cyc))->*
         $ CYReturn(cyc)
-    ), super_ == NULL ? $ CYNull() : super_);
-}
-
-CYExpression *CYClassExpression::Replace(CYContext &context) {
-    return Replace_(context);
+    ), super_ == NULL ? $ CYNull() : super_));
 }
 
-CYStatement *CYClassStatement::Replace(CYContext &context) {
-    return $E(Replace_(context));
-}
-
-CYStatement *CYField::Replace(CYContext &context) const { $T(NULL)
+CYStatement *CYClassField::Replace(CYContext &context) const { $T(NULL)
     CYVariable *cyn($V("$cyn"));
     CYVariable *cyt($V("$cyt"));
 
@@ -102,18 +91,16 @@ CYStatement *CYMessage::Replace(CYContext &context, bool replace) const { $T(NUL
     CYVariable *self($V("self"));
     CYVariable *_class($V(instance_ ? "$cys" : "$cyp"));
 
-    CYExpression *type(TypeSignature(context) ?: $C1($M(cyn, $S("type")), _class));
-
     return $ CYBlock($$->*
         next_->Replace(context, replace)->*
         $E($ CYAssign(cyn, parameters_->Selector(context)))->*
-        $E($ CYAssign(cyt, type))->*
+        $E($ CYAssign(cyt, TypeSignature(context)))->*
         $E($C4($V(replace ? "class_replaceMethod" : "class_addMethod"),
             $V(instance_ ? "$cyc" : "$cym"),
             cyn,
             $N2($V("Functor"), $F(NULL, $P2($L("self"), $L("_cmd"), parameters_->Parameters(context)), $$->*
                 $ CYVar($L1($L("$cyr", $N2($V("objc_super"), self, _class))))->*
-                $ CYReturn($C1($M($F(NULL, NULL, code_), $S("call")), self))
+                $ CYReturn($C1($M($F(NULL, NULL, code_.code_), $S("call")), self))
             ), cyt),
             cyt
         ))
@@ -126,7 +113,7 @@ CYExpression *CYMessage::TypeSignature(CYContext &context) const {
 
 CYFunctionParameter *CYMessageParameter::Parameters(CYContext &context) const { $T(NULL)
     CYFunctionParameter *next(next_->Parameters(context));
-    return name_ == NULL ? next : $ CYFunctionParameter($ CYDeclaration(name_), next);
+    return type_ == NULL ? next : $ CYFunctionParameter($ CYDeclaration(type_->identifier_), next);
 }
 
 CYSelector *CYMessageParameter::Selector(CYContext &context) const {
@@ -135,7 +122,7 @@ CYSelector *CYMessageParameter::Selector(CYContext &context) const {
 
 CYSelectorPart *CYMessageParameter::SelectorPart(CYContext &context) const { $T(NULL)
     CYSelectorPart *next(next_->SelectorPart(context));
-    return tag_ == NULL ? next : $ CYSelectorPart(tag_, name_ != NULL, next);
+    return tag_ == NULL ? next : $ CYSelectorPart(tag_, type_ != NULL, next);
 }
 
 CYExpression *CYMessageParameter::TypeSignature(CYContext &context) const {
@@ -147,7 +134,7 @@ CYExpression *CYBox::Replace(CYContext &context) {
 }
 
 CYExpression *CYObjCBlock::Replace(CYContext &context) {
-    return $C1($ CYEncodedType(($ CYTypedIdentifier(*typed_))->Modify($ CYTypeBlockWith(parameters_))), $ CYFunctionExpression(NULL, parameters_->Parameters(context), statements_));
+    return $C1($ CYEncodedType(($ CYTypedIdentifier(*typed_))->Modify($ CYTypeBlockWith(parameters_))), $ CYFunctionExpression(NULL, parameters_->Parameters(context), code_));
 }
 
 CYStatement *CYProtocol::Replace(CYContext &context) const { $T(NULL)