-/* 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 {{{ */
**/
/* }}} */
+#include <sstream>
+
#include "Replace.hpp"
-#include "ObjectiveC/Syntax.hpp"
-#include <sstream>
+#include "ObjectiveC/Syntax.hpp"
-static CYExpression *MessageType(CYContext &context, CYTypedIdentifier *type, CYMessageParameter *next, CYExpression *extra = NULL) {
+static CYExpression *MessageType(CYContext &context, CYType *type, CYMessageParameter *next, CYExpression *extra = NULL) {
CYExpression *left($C0($M(type->Replace(context), $S("toString"))));
if (extra != NULL)
left = $ CYAdd(left, extra);
CYStatement *CYCategory::Replace(CYContext &context) {
CYVariable *cyc($V("$cyc")), *cys($V("$cys"));
- return $E($C1($F(NULL, $P6($L("$cys"), $L("$cyp"), $L("$cyc"), $L("$cyn"), $L("$cyt"), $L("$cym")), $$->*
+ return $E($C1($F(NULL, $P6($B($I("$cys")), $B($I("$cyp")), $B($I("$cyc")), $B($I("$cyn")), $B($I("$cyt")), $B($I("$cym"))), $$->*
$E($ CYAssign($V("$cyp"), $C1($V("object_getClass"), cys)))->*
$E($ CYAssign(cyc, cys))->*
$E($ CYAssign($V("$cym"), $C1($V("object_getClass"), cyc)))->*
messages_->Replace(context, true)
- ), name_->ClassName(context, true)));
+ ), $C1($V("objc_getClass"), $S(name_))));
}
-CYExpression *CYClass::Replace_(CYContext &context) {
+CYStatement *CYImplementation::Replace(CYContext &context) {
CYVariable *cyc($V("$cyc")), *cys($V("$cys"));
- CYExpression *name(name_ != NULL ? name_->ClassName(context, false) : $C1($V("$cyq"), $S("CY$")));
-
- return $C1($F(NULL, $P6($L("$cys"), $L("$cyp"), $L("$cyc"), $L("$cyn"), $L("$cyt"), $L("$cym")), $$->*
+ return $E($C1($F(NULL, $P6($B($I("$cys")), $B($I("$cyp")), $B($I("$cyc")), $B($I("$cyn")), $B($I("$cyt")), $B($I("$cym"))), $$->*
$E($ CYAssign($V("$cyp"), $C1($V("object_getClass"), cys)))->*
- $E($ CYAssign(cyc, $C3($V("objc_allocateClassPair"), cys, name, $D(0))))->*
+ $E($ CYAssign(cyc, $C3($V("objc_allocateClassPair"), cys, $S(name_), $D(0))))->*
$E($ CYAssign($V("$cym"), $C1($V("object_getClass"), cyc)))->*
protocols_->Replace(context)->*
fields_->Replace(context)->*
messages_->Replace(context, false)->*
$E($C1($V("objc_registerClassPair"), cyc))->*
$ CYReturn(cyc)
- ), super_ == NULL ? $ CYNull() : super_);
-}
-
-CYExpression *CYClassExpression::Replace(CYContext &context) {
- return Replace_(context);
+ ), extends_ == NULL ? $ CYNull() : extends_));
}
-CYStatement *CYClassStatement::Replace(CYContext &context) {
- return $E(Replace_(context));
-}
-
-CYStatement *CYField::Replace(CYContext &context) const { $T(NULL)
+CYStatement *CYImplementationField::Replace(CYContext &context) const { $T(NULL)
CYVariable *cyn($V("$cyn"));
CYVariable *cyt($V("$cyt"));
- CYExpression *type($C0($M(typed_->Replace(context), $S("toString"))));
+ CYExpression *type($C0($M(type_->Replace(context), $S("toString"))));
return $ CYBlock($$->*
$E($ CYAssign(cyt, type))->*
$E($ CYAssign(cyn, $N1($V("Type"), cyt)))->*
- $E($C5($V("class_addIvar"), $V("$cyc"), $S(typed_->identifier_->Word()), $M(cyn, $S("size")), $M(cyn, $S("alignment")), cyt))->*
+ $E($C5($V("class_addIvar"), $V("$cyc"), name_->PropertyName(context), $M(cyn, $S("size")), $M(cyn, $S("alignment")), cyt))->*
next_->Replace(context)
);
}
-CYExpression *CYInstanceLiteral::Replace(CYContext &context) {
+CYTarget *CYInstanceLiteral::Replace(CYContext &context) {
return $N1($V("Instance"), number_);
}
$E($C4($V(replace ? "class_replaceMethod" : "class_addMethod"),
$V(instance_ ? "$cyc" : "$cym"),
cyn,
- $N2($V("Functor"), $F(NULL, $P2($L("self"), $L("_cmd"), parameters_->Parameters(context)), $$->*
- $ CYVar($L1($L("$cyr", $N2($V("objc_super"), self, _class))))->*
- $ CYReturn($C1($M($F(NULL, NULL, code_), $S("call")), self))
+ $N2($V("Functor"), $F(NULL, $P2($B($I("self")), $B($I("_cmd")), parameters_->Parameters(context)), $$->*
+ $ CYVar($B1($B($I("$cyr"), $N2($V("objc_super"), self, _class))))->*
+ $ CYReturn($C1($M($F(NULL, NULL, code_.code_), $S("call")), self))
), cyt),
cyt
))
CYFunctionParameter *CYMessageParameter::Parameters(CYContext &context) const { $T(NULL)
CYFunctionParameter *next(next_->Parameters(context));
- return type_ == NULL ? next : $ CYFunctionParameter($ CYDeclaration(type_->identifier_), next);
+ return type_ == NULL ? next : $ CYFunctionParameter($B(identifier_), next);
}
CYSelector *CYMessageParameter::Selector(CYContext &context) const {
CYSelectorPart *CYMessageParameter::SelectorPart(CYContext &context) const { $T(NULL)
CYSelectorPart *next(next_->SelectorPart(context));
- return tag_ == NULL ? next : $ CYSelectorPart(tag_, type_ != NULL, next);
+ return name_ == NULL ? next : $ CYSelectorPart(name_, type_ != NULL, next);
}
CYExpression *CYMessageParameter::TypeSignature(CYContext &context) const {
return MessageType(context, type_, next_);
}
-CYExpression *CYBox::Replace(CYContext &context) {
+CYTarget *CYBox::Replace(CYContext &context) {
return $C1($M($V("Instance"), $S("box")), value_);
}
-CYExpression *CYObjCBlock::Replace(CYContext &context) {
- return $C1($ CYEncodedType(($ CYTypedIdentifier(*typed_))->Modify($ CYTypeBlockWith(parameters_))), $ CYFunctionExpression(NULL, parameters_->Parameters(context), statements_));
+CYTarget *CYObjCArray::Replace(CYContext &context) {
+ size_t count(0);
+ CYForEach (element, elements_)
+ ++count;
+ return $ CYSendDirect($V("NSArray"), $C_($ CYWord("arrayWithObjects"), $ CYArray(elements_), $C_($ CYWord("count"), $D(count))));
+}
+
+CYTarget *CYObjCDictionary::Replace(CYContext &context) {
+ CYList<CYElement> keys;
+ CYList<CYElement> values;
+ size_t count(0);
+
+ CYForEach (pair, pairs_) {
+ keys->*$ CYElementValue(pair->key_);
+ values->*$ CYElementValue(pair->value_);
+ ++count;
+ }
+
+ return $ CYSendDirect($V("NSDictionary"), $C_($ CYWord("dictionaryWithObjects"), $ CYArray(values), $C_($ CYWord("forKeys"), $ CYArray(keys), $C_($ CYWord("count"), $D(count)))));
+}
+
+CYTarget *CYObjCBlock::Replace(CYContext &context) {
+ // XXX: wtf is happening here?
+ return $C1($ CYTypeExpression(($ CYType(*typed_))->Modify($ CYTypeBlockWith(parameters_))), $ CYFunctionExpression(NULL, parameters_->Parameters(context), code_));
}
CYStatement *CYProtocol::Replace(CYContext &context) const { $T(NULL)
);
}
-CYExpression *CYSelector::Replace(CYContext &context) {
- return $C1($V("sel_registerName"), name_->Replace(context));
+CYTarget *CYSelector::Replace(CYContext &context) {
+ return $C1($V("sel_registerName"), parts_->Replace(context));
}
CYString *CYSelectorPart::Replace(CYContext &context) {
return $S($pool.strdup(str.str().c_str()));
}
-CYExpression *CYSendDirect::Replace(CYContext &context) {
+CYTarget *CYSendDirect::Replace(CYContext &context) {
std::ostringstream name;
CYArgument **argument(&arguments_);
CYSelectorPart *selector(NULL), *current(NULL);
return $C2($V("objc_msgSend"), self_, selector->Replace(context), arguments_);
}
-CYExpression *CYSendSuper::Replace(CYContext &context) {
+CYTarget *CYSendSuper::Replace(CYContext &context) {
return $ CYSendDirect($V("$cyr"), arguments_);
}