]> git.saurik.com Git - cycript.git/blobdiff - Replace.cpp
Do not allow loss of precision due to double cast.
[cycript.git] / Replace.cpp
index d2704cb6b4350209ea611abda6063afad5f978e0..307ccecfff8b2c4715791061f06267cda331725b 100644 (file)
@@ -1149,7 +1149,9 @@ CYTarget *CYTypeConstant::Replace_(CYContext &context, CYTarget *type) {
 }
 
 CYStatement *CYTypeDefinition::Replace(CYContext &context) {
 }
 
 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) {
 }
 
 CYTarget *CYTypeError::Replace(CYContext &context) {
@@ -1157,6 +1159,10 @@ CYTarget *CYTypeError::Replace(CYContext &context) {
     return NULL;
 }
 
     return NULL;
 }
 
+CYTarget *CYTypeExpression::Replace(CYContext &context) {
+    return typed_->Replace(context);
+}
+
 CYTarget *CYTypeModifier::Replace(CYContext &context, CYTarget *type) { $T(type)
     return Replace_(context, type);
 }
 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")));
 }
 
     return $ CYCall($ CYDirectMember(specifier_->Replace(context), $ CYString("signed")));
 }
 
+CYTarget *CYTypeStruct::Replace(CYContext &context) {
+    CYList<CYElementValue> types;
+    CYList<CYElementValue> 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")));
 }
 CYTarget *CYTypeUnsigned::Replace(CYContext &context) {
     return $ CYCall($ CYDirectMember(specifier_->Replace(context), $ CYString("unsigned")));
 }