def _exec_(self, source):
            source = '''\
            (function() {{
                {0};
                {1};
            }})()'''.format(encode_unicode_codepoints(self._source),
                            encode_unicode_codepoints(source))
            source = str(source)

            # backward compatibility
            with PyV8.JSContext() as ctxt, PyV8.JSEngine() as engine:
                js_errors = (PyV8.JSError, IndexError, ReferenceError,
                             SyntaxError, TypeError)
                try:
                    script = engine.compile(source)
                except js_errors as e:
                    raise exceptions.ProgramError(e)
                try:
                    value = script.run()
                except js_errors as e:
                    raise exceptions.ProgramError(e)
                return self.convert(value)
        def _extract_result(self, output):
            output = output.decode(self._runtime._encoding)
            output = output.replace("\r\n", "\n").replace("\r", "\n")
            output_last_line = output.split("\n")[-2]

            if not output_last_line:
                status = value = None
            else:
                ret = json.loads(output_last_line)
                if len(ret) == 1:
                    ret = [ret[0], None]
                status, value = ret

            if status == "ok":
                return value
            elif value.startswith('SyntaxError:'):
                raise exceptions.RuntimeError(value)
            else:
                raise exceptions.ProgramError(value)