]>
git.saurik.com Git - cycript.git/blob - Decode.cpp
1 /* Cycript - Optimizing JavaScript Compiler/Runtime
2 * Copyright (C) 2009-2015 Jay Freeman (saurik)
5 /* GNU Affero General Public License, Version 3 {{{ */
7 * This program is free software: you can redistribute it and/or modify
8 * it under the terms of the GNU Affero General Public License as published by
9 * the Free Software Foundation, either version 3 of the License, or
10 * (at your option) any later version.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU Affero General Public License for more details.
17 * You should have received a copy of the GNU Affero General Public License
18 * along with this program. If not, see <http://www.gnu.org/licenses/>.
25 #include "Replace.hpp"
30 CYTypedIdentifier
*Primitive
<bool>::Decode(CYPool
&pool
) const {
31 return $
CYTypedIdentifier($
CYTypeVariable("bool"));
35 CYTypedIdentifier
*Primitive
<char>::Decode(CYPool
&pool
) const {
36 return $
CYTypedIdentifier($
CYTypeCharacter(CYTypeNeutral
));
40 CYTypedIdentifier
*Primitive
<double>::Decode(CYPool
&pool
) const {
41 return $
CYTypedIdentifier($
CYTypeVariable("double"));
45 CYTypedIdentifier
*Primitive
<float>::Decode(CYPool
&pool
) const {
46 return $
CYTypedIdentifier($
CYTypeVariable("float"));
50 CYTypedIdentifier
*Primitive
<signed char>::Decode(CYPool
&pool
) const {
51 return $
CYTypedIdentifier($
CYTypeCharacter(CYTypeSigned
));
55 CYTypedIdentifier
*Primitive
<signed int>::Decode(CYPool
&pool
) const {
56 return $
CYTypedIdentifier($
CYTypeIntegral(CYTypeSigned
, 1));
60 CYTypedIdentifier
*Primitive
<signed long int>::Decode(CYPool
&pool
) const {
61 return $
CYTypedIdentifier($
CYTypeIntegral(CYTypeSigned
, 2));
65 CYTypedIdentifier
*Primitive
<signed long long int>::Decode(CYPool
&pool
) const {
66 return $
CYTypedIdentifier($
CYTypeIntegral(CYTypeSigned
, 3));
70 CYTypedIdentifier
*Primitive
<signed short int>::Decode(CYPool
&pool
) const {
71 return $
CYTypedIdentifier($
CYTypeIntegral(CYTypeSigned
, 0));
75 CYTypedIdentifier
*Primitive
<unsigned char>::Decode(CYPool
&pool
) const {
76 return $
CYTypedIdentifier($
CYTypeCharacter(CYTypeUnsigned
));
80 CYTypedIdentifier
*Primitive
<unsigned int>::Decode(CYPool
&pool
) const {
81 return $
CYTypedIdentifier($
CYTypeIntegral(CYTypeUnsigned
, 1));
85 CYTypedIdentifier
*Primitive
<unsigned long int>::Decode(CYPool
&pool
) const {
86 return $
CYTypedIdentifier($
CYTypeIntegral(CYTypeUnsigned
, 2));
90 CYTypedIdentifier
*Primitive
<unsigned long long int>::Decode(CYPool
&pool
) const {
91 return $
CYTypedIdentifier($
CYTypeIntegral(CYTypeUnsigned
, 3));
95 CYTypedIdentifier
*Primitive
<unsigned short int>::Decode(CYPool
&pool
) const {
96 return $
CYTypedIdentifier($
CYTypeIntegral(CYTypeUnsigned
, 0));
99 CYTypedIdentifier
*Void::Decode(CYPool
&pool
) const {
100 return $
CYTypedIdentifier($
CYTypeVoid());
103 CYTypedIdentifier
*Unknown::Decode(CYPool
&pool
) const {
104 return $
CYTypedIdentifier($
CYTypeError());
107 CYTypedIdentifier
*String::Decode(CYPool
&pool
) const {
108 return $
CYTypedIdentifier($
CYTypeCharacter(CYTypeNeutral
), $
CYTypePointerTo());
111 CYTypedIdentifier
*Meta::Decode(CYPool
&pool
) const {
112 return $
CYTypedIdentifier($
CYTypeVariable("Class"));
115 CYTypedIdentifier
*Selector::Decode(CYPool
&pool
) const {
116 return $
CYTypedIdentifier($
CYTypeVariable("SEL"));
119 CYTypedIdentifier
*Bits::Decode(CYPool
&pool
) const {
123 CYTypedIdentifier
*Pointer::Decode(CYPool
&pool
) const {
124 return CYDecodeType(pool
, &type
)->Modify($
CYTypePointerTo());
127 CYTypedIdentifier
*Array::Decode(CYPool
&pool
) const {
128 return CYDecodeType(pool
, &type
)->Modify($
CYTypeArrayOf($
D(size
)));
131 CYTypedIdentifier
*Object::Decode(CYPool
&pool
) const {
133 return $
CYTypedIdentifier($
CYTypeVariable("id"));
135 return $
CYTypedIdentifier($
CYTypeVariable(name
), $
CYTypePointerTo());
138 CYTypedIdentifier
*Aggregate::Decode(CYPool
&pool
) const {
141 CYTypeStructField
*fields(NULL
);
142 for (size_t i(signature
.count
); i
!= 0; --i
) {
143 sig::Element
&element(signature
.elements
[i
- 1]);
144 CYTypedIdentifier
*typed(CYDecodeType(pool
, element
.type
));
145 if (element
.name
!= NULL
)
146 typed
->identifier_
= $
I(element
.name
);
147 fields
= $
CYTypeStructField(typed
, fields
);
149 CYIdentifier
*identifier(name
== NULL
? NULL
: $
I(name
));
150 return $
CYTypedIdentifier($
CYTypeStruct(identifier
, $
CYStructTail(fields
)));
153 CYTypedIdentifier
*Function::Decode(CYPool
&pool
) const {
154 _assert(signature
.count
!= 0);
155 CYTypedParameter
*parameter(NULL
);
156 for (size_t i(signature
.count
- 1); i
!= 0; --i
)
157 parameter
= $
CYTypedParameter(CYDecodeType(pool
, signature
.elements
[i
].type
), parameter
);
158 return CYDecodeType(pool
, signature
.elements
[0].type
)->Modify($
CYTypeFunctionWith(parameter
));
161 CYTypedIdentifier
*Block::Decode(CYPool
&pool
) const {
162 if (signature
.count
== 0)
163 return $
CYTypedIdentifier($
CYTypeVariable("NSBlock"), $
CYTypePointerTo());
165 _assert(signature
.count
!= 1);
166 _assert(dynamic_cast<Object
*>(signature
.elements
[1].type
) != NULL
);
168 CYTypedParameter
*parameter(NULL
);
169 for (size_t i(signature
.count
- 1); i
!= 0; --i
)
170 parameter
= $
CYTypedParameter(CYDecodeType(pool
, signature
.elements
[i
].type
), parameter
);
171 return CYDecodeType(pool
, signature
.elements
[0].type
)->Modify($
CYTypeBlockWith(parameter
));
177 CYTypedIdentifier
*CYDecodeType(CYPool
&pool
, struct sig::Type
*type
) {
178 CYTypedIdentifier
*typed(type
->Decode(pool
));
179 if ((type
->flags
& JOC_TYPE_CONST
) != 0) {
180 if (dynamic_cast<sig::String
*>(type
) != NULL
)
181 typed
->modifier_
= $
CYTypeConstant(typed
->modifier_
);
183 typed
= typed
->Modify($
CYTypeConstant());