return this;
}
+CYTarget *CYAttemptMember::Replace(CYContext &context) {
+ CYIdentifier *value(context.Unique());
+
+ return $C1($F(NULL, $P1($B(value)), $$
+ ->* $ CYReturn($ CYCondition($V(value), $M($V(value), property_), $V(value)))
+ ), object_);
+}
+
CYStatement *CYBlock::Return() {
CYImplicitReturn(code_);
return this;
}
CYTarget *CYCall::Replace(CYContext &context) {
+ // XXX: this also is a horrible hack but I'm still a month over schedule :(
+ if (CYAttemptMember *member = dynamic_cast<CYAttemptMember *>(function_)) {
+ CYIdentifier *value(context.Unique());
+
+ return $C1($F(NULL, $P1($B(value)), $$
+ ->* $ CYReturn($ CYCondition($V(value), $C($M($V(value), member->property_), arguments_), $V(value)))
+ ), member->object_);
+ }
+
context.Replace(function_);
arguments_->Replace(context);
return this;
}
CYStatement *CYExternalDefinition::Replace(CYContext &context) {
- return $E($ CYAssign($V(typed_->identifier_), $ CYExternalExpression(abi_, typed_)));
+ return $E($ CYAssign($V(name_), $ CYExternalExpression(abi_, type_, name_)));
}
CYTarget *CYExternalExpression::Replace(CYContext &context) {
- return $C1(typed_->Replace(context), $C2($V("dlsym"), $V("RTLD_DEFAULT"), $S(typed_->identifier_->Word())));
+ CYExpression *expression(name_->Number(context));
+ if (expression == NULL)
+ expression = $C2($V("dlsym"), $V("RTLD_DEFAULT"), name_->PropertyName(context));
+ return $C1(type_->Replace(context), expression);
}
CYNumber *CYFalse::Number(CYContext &context) {
else if (existing->kind_ == CYIdentifierGlobal || existing->kind_ == CYIdentifierMagic)
existing->kind_ = kind;
else if (existing->kind_ == CYIdentifierLexical || kind == CYIdentifierLexical)
- _assert(false); // XXX: throw new SyntaxError()
+ _assert(false);
+ else if (transparent_ && existing->kind_ == CYIdentifierArgument && kind == CYIdentifierVariable)
+ _assert(false);
+ // XXX: throw new SyntaxError() instead of these asserts
return existing;
}
CYForEach (i, internal_) {
_assert(i->identifier_->next_ == i->identifier_);
switch (i->kind_) {
- case CYIdentifierArgument: {
- _assert(!transparent_);
- } break;
-
case CYIdentifierLexical: {
if (!damaged_) {
CYIdentifier *replace(context.Unique());
return $S(value, size);
}
+CYIdentifier *CYString::Identifier() const {
+ if (const char *word = Word())
+ return $ CYIdentifier(word);
+ return NULL;
+}
+
CYNumber *CYString::Number(CYContext &context) {
// XXX: there is a precise algorithm for this
return NULL;
CYList<CYElementValue> names;
CYForEach (field, fields_) {
- CYTypedIdentifier *typed(field->typed_);
- types->*$ CYElementValue(typed->Replace(context));
+ types->*$ CYElementValue(field->type_->Replace(context));
CYExpression *name;
- if (typed->identifier_ == NULL)
+ if (field->name_ == NULL)
name = NULL;
else
- name = $S(typed->identifier_->Word());
+ name = field->name_->PropertyName(context);
names->*$ CYElementValue(name);
}
return $C2($M($M($M($V("String"), $S("prototype")), $S("concat")), $S("apply")), $S(""), $ CYArray($ CYElementValue(string_, spans_->Replace(context))));
}
+CYString *CYTemplate::String(CYContext &context) {
+ // XXX: implement this over local concat
+ if (spans_ != NULL)
+ return NULL;
+ return string_;
+}
+
CYTarget *CYThis::Replace(CYContext &context) {
if (context.this_ != NULL)
return $V(context.this_->Identifier(context));
}
CYStatement *CYTypeDefinition::Replace(CYContext &context) {
- CYIdentifier *identifier(typed_->identifier_);
- typed_->identifier_ = NULL;
- return $ CYLexical(false, $B1($B(identifier, $ CYTypeExpression(typed_))));
+ return $ CYLexical(false, $B1($B(name_, $ CYTypeExpression(type_))));
}
CYTarget *CYTypeEnum::Replace(CYContext &context) {
return typed_->Replace(context);
}
+CYTarget *CYTypeFloating::Replace(CYContext &context) {
+ switch (length_) {
+ case 0: return $V("float");
+ case 1: return $V("double");
+ case 2: return $V("longdouble");
+ default: _assert(false);
+ }
+}
+
CYTarget *CYTypeInt128::Replace(CYContext &context) {
return $V(signing_ == CYTypeUnsigned ? "uint128" : "int128");
}
}
CYTarget *CYTypeReference::Replace(CYContext &context) {
- const char *suffix;
+ const char *prefix;
switch (kind_) {
- case CYTypeReferenceStruct: suffix = "$cys"; break;
- case CYTypeReferenceEnum: suffix = "$cye"; break;
+ case CYTypeReferenceStruct: prefix = "$cys"; break;
+ case CYTypeReferenceEnum: prefix = "$cye"; break;
default: _assert(false);
}
- return $V($pool.strcat(name_->Word(), suffix, NULL));
+ return $V($pool.strcat(prefix, name_->Word(), NULL));
}
CYTarget *CYTypeStruct::Replace(CYContext &context) {
return next_->Replace(context, $ CYCall($ CYDirectMember(type, $ CYString("volatile"))));
}
-CYTarget *CYTypedIdentifier::Replace(CYContext &context) {
+CYTarget *CYType::Replace(CYContext &context) {
return modifier_->Replace(context, specifier_->Replace(context));
}
-CYTypeFunctionWith *CYTypedIdentifier::Function() {
+CYTypeFunctionWith *CYType::Function() {
CYTypeModifier *&modifier(CYGetLast(modifier_));
if (modifier == NULL)
return NULL;
}
CYArgument *CYTypedParameter::Argument(CYContext &context) { $T(NULL)
- return $ CYArgument(typed_->Replace(context), next_->Argument(context));
+ return $ CYArgument(type_->Replace(context), next_->Argument(context));
}
CYFunctionParameter *CYTypedParameter::Parameters(CYContext &context) { $T(NULL)
- return $ CYFunctionParameter($ CYBinding(typed_->identifier_ ?: context.Unique()), next_->Parameters(context));
+ return $ CYFunctionParameter($ CYBinding(name_ ?: context.Unique()), next_->Parameters(context));
}
CYExpression *CYTypedParameter::TypeSignature(CYContext &context, CYExpression *prefix) { $T(prefix)
- return next_->TypeSignature(context, $ CYAdd(prefix, typed_->Replace(context)));
+ return next_->TypeSignature(context, $ CYAdd(prefix, type_->Replace(context)));
}
CYForInitializer *CYVar::Replace(CYContext &context) {