0
0
Fork 0
mirror of https://github.com/denoland/rusty_v8.git synced 2025-03-10 14:06:53 -04:00
rusty-v8/src/context.rs

79 lines
2.5 KiB
Rust
Raw Normal View History

2020-01-02 13:57:00 -05:00
// Copyright 2019-2020 the Deno authors. All rights reserved. MIT license.
use crate::isolate::Isolate;
use crate::Context;
2019-12-04 14:12:27 +01:00
use crate::Local;
2019-12-11 04:43:22 +01:00
use crate::Object;
use crate::ObjectTemplate;
use crate::ToLocal;
use crate::Value;
use std::ptr::null;
2019-12-04 14:12:27 +01:00
extern "C" {
fn v8__Context__New(
isolate: *mut Isolate,
templ: *const ObjectTemplate,
global_object: *const Value,
) -> *const Context;
fn v8__Context__Enter(this: *const Context);
fn v8__Context__Exit(this: *const Context);
fn v8__Context__Global(this: *const Context) -> *const Object;
2019-12-04 14:12:27 +01:00
}
impl Context {
/// Creates a new context.
pub fn new<'sc>(scope: &mut impl ToLocal<'sc>) -> Local<'sc, Context> {
2019-12-04 14:12:27 +01:00
// TODO: optional arguments;
unsafe {
scope
.cast_local(|scope| v8__Context__New(scope.isolate(), null(), null()))
}
.unwrap()
}
/// Creates a new context using the object template as the template for
/// the global object.
pub fn new_from_template<'sc>(
scope: &mut impl ToLocal<'sc>,
templ: Local<ObjectTemplate>,
) -> Local<'sc, Context> {
unsafe {
scope
.cast_local(|scope| v8__Context__New(scope.isolate(), &*templ, null()))
}
.unwrap()
2019-12-04 14:12:27 +01:00
}
2019-12-11 04:43:22 +01:00
/// Returns the global proxy object.
///
/// Global proxy object is a thin wrapper whose prototype points to actual
/// context's global object with the properties like Object, etc. This is done
/// that way for security reasons (for more details see
/// https://wiki.mozilla.org/Gecko:SplitWindow).
///
/// Please note that changes to global proxy object prototype most probably
/// would break VM---v8 expects only global object as a prototype of global
/// proxy object.
pub fn global<'sc>(
&self,
scope: &mut impl ToLocal<'sc>,
) -> Local<'sc, Object> {
unsafe { scope.cast_local(|_| v8__Context__Global(self)) }.unwrap()
2019-12-11 04:43:22 +01:00
}
/// Enter this context. After entering a context, all code compiled
/// and run is compiled and run in this context. If another context
/// is already entered, this old context is saved so it can be
/// restored when the new context is exited.
pub(crate) fn enter(&self) {
2019-12-04 14:12:27 +01:00
// TODO: enter/exit should be controlled by a scope.
unsafe { v8__Context__Enter(self) };
}
/// Exit this context. Exiting the current context restores the
/// context that was in place when entering the current context.
pub(crate) fn exit(&self) {
2019-12-04 14:12:27 +01:00
// TODO: enter/exit should be controlled by a scope.
unsafe { v8__Context__Exit(self) };
}
}