X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/d83803733e0994c59ed12d7b6b4acf2ea55a5f10..2fad14e52c8cde8c45003a2ebb6907a57ca380e4:/Replace.cpp diff --git a/Replace.cpp b/Replace.cpp index 1ae2ef0..ed486f7 100644 --- a/Replace.cpp +++ b/Replace.cpp @@ -101,8 +101,8 @@ CYArgument *CYArgument::Replace(CYContext &context) { $T(NULL) } CYTarget *CYArray::Replace(CYContext &context) { - if (elements_ != NULL) - elements_->Replace(context); + CYForEach (element, elements_) + element->Replace(context); return this; } @@ -347,8 +347,6 @@ void CYElementSpread::Replace(CYContext &context) { void CYElementValue::Replace(CYContext &context) { context.Replace(value_); - if (next_ != NULL) - next_->Replace(context); } CYForInitializer *CYEmpty::Replace(CYContext &context) { @@ -880,6 +878,10 @@ void CYScript::Replace(CYContext &context) { } } +CYTarget *CYResolveMember::Replace(CYContext &context) { + return $M($M(object_, $S("$cyr")), property_); +} + CYStatement *CYReturn::Replace(CYContext &context) { if (context.nonlocal_ != NULL) { CYProperty *value(value_ == NULL ? NULL : $ CYPropertyValue($S("$cyv"), value_)); @@ -1124,6 +1126,10 @@ CYTarget *CYSuperCall::Replace(CYContext &context) { return $C($C1($M($V(context.super_), $S("bind")), $ CYThis()), arguments_); } +CYTarget *CYSymbol::Replace(CYContext &context) { + return $C1($M($V("Symbol"), $S("for")), $S(name_)); +} + CYStatement *CYSwitch::Replace(CYContext &context) { context.Replace(value_); clauses_->Replace(context); @@ -1191,6 +1197,15 @@ CYTarget *CYTypeBlockWith::Replace_(CYContext &context, CYTarget *type) { return next_->Replace(context, $ CYCall($ CYDirectMember(type, $ CYString("blockWith")), parameters_->Argument(context))); } +CYTarget *CYTypeCharacter::Replace(CYContext &context) { + switch (signing_) { + case CYTypeNeutral: return $V("char"); + case CYTypeSigned: return $V("schar"); + case CYTypeUnsigned: return $V("uchar"); + default: _assert(false); + } +} + CYTarget *CYTypeConstant::Replace_(CYContext &context, CYTarget *type) { return next_->Replace(context, $ CYCall($ CYDirectMember(type, $ CYString("constant")))); } @@ -1210,16 +1225,26 @@ CYTarget *CYTypeExpression::Replace(CYContext &context) { return typed_->Replace(context); } +CYTarget *CYTypeIntegral::Replace(CYContext &context) { + bool u(signing_ == CYTypeUnsigned); + switch (length_) { + case 0: return $V(u ? "ushort" : "short"); + case 1: return $V(u ? "uint" : "int"); + case 2: return $V(u ? "ulong" : "long"); + case 3: return $V(u ? "ulonglong" : "longlong"); + default: _assert(false); + } +} + CYTarget *CYTypeModifier::Replace(CYContext &context, CYTarget *type) { $T(type) return Replace_(context, type); } CYTarget *CYTypeFunctionWith::Replace_(CYContext &context, CYTarget *type) { - return next_->Replace(context, $ CYCall($ CYDirectMember(type, $ CYString("functionWith")), parameters_->Argument(context))); -} - -CYTarget *CYTypeLong::Replace(CYContext &context) { - return $ CYCall($ CYDirectMember(specifier_->Replace(context), $ CYString("long"))); + CYList arguments(parameters_->Argument(context)); + if (variadic_) + arguments->*$C_($ CYNull()); + return next_->Replace(context, $ CYCall($ CYDirectMember(type, $ CYString("functionWith")), arguments)); } CYTarget *CYTypePointerTo::Replace_(CYContext &context, CYTarget *type) { @@ -1230,14 +1255,6 @@ CYTarget *CYTypeReference::Replace(CYContext &context) { return $V($pool.strcat(name_->Word(), "$cy", NULL)); } -CYTarget *CYTypeShort::Replace(CYContext &context) { - return $ CYCall($ CYDirectMember(specifier_->Replace(context), $ CYString("short"))); -} - -CYTarget *CYTypeSigned::Replace(CYContext &context) { - return $ CYCall($ CYDirectMember(specifier_->Replace(context), $ CYString("signed"))); -} - CYTarget *CYTypeStruct::Replace(CYContext &context) { CYTarget *target(tail_->Replace(context)); if (name_ != NULL) @@ -1245,10 +1262,6 @@ CYTarget *CYTypeStruct::Replace(CYContext &context) { return target; } -CYTarget *CYTypeUnsigned::Replace(CYContext &context) { - return $ CYCall($ CYDirectMember(specifier_->Replace(context), $ CYString("unsigned"))); -} - CYTarget *CYTypeVariable::Replace(CYContext &context) { return $V(name_); } @@ -1266,15 +1279,15 @@ CYTarget *CYTypedIdentifier::Replace(CYContext &context) { } CYTypeFunctionWith *CYTypedIdentifier::Function() { - CYTypeModifier **modifier(&modifier_); - if (*modifier == NULL) + CYTypeModifier *&modifier(CYGetLast(modifier_)); + if (modifier == NULL) return NULL; - while ((*modifier)->next_ != NULL) - modifier = &(*modifier)->next_; - CYTypeFunctionWith *function((*modifier)->Function()); + + CYTypeFunctionWith *function(modifier->Function()); if (function == NULL) return NULL; - *modifier = NULL; + + modifier = NULL; return function; }