serpent 0.1.0 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +1 -1
- data/Gemfile.lock +1 -1
- data/README.md +3 -0
- data/Rakefile +2 -1
- data/ext/serpent/extconf.rb +2 -1
- data/ext/serpent/serpent_ffi.cpp +74 -0
- data/lib/serpent.rb +31 -13
- data/lib/serpent/caller.rb +39 -0
- data/lib/serpent/node.rb +80 -0
- data/lib/serpent/version.rb +2 -1
- data/test/serpent_test.rb +10 -1
- metadata +6 -4
- data/ext/serpent/serpent.cpp +0 -34
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 811c4565b51dd15e5eeb48a256059514f0c0b533
|
4
|
+
data.tar.gz: c1beae6806e7f1b2b814e25faa7ea844d63db767
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b03d4526f59ee065ea878e6e6e7abfb2d68c90a9e3bdf34e887683247e4d272104375da2b2173749f73aedbcee063e6a650358fd7740237d8dca8d459607d6cd
|
7
|
+
data.tar.gz: c1a76b77781c5ec3fdfc5d978dcc71b47895387250310c80f885ba8d9162fc737899ca5d9eafef82b04c37bf8a2ee44c96e0b3d7c83634fe079ebcfdc929a9d4
|
data/.gitignore
CHANGED
data/Gemfile.lock
CHANGED
data/README.md
CHANGED
data/Rakefile
CHANGED
data/ext/serpent/extconf.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# -*- encoding : ascii-8bit -*-
|
1
2
|
require 'mkmf-rice'
|
2
3
|
|
3
4
|
#include_dir = File.expand_path('../../../include', __FILE__)
|
@@ -7,4 +8,4 @@ require 'mkmf-rice'
|
|
7
8
|
|
8
9
|
abort "missing libserpent.so" unless have_library "serpent"
|
9
10
|
|
10
|
-
create_makefile('serpent/
|
11
|
+
create_makefile('serpent/serpent_ffi')
|
@@ -0,0 +1,74 @@
|
|
1
|
+
#include "rice/Module.hpp"
|
2
|
+
#include "rice/Array.hpp"
|
3
|
+
using namespace Rice;
|
4
|
+
|
5
|
+
#include "libserpent/parser.h"
|
6
|
+
#include "libserpent/funcs.h"
|
7
|
+
|
8
|
+
Array serialize_metadata(Metadata m) {
|
9
|
+
Array a;
|
10
|
+
a.push(m.file);
|
11
|
+
a.push(m.ln);
|
12
|
+
a.push(m.ch);
|
13
|
+
return a;
|
14
|
+
}
|
15
|
+
|
16
|
+
Array serialize_node(Node n) {
|
17
|
+
Array a;
|
18
|
+
a.push(n.type);
|
19
|
+
a.push(n.val);
|
20
|
+
a.push(serialize_metadata(n.metadata));
|
21
|
+
for(unsigned i = 0; i < n.args.size(); i++)
|
22
|
+
a.push(serialize_node(n.args[i]));
|
23
|
+
return a;
|
24
|
+
}
|
25
|
+
|
26
|
+
/*
|
27
|
+
* Serpent functions
|
28
|
+
*/
|
29
|
+
|
30
|
+
std::string serpent_compile(Object self, std::string code) {
|
31
|
+
return compile(code);
|
32
|
+
}
|
33
|
+
|
34
|
+
//std::string serpent_compile_lll(Object self, Node program) {
|
35
|
+
//return compileLLL(program);
|
36
|
+
//}
|
37
|
+
|
38
|
+
Array serpent_compile_to_lll(Object self, std::string code) {
|
39
|
+
return serialize_node(compileToLLL(code));
|
40
|
+
}
|
41
|
+
|
42
|
+
Array serpent_parse_lll(Object self, std::string code) {
|
43
|
+
return serialize_node(parseLLL(code));
|
44
|
+
}
|
45
|
+
|
46
|
+
std::string serpent_mk_signature(Object self, std::string input) {
|
47
|
+
return mkSignature(input);
|
48
|
+
}
|
49
|
+
|
50
|
+
std::string serpent_mk_full_signature(Object self, std::string input) {
|
51
|
+
return mkFullSignature(input);
|
52
|
+
}
|
53
|
+
|
54
|
+
std::string serpent_mk_contract_info(Object self, std::string input) {
|
55
|
+
return mkContractInfoDecl(input);
|
56
|
+
}
|
57
|
+
|
58
|
+
unsigned int serpent_get_prefix(Object self, std::string signature) {
|
59
|
+
return getPrefix(signature);
|
60
|
+
}
|
61
|
+
|
62
|
+
extern "C"
|
63
|
+
void Init_serpent_ffi() {
|
64
|
+
Module rb_mSerpent = define_module("Serpent");
|
65
|
+
|
66
|
+
Module rb_mSerpentFFI = define_module_under(rb_mSerpent, "FFI")
|
67
|
+
.define_module_function("compile", &serpent_compile)
|
68
|
+
.define_module_function("compile_to_lll", &serpent_compile_to_lll)
|
69
|
+
.define_module_function("parse_lll", &serpent_parse_lll)
|
70
|
+
.define_module_function("mk_signature", &serpent_mk_signature)
|
71
|
+
.define_module_function("mk_full_signature", &serpent_mk_full_signature)
|
72
|
+
.define_module_function("mk_contract_info", &serpent_mk_contract_info)
|
73
|
+
.define_module_function("get_prefix", &serpent_get_prefix);
|
74
|
+
}
|
data/lib/serpent.rb
CHANGED
@@ -1,20 +1,38 @@
|
|
1
|
+
# -*- encoding : ascii-8bit -*-
|
2
|
+
|
1
3
|
require 'json'
|
2
4
|
|
3
5
|
require 'serpent/version'
|
4
|
-
require 'serpent/
|
6
|
+
require 'serpent/serpent_ffi'
|
7
|
+
require 'serpent/node'
|
8
|
+
require 'serpent/caller'
|
5
9
|
|
6
10
|
module Serpent
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
11
|
+
|
12
|
+
extend self
|
13
|
+
|
14
|
+
def compile(code, **kwargs)
|
15
|
+
Caller.new.compile code, **kwargs
|
16
|
+
end
|
17
|
+
|
18
|
+
def compile_to_lll(code, **kwargs)
|
19
|
+
Caller.new.compile_to_lll code, **kwargs
|
20
|
+
end
|
21
|
+
|
22
|
+
def get_prefix(signature)
|
23
|
+
FFI.get_prefix signature
|
19
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)
|
36
|
+
end
|
37
|
+
|
20
38
|
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# -*- encoding : ascii-8bit -*-
|
2
|
+
|
3
|
+
module Serpent
|
4
|
+
class Caller
|
5
|
+
|
6
|
+
def compile(code, **kwargs)
|
7
|
+
FFI.compile pre_transform(code, kwargs)
|
8
|
+
end
|
9
|
+
|
10
|
+
def compile_to_lll(code, **kwargs)
|
11
|
+
Node.build FFI.compile_to_lll(pre_transform(code, kwargs))
|
12
|
+
end
|
13
|
+
|
14
|
+
def parse_to_lll(code)
|
15
|
+
FFI.parse_lll(code)
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def take(x)
|
21
|
+
x.instance_of?(String) ? FFI.parse_lll(x) : x.out
|
22
|
+
end
|
23
|
+
|
24
|
+
def pre_transform(code, params)
|
25
|
+
code2 = ''
|
26
|
+
params.each do |k, v|
|
27
|
+
v = %{"#{v}"} if v.instance_of?(String)
|
28
|
+
code2 += "macro $#{k}:\n #{v}\n"
|
29
|
+
end
|
30
|
+
|
31
|
+
if File.exist?(code)
|
32
|
+
code2 + "inset('#{code}')"
|
33
|
+
else
|
34
|
+
code2 + code
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
data/lib/serpent/node.rb
ADDED
@@ -0,0 +1,80 @@
|
|
1
|
+
# -*- encoding : ascii-8bit -*-
|
2
|
+
|
3
|
+
module Serpent
|
4
|
+
module Node
|
5
|
+
|
6
|
+
class Metadata
|
7
|
+
def initialize(ary)
|
8
|
+
@file = ary[0]
|
9
|
+
@ln = ary[1]
|
10
|
+
@ch = ary[2]
|
11
|
+
end
|
12
|
+
|
13
|
+
def out
|
14
|
+
[@file, @ln, @ch]
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
class Token
|
19
|
+
def initialize(val, metadata)
|
20
|
+
@val = val
|
21
|
+
@metadata = metadata
|
22
|
+
end
|
23
|
+
|
24
|
+
def out
|
25
|
+
[0, @val, @metadata.out]
|
26
|
+
end
|
27
|
+
|
28
|
+
def to_s
|
29
|
+
@val.to_s
|
30
|
+
end
|
31
|
+
alias :inspect :to_s
|
32
|
+
end
|
33
|
+
|
34
|
+
class Astnode
|
35
|
+
def initialize(val, args, metadata)
|
36
|
+
@val = val
|
37
|
+
@args = args.map {|arg| Node.build arg }
|
38
|
+
@metadata = Metadata.new(metadata)
|
39
|
+
end
|
40
|
+
|
41
|
+
def out
|
42
|
+
[1, @val, @metadata.out] + @args.map(&:out)
|
43
|
+
end
|
44
|
+
|
45
|
+
def to_s
|
46
|
+
o = "(#{@val}"
|
47
|
+
subs = @args.map(&:to_s)
|
48
|
+
|
49
|
+
k = 0
|
50
|
+
out = " "
|
51
|
+
while k < subs.size && o != "(seq"
|
52
|
+
break if subs[k].include?("\n") || (out + subs[k]).size >= 80
|
53
|
+
out += subs[k] + " "
|
54
|
+
k += 1
|
55
|
+
end
|
56
|
+
|
57
|
+
if k < subs.size
|
58
|
+
o += out + "\n "
|
59
|
+
o += subs[k..-1].join("\n").split("\n").join("\n ")
|
60
|
+
o += "\n)"
|
61
|
+
else
|
62
|
+
o += out[0...-1] + ')'
|
63
|
+
end
|
64
|
+
|
65
|
+
o
|
66
|
+
end
|
67
|
+
alias :inspect :to_s
|
68
|
+
end
|
69
|
+
|
70
|
+
def self.build(ary)
|
71
|
+
if ary[0] == 0
|
72
|
+
Token.new ary[1], ary[2]
|
73
|
+
else
|
74
|
+
args = ary.size > 3 ? ary[3..-1] : []
|
75
|
+
Astnode.new ary[1], args, ary[2]
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
80
|
+
end
|
data/lib/serpent/version.rb
CHANGED
data/test/serpent_test.rb
CHANGED
@@ -1,3 +1,4 @@
|
|
1
|
+
# -*- encoding : ascii-8bit -*-
|
1
2
|
$:.unshift File.expand_path('../../lib', __FILE__)
|
2
3
|
|
3
4
|
require 'minitest/autorun'
|
@@ -11,7 +12,15 @@ def main(a,b):
|
|
11
12
|
EOF
|
12
13
|
|
13
14
|
def test_compile
|
14
|
-
assert_equal decode_hex('604a80600b6000396055567c0100000000000000000000000000000000000000000000000000000000600035046397d857aa8114156048576004356040526024356060526060516040510a60805260206080f35b505b6000f3'), Serpent.compile(CODE)
|
15
|
+
assert_equal decode_hex('604a80600b6000396055567c0100000000000000000000000000000000000000000000000000000000600035046397d857aa8114156048576004356040526024356060526060516040510a60805260206080f35b505b6000f3'), Serpent.compile(CODE, foo: 1)
|
16
|
+
end
|
17
|
+
|
18
|
+
def test_compile_to_lll
|
19
|
+
assert_match /^\(return 0 \n/, Serpent.compile_to_lll(CODE).to_s
|
20
|
+
end
|
21
|
+
|
22
|
+
def test_parse_lll
|
23
|
+
assert_equal [0, 'def', ['main', 0, 0]], Serpent::FFI.parse_lll(CODE)
|
15
24
|
end
|
16
25
|
|
17
26
|
def test_mk_full_signature
|
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.
|
4
|
+
version: 0.2.0
|
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-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rake
|
@@ -96,8 +96,10 @@ files:
|
|
96
96
|
- README.md
|
97
97
|
- Rakefile
|
98
98
|
- ext/serpent/extconf.rb
|
99
|
-
- ext/serpent/
|
99
|
+
- ext/serpent/serpent_ffi.cpp
|
100
100
|
- lib/serpent.rb
|
101
|
+
- lib/serpent/caller.rb
|
102
|
+
- lib/serpent/node.rb
|
101
103
|
- lib/serpent/version.rb
|
102
104
|
- serpent.gemspec
|
103
105
|
- test/serpent_test.rb
|
@@ -121,7 +123,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
121
123
|
version: '0'
|
122
124
|
requirements: []
|
123
125
|
rubyforge_project:
|
124
|
-
rubygems_version: 2.
|
126
|
+
rubygems_version: 2.5.1
|
125
127
|
signing_key:
|
126
128
|
specification_version: 4
|
127
129
|
summary: Ruby binding to Ethereum Serpent compiler.
|
data/ext/serpent/serpent.cpp
DELETED
@@ -1,34 +0,0 @@
|
|
1
|
-
#include "rice/Module.hpp"
|
2
|
-
using namespace Rice;
|
3
|
-
|
4
|
-
#include "libserpent/funcs.h"
|
5
|
-
|
6
|
-
std::string serpent_compile(Object self, std::string code) {
|
7
|
-
return compile(code);
|
8
|
-
}
|
9
|
-
|
10
|
-
std::string serpent_mk_raw_signature(Object self, std::string input) {
|
11
|
-
return mkSignature(input);
|
12
|
-
}
|
13
|
-
|
14
|
-
std::string serpent_mk_raw_full_signature(Object self, std::string input) {
|
15
|
-
return mkFullSignature(input);
|
16
|
-
}
|
17
|
-
|
18
|
-
std::string serpent_mk_raw_contract_info(Object self, std::string input) {
|
19
|
-
return mkContractInfoDecl(input);
|
20
|
-
}
|
21
|
-
|
22
|
-
unsigned int serpent_get_prefix(Object self, std::string signature) {
|
23
|
-
return getPrefix(signature);
|
24
|
-
}
|
25
|
-
|
26
|
-
extern "C"
|
27
|
-
void Init_serpent() {
|
28
|
-
Module rb_mSerpent = define_module("Serpent")
|
29
|
-
.define_module_function("compile", &serpent_compile)
|
30
|
-
.define_module_function("mk_raw_signature", &serpent_mk_raw_signature)
|
31
|
-
.define_module_function("mk_raw_full_signature", &serpent_mk_raw_full_signature)
|
32
|
-
.define_module_function("mk_raw_contract_info", &serpent_mk_raw_contract_info)
|
33
|
-
.define_module_function("get_prefix", &serpent_get_prefix);
|
34
|
-
}
|