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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9bfad5344bffc02e6f40ed9ce5629cf507ac4d6136fcc2d3d863d3ebbe281df3
4
- data.tar.gz: b78bf7c8f28ea44d30b6f8a2c872d5a48e8e59e3528c1269da1bde2e3015e9f5
3
+ metadata.gz: c0a7e11a371b647924f89079254b3018b63a946ad319b5c3cb1819d7ba1452e8
4
+ data.tar.gz: 7dca58aaf433bb0d25b2c2bfd0a8366386d2fca841f8b315b84e02fb971e8939
5
5
  SHA512:
6
- metadata.gz: 21e94193a3c2f0d0abe7e153418f70b52b145ca96e105a25c8584950422b5fa1e1e082727250552a71b602f48b391a52c438d3dbee0041c92a79d62d2eefc42e
7
- data.tar.gz: 58b8ae7bf977fdcb6218437de71c4fc13e0a98af2a10b9401c98e80423fc5359912d2310f3dda68cb26e879c617c06ff91ee2c4fa91ec74130bf520cfd6dc8df
6
+ metadata.gz: 8dba879750f03825db2740ea107b142dab1b2548263fc45d8799130187ed2afb17af7619cfdb98075491e71c90ddf2b0ac8a1bd90e482ab7d98dc0c9bc750b9c
7
+ data.tar.gz: 948ff5a8b37ac31513bc001e77396a41072eaff186536cffda10cde2d9dffac3f6726abdae681322a81de1e0e30a3734f747a9fe2dce2e1b78aa6ac3083aa7f3
@@ -1,3 +1,3 @@
1
1
  module CraneliftRuby
2
- VERSION = "0.1.2"
2
+ VERSION = "0.1.6"
3
3
  end
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
- // println!("{}", ctx.func.display(None).to_string());
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).map_err(|e| VM::raise_ex(e)).unwrap();
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).map_err(|e| VM::raise_ex(e)).unwrap();
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).map_err(|e| VM::raise_ex(e)).unwrap();
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.2
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-25 00:00:00.000000000 Z
11
+ date: 2021-07-28 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rutie