Source code for v8cffi.vm

# -*- coding: utf-8 -*-

from __future__ import unicode_literals

from _v8 import ffi, lib

from . import exceptions
from . import context


__all__ = ['VM']


[docs]class VM(object): """ Holds the VM state (V8 isolate).\ Running scripts within a VM is thread-safe,\ but only a single thread will execute code\ at a given time (there is a Global Lock).\ It's feasible to run one VM per thread\ or to have a pre-initialized pool. There may be many VMs per platform :param platform: Initialized platform :type platform: :py:class:`._Platform` """ def __init__(self, platform): self._platform = platform self._c_vm = None def __enter__(self): """ See :py:func:`set_up` method for docs """ assert not self.is_alive() assert self._platform.is_alive() self._c_vm = ffi.new('v8cffi_vm_t **') self._c_vm[0] = ffi.NULL code = lib.v8cffi_vm_new(self._c_vm) if code != lib.E_V8_OK: raise exceptions.get_exception(code) return self def __exit__(self, *_, **__): """ See :py:func:`tear_down` method for docs """ assert self.is_alive() assert self._platform.is_alive() lib.v8cffi_vm_free(self._c_vm[0]) self._c_vm = None
[docs] def is_alive(self): """ Check the vm is initialized and was not exited :return: Whether the vm is alive or not :rtype: bool """ return self._c_vm is not None
[docs] def create_context(self): """ Create a :py:class:`.Context` for running\ JS scripts :return: Instance of :py:class:`.Context` :rtype: :py:class:`.Context` """ return context.Context(self)
[docs] def get_c_vm(self): """ @Private Return the underlying C VM :return: struct cdata :rtype: :py:class:`ffi.CData<struct **>` """ return self._c_vm
[docs] def set_up(self): """ Initialize the VM.\ Remember to call :py:func:`tear_down`\ before exiting the application.\ It's recommended to use a ``with``\ statement instead of this method\ to ensure clean up :raise V8MemoryError: if there\ is no memory for allocating it,\ the process should die afterwards anyway,\ there is little point in catching this """ return self.__enter__()
[docs] def tear_down(self): """ Destructs the VM """ return self.__exit__()