]>
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 {
89 Aggregate
*copy(new(pool
) Aggregate(overlap
, rename
?: pool
.strdup(name
)));
90 sig::Copy(pool
, copy
->signature
, signature
);
94 Function
*Function::Copy(CYPool
&pool
, const char *rename
) const {
95 Function
*copy(new(pool
) Function(variadic
));
96 sig::Copy(pool
, copy
->signature
, signature
);
101 Block
*Block::Copy(CYPool
&pool
, const char *rename
) const {
102 Block
*copy(new(pool
) Block());
103 sig::Copy(pool
, copy
->signature
, signature
);
108 void Copy(CYPool
&pool
, ffi_type
&lhs
, ffi_type
&rhs
) {
110 lhs
.alignment
= rhs
.alignment
;
112 if (rhs
.elements
== NULL
)
116 while (rhs
.elements
[count
] != NULL
)
119 lhs
.elements
= new(pool
) ffi_type
*[count
+ 1];
120 lhs
.elements
[count
] = NULL
;
122 for (size_t index(0); index
!= count
; ++index
) {
123 // XXX: if these are libffi native then you can just take them
124 ffi_type
*ffi(new(pool
) ffi_type
);
125 lhs
.elements
[index
] = ffi
;
126 sig::Copy(pool
, *ffi
, *rhs
.elements
[index
]);
131 const char *Type::GetName() const {
135 const char *Aggregate::GetName() const {