cranelift_ruby 0.1.2 → 0.1.6
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/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
|