1 /* Cycript - Inlining/Optimizing JavaScript Compiler
 
   2  * Copyright (C) 2009  Jay Freeman (saurik)
 
   5 /* Modified BSD License {{{ */
 
   7  *        Redistribution and use in source and binary
 
   8  * forms, with or without modification, are permitted
 
   9  * provided that the following conditions are met:
 
  11  * 1. Redistributions of source code must retain the
 
  12  *    above copyright notice, this list of conditions
 
  13  *    and the following disclaimer.
 
  14  * 2. Redistributions in binary form must reproduce the
 
  15  *    above copyright notice, this list of conditions
 
  16  *    and the following disclaimer in the documentation
 
  17  *    and/or other materials provided with the
 
  19  * 3. The name of the author may not be used to endorse
 
  20  *    or promote products derived from this software
 
  21  *    without specific prior written permission.
 
  23  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS''
 
  24  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
 
  25  * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
 
  26  * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 
  27  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE
 
  28  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
 
  29  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
 
  30  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
 
  31  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
 
  32  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
 
  33  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
 
  34  * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
 
  35  * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
 
  36  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 
  40 #include "Replace.hpp"
 
  41 #include "ObjectiveC/Syntax.hpp"
 
  43 #include <Foundation/Foundation.h>
 
  46 void CYCategory::Output(CYOutput &out, CYFlags flags) const {
 
  47     out << "(function($cys,$cyp,$cyc,$cyn,$cyt){";
 
  48     out << "$cyp=object_getClass($cys);";
 
  50     if (messages_ != NULL)
 
  51         messages_->Output(out, true);
 
  53     name_->ClassName(out, true);
 
  58 void CYClass::Output(CYOutput &out, CYFlags flags) const {
 
  59     // XXX: I don't necc. need the ()s
 
  60     out << "(function($cys,$cyp,$cyc,$cyn,$cyt,$cym){";
 
  61     out << "$cyp=object_getClass($cys);";
 
  62     out << "$cyc=objc_allocateClassPair($cys,";
 
  64         name_->ClassName(out, false);
 
  66         out << "$cyq(\"CY$\")";
 
  68     out << "$cym=object_getClass($cyc);";
 
  71     if (messages_ != NULL)
 
  72         messages_->Output(out, false);
 
  73     if (protocols_ != NULL) {
 
  78     out << "objc_registerClassPair($cyc);";
 
  79     out << "return $cyc;";
 
  82         super_->Output(out, CYPA, CYNoFlags);
 
  88 void CYClassExpression::Output(CYOutput &out, CYFlags flags) const {
 
  89     CYClass::Output(out, flags);
 
  92 void CYClassStatement::Output(CYOutput &out, CYFlags flags) const {
 
  93     CYClass::Output(out, flags);
 
  96 void CYField::Output(CYOutput &out) const {
 
  99 void CYImport::Output(CYOutput &out, CYFlags flags) const {
 
 103 void CYMessage::Output(CYOutput &out, bool replace) const {
 
 104     out << (instance_ ? '-' : '+');
 
 106     for (CYMessageParameter *parameter(parameters_); parameter != NULL; parameter = parameter->next_)
 
 107         if (parameter->tag_ != NULL) {
 
 108             out << ' ' << *parameter->tag_;
 
 109             if (parameter->name_ != NULL)
 
 110                 out << ':' << *parameter->name_;
 
 116 void CYProtocol::Output(CYOutput &out) const {
 
 117     name_->Output(out, CYPA, CYNoFlags);
 
 119         out << ',' << ' ' << *next_;
 
 122 void CYSelector::Output(CYOutput &out, CYFlags flags) const {
 
 123     out << "@selector" << '(' << name_ << ')';
 
 126 void CYSelectorPart::Output(CYOutput &out) const {
 
 133 void CYSend::Output(CYOutput &out, CYFlags flags) const {
 
 134     for (CYArgument *argument(arguments_); argument != NULL; argument = argument->next_)
 
 135         if (argument->name_ != NULL) {
 
 136             out << ' ' << *argument->name_;
 
 137             if (argument->value_ != NULL)
 
 138                 out << ':' << *argument->value_;
 
 142 void CYSendDirect::Output(CYOutput &out, CYFlags flags) const {
 
 144     self_->Output(out, CYPA, CYNoFlags);
 
 145     CYSend::Output(out, flags);
 
 149 void CYSendSuper::Output(CYOutput &out, CYFlags flags) const {
 
 150     out << '[' << "super";
 
 151     CYSend::Output(out, flags);