Compare commits

...

2 commits

Author SHA1 Message Date
3b02faf9b4 [oden] It's a start 2023-06-20 06:33:29 -07:00
83a0950153 [oden-js] TryFromValue for Value 2023-06-20 06:17:34 -07:00
3 changed files with 55 additions and 15 deletions

View file

@ -1,4 +1,4 @@
use crate::{ContextRef, Error, Result, ValueRef};
use crate::{ContextRef, Error, Result, Value, ValueRef};
use std::num::TryFromIntError;
pub trait TryFromValue: Sized {
@ -98,10 +98,9 @@ impl TryFromValue for String {
}
}
// impl<'c, T: Class> TryFrom<&'c ValueRef<'_>> for T {
//
// #[inline]
// fn try_from_value(value: &ValueRef, ctx:&ContextRef) -> Result< Self> {
// T::from_value(value)
// }
// }
impl TryFromValue for Value {
#[inline]
fn try_from_value(value: &ValueRef, ctx: &ContextRef) -> Result<Self> {
Ok(value.dup(ctx))
}
}

View file

@ -1,4 +1,5 @@
function init() {
graphics.print("Hello world!");
// console.log("Hello world!");
}

View file

@ -1,21 +1,61 @@
use oden_js as js;
use oden_js::{Class, ClassID, Context, ContextRef, Runtime, Value, ValueRef, ValueResult};
pub struct GraphicsAPI {}
impl GraphicsAPI {
fn print_fn(ctx: &ContextRef, _this: &ValueRef, args: &[&ValueRef]) -> ValueResult {
for arg in args {
print!("{}", arg.to_string(ctx)?);
}
println!();
Ok(Value::undefined(ctx))
}
}
impl Class for GraphicsAPI {
fn class_id() -> &'static ClassID {
static ID: ClassID = ClassID::new("GraphicsAPI");
&ID
}
fn prototype(context: &ContextRef) -> ValueResult {
let mut prototype = context.new_object()?;
let print = context.new_dynamic_fn(GraphicsAPI::print_fn)?;
prototype.set_property(context, "print", &print)?;
Ok(prototype)
}
}
pub struct ScriptContext {
context: js::Context,
init: js::Value,
update: js::Value,
draw: js::Value,
context: Context,
init: Value,
update: Value,
draw: Value,
}
impl ScriptContext {
pub fn new() -> Self {
let runtime = js::Runtime::new();
let runtime = Runtime::new();
let mut context = js::Context::new(runtime);
let mut context = Context::new(runtime);
context.add_intrinsic_bigfloat();
context.add_intrinsic_bigdecimal();
context.add_intrinsic_operators();
// TODO: This should be a module instead. Yuck.
let mut global = context
.global_object()
.expect("Unable to get global object");
let graphics = GraphicsAPI {};
let graphics = graphics
.into_value(&context)
.expect("Unable to wrap graphics API");
global
.set_property(&context, "graphics", &graphics)
.expect("Unable to establish graphics");
let js = include_str!("main.js");
let module = context
.load_module(js, "main.js")