cranelift_ruby 0.1.2 → 0.1.6
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/cranelift_ruby/version.rb +1 -1
- data/src/lib.rs +75 -13
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c0a7e11a371b647924f89079254b3018b63a946ad319b5c3cb1819d7ba1452e8
|
4
|
+
data.tar.gz: 7dca58aaf433bb0d25b2c2bfd0a8366386d2fca841f8b315b84e02fb971e8939
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8dba879750f03825db2740ea107b142dab1b2548263fc45d8799130187ed2afb17af7619cfdb98075491e71c90ddf2b0ac8a1bd90e482ab7d98dc0c9bc750b9c
|
7
|
+
data.tar.gz: 948ff5a8b37ac31513bc001e77396a41072eaff186536cffda10cde2d9dffac3f6726abdae681322a81de1e0e30a3734f747a9fe2dce2e1b78aa6ac3083aa7f3
|
data/src/lib.rs
CHANGED
@@ -4,6 +4,7 @@ extern crate rutie;
|
|
4
4
|
#[macro_use]
|
5
5
|
extern crate lazy_static;
|
6
6
|
|
7
|
+
use std::collections::HashMap;
|
7
8
|
use std::convert::TryInto;
|
8
9
|
use std::num::TryFromIntError;
|
9
10
|
|
@@ -22,6 +23,7 @@ class!(Cranelift);
|
|
22
23
|
|
23
24
|
pub struct Builder {
|
24
25
|
pub module: JITModule,
|
26
|
+
pub funcs_sizes: HashMap<u32, u32>,
|
25
27
|
}
|
26
28
|
|
27
29
|
impl Builder {
|
@@ -35,6 +37,7 @@ impl Builder {
|
|
35
37
|
let isa = isa_builder.finish(settings::Flags::new(flag_builder));
|
36
38
|
Ok(Self {
|
37
39
|
module: JITModule::new(JITBuilder::with_isa(isa, default_libcall_names())),
|
40
|
+
funcs_sizes: HashMap::new(),
|
38
41
|
})
|
39
42
|
}
|
40
43
|
}
|
@@ -72,9 +75,10 @@ methods!(
|
|
72
75
|
let signature = signature.map_err(|e| VM::raise_ex(e)).unwrap();
|
73
76
|
let signature = signature.get_data(&*SIGNATURE_WRAPPER);
|
74
77
|
let callback = callback.map_err(|e| VM::raise_ex(e)).unwrap();
|
75
|
-
let func_id = make_function_impl(name.to_str(), signature, callback, builder)
|
78
|
+
let (func_id, func_size) = make_function_impl(name.to_str(), signature, callback, builder)
|
76
79
|
.map_err(|e| VM::raise_ex(e))
|
77
80
|
.unwrap();
|
81
|
+
builder.funcs_sizes.insert(func_id, func_size);
|
78
82
|
Integer::new(func_id.into())
|
79
83
|
},
|
80
84
|
fn finalize() -> NilClass {
|
@@ -97,6 +101,30 @@ methods!(
|
|
97
101
|
.unwrap();
|
98
102
|
let func_id = FuncId::new(func_id);
|
99
103
|
Integer::new(builder.module.get_finalized_function(func_id) as i64)
|
104
|
+
},
|
105
|
+
fn get_function_size(func_id: Integer) -> Integer {
|
106
|
+
let builder = itself.get_data_mut(&*BUILDER_WRAPPER);
|
107
|
+
let func_id = func_id.map_err(|e| VM::raise_ex(e)).unwrap();
|
108
|
+
let func_id = func_id
|
109
|
+
.to_i64()
|
110
|
+
.try_into()
|
111
|
+
.map_err(|_e| {
|
112
|
+
VM::raise_ex(AnyException::new(
|
113
|
+
"StandardError",
|
114
|
+
Some("Could create function id due to bad conversion"),
|
115
|
+
))
|
116
|
+
})
|
117
|
+
.unwrap();
|
118
|
+
Integer::new(
|
119
|
+
(*builder.funcs_sizes.get(&func_id).unwrap_or_else(|| {
|
120
|
+
VM::raise_ex(AnyException::new(
|
121
|
+
"StandardError",
|
122
|
+
Some("Could create function id due to bad conversion"),
|
123
|
+
));
|
124
|
+
&0
|
125
|
+
}))
|
126
|
+
.into(),
|
127
|
+
)
|
100
128
|
}
|
101
129
|
);
|
102
130
|
|
@@ -143,7 +171,7 @@ fn make_function_impl(
|
|
143
171
|
signature: &Signature,
|
144
172
|
callback: Proc,
|
145
173
|
builder: &mut Builder,
|
146
|
-
) -> Result<u32, AnyException> {
|
174
|
+
) -> Result<(u32, u32), AnyException> {
|
147
175
|
let func = builder
|
148
176
|
.module
|
149
177
|
.declare_function(name, Linkage::Local, &signature)
|
@@ -152,7 +180,6 @@ fn make_function_impl(
|
|
152
180
|
let mut func_ctx = FunctionBuilderContext::new();
|
153
181
|
ctx.func.signature = signature.clone();
|
154
182
|
ctx.func.name = ExternalName::user(0, func.as_u32());
|
155
|
-
// ctx.set_disasm(true);
|
156
183
|
let bcx: FunctionBuilder = FunctionBuilder::new(&mut ctx.func, &mut func_ctx);
|
157
184
|
let cranelift_bcx: AnyObject = Class::from_existing("CraneliftRuby")
|
158
185
|
.get_nested_class("CraneliftFunctionBuilder")
|
@@ -160,13 +187,12 @@ fn make_function_impl(
|
|
160
187
|
callback.call(&[cranelift_bcx]);
|
161
188
|
let mut trap_sink = NullTrapSink {};
|
162
189
|
let mut stack_map_sink = NullStackMapSink {};
|
163
|
-
|
164
|
-
builder
|
190
|
+
let f = builder
|
165
191
|
.module
|
166
192
|
.define_function(func, &mut ctx, &mut trap_sink, &mut stack_map_sink)
|
167
193
|
.map_err(|e| AnyException::new("StandardError", Some(&format!("{:?}", e))))?;
|
168
194
|
// println!("code: {}", ctx.mach_compile_result.unwrap().disasm.unwrap());
|
169
|
-
Ok(func.as_u32())
|
195
|
+
Ok((func.as_u32(), f.size))
|
170
196
|
}
|
171
197
|
|
172
198
|
wrappable_struct!(Signature, SignatureWrapper, SIGNATURE_WRAPPER);
|
@@ -249,30 +275,36 @@ methods!(
|
|
249
275
|
Class::from_existing("CraneliftRuby")
|
250
276
|
.get_nested_class("SigRef")
|
251
277
|
.wrap_data(sigref, &*SIGREF_WRAPPER)
|
252
|
-
}
|
278
|
+
},
|
253
279
|
fn call_indirect(sigref: AnyObject, callee: Integer, args: Array) -> Integer {
|
254
280
|
let bcx = itself.get_data_mut(&*FUNCTION_BUILDER_WRAPPER);
|
255
281
|
|
256
282
|
let sigref = sigref.map_err(|e| VM::raise_ex(e)).unwrap();
|
257
283
|
let sigref = sigref.get_data(&*SIGREF_WRAPPER);
|
258
284
|
let callee = callee.map_err(|e| VM::raise_ex(e)).unwrap();
|
259
|
-
let callee = from_integer_to_value(callee)
|
285
|
+
let callee = from_integer_to_value(callee)
|
286
|
+
.map_err(|e| VM::raise_ex(e))
|
287
|
+
.unwrap();
|
260
288
|
let args = args.map_err(|e| VM::raise_ex(e)).unwrap();
|
261
|
-
let args = from_array_to_values(args)
|
289
|
+
let args = from_array_to_values(args)
|
290
|
+
.map_err(|e| VM::raise_ex(e))
|
291
|
+
.unwrap();
|
262
292
|
let res = bcx.ins().call_indirect(*sigref, callee, &args);
|
263
293
|
Integer::new(res.as_u32().into())
|
264
|
-
}
|
294
|
+
},
|
265
295
|
fn inst_results(inst: Integer) -> Array {
|
266
296
|
let mut result = Array::new();
|
267
297
|
let bcx = itself.get_data_mut(&*FUNCTION_BUILDER_WRAPPER);
|
268
298
|
let inst = inst.map_err(|e| VM::raise_ex(e)).unwrap();
|
269
|
-
let inst = from_integer_to_inst(inst)
|
299
|
+
let inst = from_integer_to_inst(inst)
|
300
|
+
.map_err(|e| VM::raise_ex(e))
|
301
|
+
.unwrap();
|
270
302
|
let values = bcx.inst_results(inst);
|
271
303
|
for value in values {
|
272
304
|
result.push(Integer::new(value.as_u32().into()));
|
273
305
|
}
|
274
306
|
result
|
275
|
-
}
|
307
|
+
},
|
276
308
|
fn iconst(ty: Symbol, value: Integer) -> Integer {
|
277
309
|
let bcx = itself.get_data_mut(&*FUNCTION_BUILDER_WRAPPER);
|
278
310
|
let ty = ty.map_err(|e| VM::raise_ex(e)).unwrap();
|
@@ -343,6 +375,34 @@ methods!(
|
|
343
375
|
let res = bcx.ins().iadd(x, y);
|
344
376
|
Integer::new(res.as_u32().into())
|
345
377
|
},
|
378
|
+
fn band(x: Integer, y: Integer) -> Integer {
|
379
|
+
let bcx = itself.get_data_mut(&*FUNCTION_BUILDER_WRAPPER);
|
380
|
+
let x = x.map_err(|e| VM::raise_ex(e)).unwrap();
|
381
|
+
let x = from_integer_to_value(x)
|
382
|
+
.map_err(|e| VM::raise_ex(e))
|
383
|
+
.unwrap();
|
384
|
+
let y = y.map_err(|e| VM::raise_ex(e)).unwrap();
|
385
|
+
let y = from_integer_to_value(y)
|
386
|
+
.map_err(|e| VM::raise_ex(e))
|
387
|
+
.unwrap();
|
388
|
+
|
389
|
+
let res = bcx.ins().band(x, y);
|
390
|
+
Integer::new(res.as_u32().into())
|
391
|
+
},
|
392
|
+
fn bor(x: Integer, y: Integer) -> Integer {
|
393
|
+
let bcx = itself.get_data_mut(&*FUNCTION_BUILDER_WRAPPER);
|
394
|
+
let x = x.map_err(|e| VM::raise_ex(e)).unwrap();
|
395
|
+
let x = from_integer_to_value(x)
|
396
|
+
.map_err(|e| VM::raise_ex(e))
|
397
|
+
.unwrap();
|
398
|
+
let y = y.map_err(|e| VM::raise_ex(e)).unwrap();
|
399
|
+
let y = from_integer_to_value(y)
|
400
|
+
.map_err(|e| VM::raise_ex(e))
|
401
|
+
.unwrap();
|
402
|
+
|
403
|
+
let res = bcx.ins().bor(x, y);
|
404
|
+
Integer::new(res.as_u32().into())
|
405
|
+
},
|
346
406
|
fn return_(values: Array) -> NilClass {
|
347
407
|
let bcx = itself.get_data_mut(&*FUNCTION_BUILDER_WRAPPER);
|
348
408
|
let values = values.map_err(|e| VM::raise_ex(e)).unwrap();
|
@@ -519,7 +579,6 @@ fn from_array_to_values(array: Array) -> Result<Vec<Value>, AnyException> {
|
|
519
579
|
wrappable_struct!(Variable, VariableWrapper, VARIABLE_WRAPPER);
|
520
580
|
wrappable_struct!(SigRef, SigRefWrapper, SIGREF_WRAPPER);
|
521
581
|
|
522
|
-
|
523
582
|
class!(CraneliftVariable);
|
524
583
|
|
525
584
|
methods!(
|
@@ -558,6 +617,7 @@ pub extern "C" fn Init_cranelift_ruby() {
|
|
558
617
|
klass.def("make_function", make_function);
|
559
618
|
klass.def("finalize", finalize);
|
560
619
|
klass.def("get_function_pointer", get_function_pointer);
|
620
|
+
klass.def("get_function_size", get_function_size);
|
561
621
|
});
|
562
622
|
itself.define_nested_class("Signature", Some(&data_class));
|
563
623
|
itself.define_nested_class("SigRef", Some(&data_class));
|
@@ -595,6 +655,8 @@ pub extern "C" fn Init_cranelift_ruby() {
|
|
595
655
|
klass.def("import_signature", import_signature);
|
596
656
|
klass.def("call_indirect", call_indirect);
|
597
657
|
klass.def("inst_results", inst_results);
|
658
|
+
klass.def("band", band);
|
659
|
+
klass.def("bor", bor);
|
598
660
|
});
|
599
661
|
});
|
600
662
|
}
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cranelift_ruby
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Marco Concetto Rudilosso
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-07-
|
11
|
+
date: 2021-07-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rutie
|