serpent 0.2.0 → 0.2.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile.lock +1 -1
- data/ext/serpent/serpent_ffi.cpp +29 -0
- data/lib/serpent.rb +9 -24
- data/lib/serpent/caller.rb +21 -3
- data/lib/serpent/version.rb +1 -1
- data/test/serpent_test.rb +17 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a7e97b6b271ee3c9ca4451ace9e8bb1115c9d716
|
4
|
+
data.tar.gz: 8de2a46ee639fd1476d86b8d4beaaf96bc25edc9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5724e2ba8c64c10c43dda924f0927108855633083e09a26097ee89c0c134eaa413670f5efbd5eb6d614d354ca322884e8d7f3716acc85390150534c70cd343c9
|
7
|
+
data.tar.gz: 93f6688b63c71d22a8717a0c6bd10a24dddad0a61dc24c22a1180c1eeac730590872a8165548c17e86775b74df54d13f64d37995508c22170227dc21bc412408
|
data/Gemfile.lock
CHANGED
data/ext/serpent/serpent_ffi.cpp
CHANGED
@@ -2,6 +2,7 @@
|
|
2
2
|
#include "rice/Array.hpp"
|
3
3
|
using namespace Rice;
|
4
4
|
|
5
|
+
#include "libserpent/util.h"
|
5
6
|
#include "libserpent/parser.h"
|
6
7
|
#include "libserpent/funcs.h"
|
7
8
|
|
@@ -23,6 +24,28 @@ Array serialize_node(Node n) {
|
|
23
24
|
return a;
|
24
25
|
}
|
25
26
|
|
27
|
+
Metadata deserialize_metadata(Array o) {
|
28
|
+
return Metadata(from_ruby<std::string>(o[0]),
|
29
|
+
from_ruby<int>(o[1]),
|
30
|
+
from_ruby<int>(o[2]));
|
31
|
+
}
|
32
|
+
|
33
|
+
Node deserialize_node(Array o) {
|
34
|
+
Node n;
|
35
|
+
|
36
|
+
n.type = from_ruby<int>(o[0]) ? ASTNODE : TOKEN;
|
37
|
+
n.val = from_ruby<std::string>(o[1]);
|
38
|
+
n.metadata = deserialize_metadata(from_ruby<Array>(o[2]));
|
39
|
+
|
40
|
+
std::vector<Node> args;
|
41
|
+
for(unsigned i = 3; i < o.size(); i++) {
|
42
|
+
args.push_back(deserialize_node(from_ruby<Array>(o[i])));
|
43
|
+
}
|
44
|
+
n.args = args;
|
45
|
+
|
46
|
+
return n;
|
47
|
+
}
|
48
|
+
|
26
49
|
/*
|
27
50
|
* Serpent functions
|
28
51
|
*/
|
@@ -43,6 +66,11 @@ Array serpent_parse_lll(Object self, std::string code) {
|
|
43
66
|
return serialize_node(parseLLL(code));
|
44
67
|
}
|
45
68
|
|
69
|
+
std::string serpent_compile_lll(Object self, Array o) {
|
70
|
+
Node n = deserialize_node(o);
|
71
|
+
return compileLLL(n);
|
72
|
+
}
|
73
|
+
|
46
74
|
std::string serpent_mk_signature(Object self, std::string input) {
|
47
75
|
return mkSignature(input);
|
48
76
|
}
|
@@ -67,6 +95,7 @@ void Init_serpent_ffi() {
|
|
67
95
|
.define_module_function("compile", &serpent_compile)
|
68
96
|
.define_module_function("compile_to_lll", &serpent_compile_to_lll)
|
69
97
|
.define_module_function("parse_lll", &serpent_parse_lll)
|
98
|
+
.define_module_function("compile_lll", &serpent_compile_lll)
|
70
99
|
.define_module_function("mk_signature", &serpent_mk_signature)
|
71
100
|
.define_module_function("mk_full_signature", &serpent_mk_full_signature)
|
72
101
|
.define_module_function("mk_contract_info", &serpent_mk_contract_info)
|
data/lib/serpent.rb
CHANGED
@@ -9,30 +9,15 @@ require 'serpent/caller'
|
|
9
9
|
|
10
10
|
module Serpent
|
11
11
|
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
def get_prefix(signature)
|
23
|
-
FFI.get_prefix signature
|
24
|
-
end
|
25
|
-
|
26
|
-
def mk_signature(s)
|
27
|
-
JSON.parse FFI.mk_signature(s)
|
28
|
-
end
|
29
|
-
|
30
|
-
def mk_full_signature(s)
|
31
|
-
JSON.parse FFI.mk_full_signature(s)
|
32
|
-
end
|
33
|
-
|
34
|
-
def mk_contract_info(s)
|
35
|
-
JSON.parse FFI.mk_contract_info(s)
|
12
|
+
class <<self
|
13
|
+
def method_missing(name, *args)
|
14
|
+
caller = Caller.new
|
15
|
+
if caller.respond_to?(name)
|
16
|
+
caller.send name, *args
|
17
|
+
else
|
18
|
+
super
|
19
|
+
end
|
20
|
+
end
|
36
21
|
end
|
37
22
|
|
38
23
|
end
|
data/lib/serpent/caller.rb
CHANGED
@@ -3,6 +3,8 @@
|
|
3
3
|
module Serpent
|
4
4
|
class Caller
|
5
5
|
|
6
|
+
N = 2**32
|
7
|
+
|
6
8
|
def compile(code, **kwargs)
|
7
9
|
FFI.compile pre_transform(code, kwargs)
|
8
10
|
end
|
@@ -11,13 +13,29 @@ module Serpent
|
|
11
13
|
Node.build FFI.compile_to_lll(pre_transform(code, kwargs))
|
12
14
|
end
|
13
15
|
|
14
|
-
def
|
15
|
-
FFI.
|
16
|
+
def compile_lll(code)
|
17
|
+
FFI.compile_lll ast(code)
|
18
|
+
end
|
19
|
+
|
20
|
+
def get_prefix(signature)
|
21
|
+
FFI.get_prefix(signature) % N
|
22
|
+
end
|
23
|
+
|
24
|
+
def mk_signature(code, **kwargs)
|
25
|
+
JSON.parse FFI.mk_signature(pre_transform(code, kwargs))
|
26
|
+
end
|
27
|
+
|
28
|
+
def mk_full_signature(code, **kwargs)
|
29
|
+
JSON.parse FFI.mk_full_signature(pre_transform(code, kwargs))
|
30
|
+
end
|
31
|
+
|
32
|
+
def mk_contract_info(code, **kwargs)
|
33
|
+
JSON.parse FFI.mk_contract_info(pre_transform(code, kwargs))
|
16
34
|
end
|
17
35
|
|
18
36
|
private
|
19
37
|
|
20
|
-
def
|
38
|
+
def ast(x)
|
21
39
|
x.instance_of?(String) ? FFI.parse_lll(x) : x.out
|
22
40
|
end
|
23
41
|
|
data/lib/serpent/version.rb
CHANGED
data/test/serpent_test.rb
CHANGED
@@ -11,6 +11,19 @@ def main(a,b):
|
|
11
11
|
return(a ^ b)
|
12
12
|
EOF
|
13
13
|
|
14
|
+
LLL_CODE = <<EOF
|
15
|
+
(with 'x 10
|
16
|
+
(with 'y 20
|
17
|
+
(with 'z 30
|
18
|
+
(seq
|
19
|
+
(set 'a (add (mul (get 'y) (get 'z)) (get 'x)))
|
20
|
+
(return (ref 'a) 32)
|
21
|
+
)
|
22
|
+
)
|
23
|
+
)
|
24
|
+
)
|
25
|
+
EOF
|
26
|
+
|
14
27
|
def test_compile
|
15
28
|
assert_equal decode_hex('604a80600b6000396055567c0100000000000000000000000000000000000000000000000000000000600035046397d857aa8114156048576004356040526024356060526060516040510a60805260206080f35b505b6000f3'), Serpent.compile(CODE, foo: 1)
|
16
29
|
end
|
@@ -19,6 +32,10 @@ EOF
|
|
19
32
|
assert_match /^\(return 0 \n/, Serpent.compile_to_lll(CODE).to_s
|
20
33
|
end
|
21
34
|
|
35
|
+
def test_compile_lll
|
36
|
+
assert_equal "`\n`\x14`\x1e\x82\x81\x83\x02\x01` R` ` \xf3PPP", Serpent.compile_lll(LLL_CODE)
|
37
|
+
end
|
38
|
+
|
22
39
|
def test_parse_lll
|
23
40
|
assert_equal [0, 'def', ['main', 0, 0]], Serpent::FFI.parse_lll(CODE)
|
24
41
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: serpent
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jan Xie
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-03-
|
11
|
+
date: 2016-03-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -123,7 +123,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
123
123
|
version: '0'
|
124
124
|
requirements: []
|
125
125
|
rubyforge_project:
|
126
|
-
rubygems_version: 2.5.1
|
126
|
+
rubygems_version: 2.4.5.1
|
127
127
|
signing_key:
|
128
128
|
specification_version: 4
|
129
129
|
summary: Ruby binding to Ethereum Serpent compiler.
|