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 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