Skip to content

Commit a682420

Browse files
committed
Optimize for loop parsing
1 parent b71d9ff commit a682420

File tree

3 files changed

+36
-6
lines changed

3 files changed

+36
-6
lines changed

src/lib.rs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,10 @@ pub fn define_pushable(_: TokenStream) -> TokenStream {
188188
}
189189
impl NotU8Pushable for ::bitcoin::ScriptBuf {
190190
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)
192195
}
193196
}
194197
impl<T: NotU8Pushable> NotU8Pushable for Vec<T> {

src/parse.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -152,11 +152,11 @@ where
152152
let inner_block = block.stream();
153153
escape.extend(quote! {
154154
{
155-
script_var.push(script !{
155+
script_var.extend_from_slice(script !{
156156
#inner_block
157-
});
157+
}.as_bytes());
158158
}
159-
script_var
159+
bitcoin::script::ScriptBuf::from(script_var)
160160
});
161161
break;
162162
}

tests/test.rs

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
#![feature(proc_macro_hygiene)]
22

3-
use bitcoin::ScriptBuf;
3+
use bitcoin::{opcodes::all::OP_ADD, ScriptBuf};
44
use bitcoin_script::{define_pushable, script};
55

66
#[test]
@@ -129,7 +129,7 @@ fn test_if() {
129129
} else {
130130
OP_4
131131
}
132-
132+
133133
if true {
134134
OP_5
135135
} else if false {
@@ -141,3 +141,30 @@ fn test_if() {
141141

142142
assert_eq!(script.to_bytes(), vec![83, 85]);
143143
}
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+
}

0 commit comments

Comments
 (0)