X-Git-Url: https://git.saurik.com/cycript.git/blobdiff_plain/5a6c975adbe2588a10190cba75e9152682bedeae..5c9d18fc8afb53b7478f4c7e6ab764c52b465769:/Replace.cpp diff --git a/Replace.cpp b/Replace.cpp index ca05d08..103f6f8 100644 --- a/Replace.cpp +++ b/Replace.cpp @@ -1,5 +1,5 @@ -/* Cycript - Optimizing JavaScript Compiler/Runtime - * Copyright (C) 2009-2015 Jay Freeman (saurik) +/* Cycript - The Truly Universal Scripting Language + * Copyright (C) 2009-2016 Jay Freeman (saurik) */ /* GNU Affero General Public License, Version 3 {{{ */ @@ -117,6 +117,9 @@ CYTarget *CYArrayComprehension::Replace(CYContext &context) { } CYExpression *CYAssignment::Replace(CYContext &context) { + // XXX: this is a horrible hack but I'm a month over schedule :( + if (CYSubscriptMember *subscript = dynamic_cast(lhs_)) + return $C2($M(subscript->object_, $S("$cys")), subscript->property_, rhs_); context.Replace(lhs_); context.Replace(rhs_); return this; @@ -179,6 +182,7 @@ CYTarget *CYClassExpression::Replace(CYContext &context) { if (tail_->constructor_ == NULL) tail_->constructor_ = $ CYFunctionExpression(NULL, NULL, NULL); + tail_->constructor_->name_ = name_; tail_->constructor_ = CYSuperize(context, tail_->constructor_); context.super_ = old; @@ -381,8 +385,16 @@ CYFunctionParameter *CYExpression::Parameter() const { return NULL; } -CYStatement *CYExternal::Replace(CYContext &context) { - return $E($ CYAssign($V(typed_->identifier_), $C1(typed_->Replace(context), $C2($V("dlsym"), $V("RTLD_DEFAULT"), $S(typed_->identifier_->Word()))))); +CYTarget *CYExtend::Replace(CYContext &context) { + return object_.Replace(context, lhs_); +} + +CYStatement *CYExternalDefinition::Replace(CYContext &context) { + return $E($ CYAssign($V(typed_->identifier_), $ CYExternalExpression(abi_, typed_))); +} + +CYTarget *CYExternalExpression::Replace(CYContext &context) { + return $C1(typed_->Replace(context), $C2($V("dlsym"), $V("RTLD_DEFAULT"), $S(typed_->identifier_->Word()))); } CYNumber *CYFalse::Number(CYContext &context) { @@ -732,21 +744,25 @@ CYExpression *CYNumber::PropertyName(CYContext &context) { return String(context); } -CYTarget *CYObject::Replace(CYContext &context) { +CYTarget *CYObject::Replace(CYContext &context, CYTarget *seed) { CYBuilder builder; if (properties_ != NULL) - properties_ = properties_->ReplaceAll(context, builder, $ CYThis(), false); + properties_ = properties_->ReplaceAll(context, builder, $ CYThis(), seed != this); if (builder) { return $C1($M($ CYFunctionExpression(NULL, builder.bindings_->Parameter(context), builder.statements_ ->* $ CYReturn($ CYThis()) - ), $S("call")), this, builder.bindings_->Argument(context)); + ), $S("call")), seed, builder.bindings_->Argument(context)); } CYForEach (property, properties_) property->Replace(context); - return this; + return seed; +} + +CYTarget *CYObject::Replace(CYContext &context) { + return Replace(context, this); } CYTarget *CYParenthetical::Replace(CYContext &context) { @@ -878,6 +894,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_)); @@ -891,7 +911,7 @@ CYStatement *CYReturn::Replace(CYContext &context) { } CYTarget *CYRubyBlock::Replace(CYContext &context) { - return call_->AddArgument(context, proc_->Replace(context)); + return lhs_->AddArgument(context, proc_->Replace(context)); } CYTarget *CYRubyBlock::AddArgument(CYContext &context, CYExpression *value) { @@ -1058,6 +1078,10 @@ void CYScope::Close(CYContext &context) { default:; } } } +CYTarget *CYSubscriptMember::Replace(CYContext &context) { + return $C1($M(object_, $S("$cyg")), property_); +} + CYElementValue *CYSpan::Replace(CYContext &context) { $T(NULL) return $ CYElementValue(expression_, $ CYElementValue(string_, next_->Replace(context))); } @@ -1122,6 +1146,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); @@ -1208,6 +1236,18 @@ CYStatement *CYTypeDefinition::Replace(CYContext &context) { return $ CYLexical(false, $B1($B(identifier, $ CYTypeExpression(typed_)))); } +CYTarget *CYTypeEnum::Replace(CYContext &context) { + CYList properties; + CYForEach (constant, constants_) + properties->*$ CYPropertyValue($S(constant->name_->Word()), constant->value_); + CYObject *constants($ CYObject(properties)); + + if (specifier_ == NULL) + return $N1($V("Type"), constants); + else + return $C1($M(specifier_->Replace(context), $S("enumFor")), constants); +} + CYTarget *CYTypeError::Replace(CYContext &context) { _assert(false); return NULL; @@ -1217,6 +1257,10 @@ CYTarget *CYTypeExpression::Replace(CYContext &context) { return typed_->Replace(context); } +CYTarget *CYTypeInt128::Replace(CYContext &context) { + return $V(signing_ == CYTypeUnsigned ? "uint128" : "int128"); +} + CYTarget *CYTypeIntegral::Replace(CYContext &context) { bool u(signing_ == CYTypeUnsigned); switch (length_) { @@ -1233,7 +1277,10 @@ CYTarget *CYTypeModifier::Replace(CYContext &context, CYTarget *type) { $T(type) } CYTarget *CYTypeFunctionWith::Replace_(CYContext &context, CYTarget *type) { - return next_->Replace(context, $ CYCall($ CYDirectMember(type, $ CYString("functionWith")), parameters_->Argument(context))); + 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) { @@ -1241,7 +1288,14 @@ CYTarget *CYTypePointerTo::Replace_(CYContext &context, CYTarget *type) { } CYTarget *CYTypeReference::Replace(CYContext &context) { - return $V($pool.strcat(name_->Word(), "$cy", NULL)); + const char *prefix; + switch (kind_) { + case CYTypeReferenceStruct: prefix = "$cys"; break; + case CYTypeReferenceEnum: prefix = "$cye"; break; + default: _assert(false); + } + + return $V($pool.strcat(prefix, name_->Word(), NULL)); } CYTarget *CYTypeStruct::Replace(CYContext &context) { @@ -1268,15 +1322,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; }