X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/09fc3efbc1e9a22b345b6e542737fc682a1f4332..639664e5c1b60087d09b046a81f624a55a01af72:/Replace.cpp diff --git a/Replace.cpp b/Replace.cpp index d2704cb..307ccec 100644 --- a/Replace.cpp +++ b/Replace.cpp @@ -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); } @@ -1181,6 +1187,28 @@ CYTarget *CYTypeSigned::Replace(CYContext &context) { return $ CYCall($ CYDirectMember(specifier_->Replace(context), $ CYString("signed"))); } +CYTarget *CYTypeStruct::Replace(CYContext &context) { + CYList types; + CYList names; + + CYForEach (field, fields_) { + CYTypedIdentifier *typed(field->typed_); + types->*$ CYElementValue(typed->Replace(context)); + + CYExpression *name; + if (typed->identifier_ == NULL) + name = NULL; + else + name = $S(typed->identifier_->Word()); + names->*$ CYElementValue(name); + } + + CYTarget *target($N2($V("Type"), $ CYArray(types), $ CYArray(names))); + if (name_ != NULL) + target = $C1($M(target, $S("withName")), $S(name_->Word())); + return target; +} + CYTarget *CYTypeUnsigned::Replace(CYContext &context) { return $ CYCall($ CYDirectMember(specifier_->Replace(context), $ CYString("unsigned"))); }