return NULL;
}
+CYTarget *CYExtend::Replace(CYContext &context) {
+ return object_.Replace(context, lhs_);
+}
+
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())))));
}
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) {
}
}
+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_));
}
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) {
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);
}
CYTarget *CYTypeFunctionWith::Replace_(CYContext &context, CYTarget *type) {
- return next_->Replace(context, $ CYCall($ CYDirectMember(type, $ CYString("functionWith")), parameters_->Argument(context)));
+ CYList<CYArgument> 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) {
}
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;
}