Ruby support #1
3 changed files with 18 additions and 7 deletions
|
|
@ -1,3 +1,3 @@
|
||||||
def test_func()
|
def test_func()
|
||||||
rust_func()
|
rust_func
|
||||||
end
|
end
|
||||||
|
|
|
||||||
|
|
@ -308,7 +308,10 @@ pub trait Runtime: Resource + Default {
|
||||||
/// Provides immutable reference to raw scripting engine instance.
|
/// Provides immutable reference to raw scripting engine instance.
|
||||||
/// Can be used to directly interact with an interpreter to use interfaces
|
/// Can be used to directly interact with an interpreter to use interfaces
|
||||||
/// that bevy_scriptum does not provided adapters for.
|
/// that bevy_scriptum does not provided adapters for.
|
||||||
fn with_engine<T>(&self, f: impl FnOnce(&Self::RawEngine) -> T) -> T;
|
fn with_engine<T: Send + 'static>(
|
||||||
|
&self,
|
||||||
|
f: impl FnOnce(&Self::RawEngine) -> T + Send + 'static,
|
||||||
|
) -> T;
|
||||||
|
|
||||||
fn eval(
|
fn eval(
|
||||||
&self,
|
&self,
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1,4 @@
|
||||||
|
// TODO: make sure ruby is statically linked
|
||||||
use std::{
|
use std::{
|
||||||
sync::LazyLock,
|
sync::LazyLock,
|
||||||
thread::{self, JoinHandle},
|
thread::{self, JoinHandle},
|
||||||
|
|
@ -115,7 +116,10 @@ impl Runtime for RubyRuntime {
|
||||||
f(&mut magnus::Ruby::get().unwrap())
|
f(&mut magnus::Ruby::get().unwrap())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn with_engine<T>(&self, f: impl FnOnce(&Self::RawEngine) -> T) -> T {
|
fn with_engine<T: Send + 'static>(
|
||||||
|
&self,
|
||||||
|
f: impl FnOnce(&Self::RawEngine) -> T + Send + 'static,
|
||||||
|
) -> T {
|
||||||
RUBY_THREAD.execute_in(Box::new(move |ruby| f(&ruby)))
|
RUBY_THREAD.execute_in(Box::new(move |ruby| f(&ruby)))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -136,7 +140,7 @@ impl Runtime for RubyRuntime {
|
||||||
&mut self,
|
&mut self,
|
||||||
name: String,
|
name: String,
|
||||||
_arg_types: Vec<std::any::TypeId>,
|
_arg_types: Vec<std::any::TypeId>,
|
||||||
_f: impl Fn(
|
f: impl Fn(
|
||||||
Self::CallContext,
|
Self::CallContext,
|
||||||
Vec<Self::Value>,
|
Vec<Self::Value>,
|
||||||
) -> Result<
|
) -> Result<
|
||||||
|
|
@ -146,13 +150,17 @@ impl Runtime for RubyRuntime {
|
||||||
+ Sync
|
+ Sync
|
||||||
+ 'static,
|
+ 'static,
|
||||||
) -> Result<(), crate::ScriptingError> {
|
) -> Result<(), crate::ScriptingError> {
|
||||||
fn callback(_val: magnus::Value) -> magnus::Value {
|
fn callback() -> magnus::Value {
|
||||||
let ruby = magnus::Ruby::get().unwrap();
|
let ruby = magnus::Ruby::get().unwrap();
|
||||||
|
let method_name: magnus::value::StaticSymbol =
|
||||||
|
ruby.class_object().funcall("__method__", ()).unwrap();
|
||||||
|
let method_name = method_name.to_string();
|
||||||
|
dbg!(method_name);
|
||||||
ruby.qnil().as_value()
|
ruby.qnil().as_value()
|
||||||
}
|
}
|
||||||
|
|
||||||
RUBY_THREAD.execute_in(Box::new(move |ruby| {
|
RUBY_THREAD.execute_in(Box::new(move |ruby| {
|
||||||
ruby.define_global_function(&name, function!(callback, 1));
|
ruby.define_global_function(&name, function!(callback, 0));
|
||||||
RubyValue(())
|
RubyValue(())
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
|
@ -168,7 +176,7 @@ impl Runtime for RubyRuntime {
|
||||||
) -> Result<Self::Value, crate::ScriptingError> {
|
) -> Result<Self::Value, crate::ScriptingError> {
|
||||||
let name = name.to_string();
|
let name = name.to_string();
|
||||||
RUBY_THREAD.execute_in(Box::new(move |ruby| {
|
RUBY_THREAD.execute_in(Box::new(move |ruby| {
|
||||||
let _: Result<magnus::Value, _> = ruby.class_object().funcall(name, ());
|
let _: magnus::Value = ruby.class_object().funcall(name, ()).unwrap();
|
||||||
RubyValue(())
|
RubyValue(())
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue