File tree Expand file tree Collapse file tree 3 files changed +36
-6
lines changed Expand file tree Collapse file tree 3 files changed +36
-6
lines changed Original file line number Diff line number Diff line change @@ -188,7 +188,10 @@ pub fn define_pushable(_: TokenStream) -> TokenStream {
188
188
}
189
189
impl NotU8Pushable for :: bitcoin:: ScriptBuf {
190
190
fn bitcoin_script_push( self , builder: Builder ) -> Builder {
191
- Builder :: from( [ builder. into_bytes( ) , self . into_bytes( ) ] . concat( ) )
191
+ let mut script_vec = vec![ ] ;
192
+ script_vec. extend_from_slice( builder. as_bytes( ) ) ;
193
+ script_vec. extend_from_slice( self . as_bytes( ) ) ;
194
+ Builder :: from( script_vec)
192
195
}
193
196
}
194
197
impl <T : NotU8Pushable > NotU8Pushable for Vec <T > {
Original file line number Diff line number Diff line change @@ -152,11 +152,11 @@ where
152
152
let inner_block = block. stream ( ) ;
153
153
escape. extend ( quote ! {
154
154
{
155
- script_var. push ( script !{
155
+ script_var. extend_from_slice ( script !{
156
156
#inner_block
157
- } ) ;
157
+ } . as_bytes ( ) ) ;
158
158
}
159
- script_var
159
+ bitcoin :: script :: ScriptBuf :: from ( script_var)
160
160
} ) ;
161
161
break ;
162
162
}
Original file line number Diff line number Diff line change 1
1
#![ feature( proc_macro_hygiene) ]
2
2
3
- use bitcoin:: ScriptBuf ;
3
+ use bitcoin:: { opcodes :: all :: OP_ADD , ScriptBuf } ;
4
4
use bitcoin_script:: { define_pushable, script} ;
5
5
6
6
#[ test]
@@ -129,7 +129,7 @@ fn test_if() {
129
129
} else {
130
130
OP_4
131
131
}
132
-
132
+
133
133
if true {
134
134
OP_5
135
135
} else if false {
@@ -141,3 +141,30 @@ fn test_if() {
141
141
142
142
assert_eq ! ( script. to_bytes( ) , vec![ 83 , 85 ] ) ;
143
143
}
144
+
145
+ #[ test]
146
+ fn test_performance ( ) {
147
+ define_pushable ! { } ;
148
+ let loop_script = script ! {
149
+ OP_ADD
150
+ } ;
151
+
152
+ let script = script ! {
153
+ for _ in 0 ..20_000 {
154
+ { loop_script. clone( ) }
155
+ }
156
+ } ;
157
+
158
+ assert_eq ! ( script. as_bytes( ) [ 0 ] , 147 )
159
+ }
160
+
161
+ #[ test]
162
+ fn test_performance_no_macro ( ) {
163
+ let mut builder = bitcoin:: script:: Builder :: new ( ) ;
164
+ for _ in 0 ..20_000 {
165
+ builder = builder. push_opcode ( OP_ADD ) ;
166
+ }
167
+
168
+ let script = builder. as_script ( ) ;
169
+ assert_eq ! ( script. as_bytes( ) [ 0 ] , 147 ) ;
170
+ }
You can’t perform that action at this time.
0 commit comments