X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/b3c38c5f53b15b19451ca1e4d3c9c03984c6ad1d..0559abf83c4cc9bbd896b69dfaae1e8422521479:/Replace.cpp diff --git a/Replace.cpp b/Replace.cpp index 307ccec..1513c8d 100644 --- a/Replace.cpp +++ b/Replace.cpp @@ -623,6 +623,27 @@ CYStatement *CYImport::Replace(CYContext &context) { return $ CYVar($B1($B($I(module_->part_->Word()), $C1($V("require"), module_->Replace(context, "/"))))); } +CYStatement *CYImportDeclaration::Replace(CYContext &context) { + CYIdentifier *module(context.Unique()); + + CYList statements; + CYForEach (specifier, specifiers_) + statements->*specifier->Replace(context, module); + + return $ CYBlock($$ + ->* $ CYLexical(false, $B1($B(module, $C1($V("require"), module_)))) + ->* statements); +} + +CYStatement *CYImportSpecifier::Replace(CYContext &context, CYIdentifier *module) { + binding_ = binding_->Replace(context, CYIdentifierLexical); + + CYExpression *import($V(module)); + if (name_ != NULL) + import = $M(import, $S(name_)); + return $E($ CYAssign($V(binding_), import)); +} + CYTarget *CYIndirect::Replace(CYContext &context) { return $M(rhs_, $S("$cyi")); } @@ -1069,6 +1090,32 @@ CYString *CYString::String(CYContext &context) { return this; } +CYStatement *CYStructDefinition::Replace(CYContext &context) { + CYTarget *target(tail_->Replace(context)); + if (name_ != NULL) + target = $C1($M(target, $S("withName")), $S(name_->Word())); + return $ CYLexical(false, $B1($B($I($pool.strcat(name_->Word(), "$cy", NULL)), target))); +} + +CYTarget *CYStructTail::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); + } + + return $N2($V("Type"), $ CYArray(types), $ CYArray(names)); +} + CYTarget *CYSuperAccess::Replace(CYContext &context) { return $C1($M($M($M($V(context.super_), $S("prototype")), property_), $S("bind")), $ CYThis()); } @@ -1144,6 +1191,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")))); } @@ -1163,6 +1219,17 @@ 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); } @@ -1171,48 +1238,21 @@ 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"))); -} - CYTarget *CYTypePointerTo::Replace_(CYContext &context, CYTarget *type) { return next_->Replace(context, $ CYCall($ CYDirectMember(type, $ CYString("pointerTo")))); } -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 *CYTypeReference::Replace(CYContext &context) { + return $V($pool.strcat(name_->Word(), "$cy", NULL)); } 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))); + CYTarget *target(tail_->Replace(context)); 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 *CYTypeVariable::Replace(CYContext &context) { return $V(name_); }