-
Notifications
You must be signed in to change notification settings - Fork 352
Description
This isn't strictly rusty_v8, but it's been hard to find any resources on this, so I thought I'd start here since you folks might be able to help.
Is there any way I can override the Math.random
function with a global object template? By this I mean I want to provide an object_template
in the ContextOptions
when creating a context that defines a Math.random
. I've already figured out that that I can (and how to) override Math.random
after the context is created, but ideally I'd be able to bundle this work in the same global template, since I'm already using it for other things (side question: does it matter performance-wise to provide a global object template when creating the context, or modifying the global object after creating the context?).
Here's some code that I tried, but the result shows that Math.random
wasn't overridden:
fn custom_random(
scope: &mut v8::HandleScope,
args: v8::FunctionCallbackArguments,
mut retval: v8::ReturnValue,
) {
retval.set(v8::Number::new(scope, 42).into());
}
let isolate = &mut v8::Isolate::new(Default::default());
let scope = &mut v8::HandleScope::new(isolate);
let global = v8::ObjectTemplate::new(scope);
let random_fn = v8::FunctionTemplate::new(scope, custom_random);
let math_obj = v8::ObjectTemplate::new(scope);
math_obj.set(
v8::String::new(scope, "random").unwrap().into(),
random_fn.into(),
);
global.set(
v8::String::new(scope, "Math").unwrap().into(),
math_obj.into(),
);
let context = v8::Context::new(
scope,
v8::ContextOptions {
global_template: Some(global),
..Default::default()
},
);
let scope = &mut v8::ContextScope::new(scope, context);
let code = v8::String::new(scope, "Math.random()").unwrap();
let script = v8::Script::compile(scope, code, None).unwrap();
let result = script.run(scope).unwrap();
println!("result: {}", result.to_rust_string_lossy(scope));
// Prints "result: 0.7939112874678715", and not "result: 42"