]>
git.saurik.com Git - cycript.git/blob - sig/copy.cpp
1 /* Cycript - The Truly Universal Scripting Language
2 * Copyright (C) 2009-2016 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/>.
26 #include "Pooling.hpp"
27 #include "sig/parse.hpp"
31 void Copy(CYPool
&pool
, Element
&lhs
, const Element
&rhs
) {
32 lhs
.name
= pool
.strdup(rhs
.name
);
36 lhs
.type
= rhs
.type
->Copy(pool
);
37 lhs
.offset
= rhs
.offset
;
40 void Copy(CYPool
&pool
, Signature
&lhs
, const Signature
&rhs
) {
41 size_t count(rhs
.count
);
43 lhs
.elements
= new(pool
) Element
[count
];
44 for (size_t index(0); index
!= count
; ++index
)
45 Copy(pool
, lhs
.elements
[index
], rhs
.elements
[index
]);
48 Void
*Void::Copy(CYPool
&pool
, const char *rename
) const {
49 return new(pool
) Void();
52 Unknown
*Unknown::Copy(CYPool
&pool
, const char *rename
) const {
53 return new(pool
) Unknown();
56 String
*String::Copy(CYPool
&pool
, const char *rename
) const {
57 return new(pool
) String();
61 Meta
*Meta::Copy(CYPool
&pool
, const char *rename
) const {
62 return new(pool
) Meta();
65 Selector
*Selector::Copy(CYPool
&pool
, const char *rename
) const {
66 return new(pool
) Selector();
70 Bits
*Bits::Copy(CYPool
&pool
, const char *rename
) const {
71 return new(pool
) Bits(size
);
74 Pointer
*Pointer::Copy(CYPool
&pool
, const char *rename
) const {
75 return new(pool
) Pointer(*type
.Copy(pool
));
78 Array
*Array::Copy(CYPool
&pool
, const char *rename
) const {
79 return new(pool
) Array(*type
.Copy(pool
), size
);
83 Object
*Object::Copy(CYPool
&pool
, const char *rename
) const {
84 return new(pool
) Object(pool
.strdup(name
));
88 Aggregate
*Aggregate::Copy(CYPool
&pool
, const char *rename
) const {
90 rename
= pool
.strdup(name
);
91 else if (rename
[0] == '\0')
93 Aggregate
*copy(new(pool
) Aggregate(overlap
, rename
));
94 sig::Copy(pool
, copy
->signature
, signature
);
98 Function
*Function::Copy(CYPool
&pool
, const char *rename
) const {
99 Function
*copy(new(pool
) Function(variadic
));
100 sig::Copy(pool
, copy
->signature
, signature
);
105 Block
*Block::Copy(CYPool
&pool
, const char *rename
) const {
106 Block
*copy(new(pool
) Block());
107 sig::Copy(pool
, copy
->signature
, signature
);
112 void Copy(CYPool
&pool
, ffi_type
&lhs
, ffi_type
&rhs
) {
114 lhs
.alignment
= rhs
.alignment
;
116 if (rhs
.elements
== NULL
)
120 while (rhs
.elements
[count
] != NULL
)
123 lhs
.elements
= new(pool
) ffi_type
*[count
+ 1];
124 lhs
.elements
[count
] = NULL
;
126 for (size_t index(0); index
!= count
; ++index
) {
127 // XXX: if these are libffi native then you can just take them
128 ffi_type
*ffi(new(pool
) ffi_type
);
129 lhs
.elements
[index
] = ffi
;
130 sig::Copy(pool
, *ffi
, *rhs
.elements
[index
]);
135 const char *Type::GetName() const {
139 const char *Aggregate::GetName() const {