annotate pydershell/pydershell.py @ 13:2a3313bfe574

Minor refactoring.
author Atul Varma <varmaa@toolness.com>
date Sun, 06 Sep 2009 14:27:03 -0700
parents f024e41d0fb9
children 9bcbf780581f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
11
74f27983a350 Added more to pydershell.
Atul Varma <varmaa@toolness.com>
parents: 10
diff changeset
1 #! /usr/bin/env python
74f27983a350 Added more to pydershell.
Atul Varma <varmaa@toolness.com>
parents: 10
diff changeset
2
10
fb25af17bae6 Added pydershell.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3 import sys
fb25af17bae6 Added pydershell.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
4 import time
fb25af17bae6 Added pydershell.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
5 import threading
fb25af17bae6 Added pydershell.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
6 import traceback
12
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
7 import weakref
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
8
10
fb25af17bae6 Added pydershell.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
9 import pydermonkey
fb25af17bae6 Added pydershell.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
10
12
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
11 class ContextWatchdogThread(threading.Thread):
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
12 """
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
13 Watches active JS contexts and triggers their operation callbacks
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
14 at a regular interval.
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
15 """
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
16
13
2a3313bfe574 Minor refactoring.
Atul Varma <varmaa@toolness.com>
parents: 12
diff changeset
17 DEFAULT_INTERVAL = 0.25
2a3313bfe574 Minor refactoring.
Atul Varma <varmaa@toolness.com>
parents: 12
diff changeset
18
2a3313bfe574 Minor refactoring.
Atul Varma <varmaa@toolness.com>
parents: 12
diff changeset
19 def __init__(self, interval=DEFAULT_INTERVAL):
12
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
20 threading.Thread.__init__(self)
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
21 self._lock = threading.Lock()
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
22 self._stop = threading.Event()
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
23 self._contexts = []
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
24 self.interval = interval
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
25 self.setDaemon(True)
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
26
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
27 def add_context(self, cx):
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
28 self._lock.acquire()
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
29 try:
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
30 self._contexts.append(weakref.ref(cx))
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
31 finally:
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
32 self._lock.release()
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
33
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
34 def join(self):
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
35 self._stop.set()
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
36 threading.Thread.join(self)
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
37
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
38 def run(self):
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
39 while not self._stop.isSet():
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
40 time.sleep(self.interval)
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
41 new_list = []
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
42 self._lock.acquire()
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
43 try:
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
44 for weakcx in self._contexts:
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
45 cx = weakcx()
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
46 if cx:
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
47 new_list.append(weakcx)
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
48 cx.trigger_operation_callback()
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
49 self._contexts = new_list
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
50 finally:
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
51 self._lock.release()
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
52
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
53 # Create a global watchdog.
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
54 watchdog = ContextWatchdogThread()
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
55 watchdog.start()
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
56
11
74f27983a350 Added more to pydershell.
Atul Varma <varmaa@toolness.com>
parents: 10
diff changeset
57 class InternalError(BaseException):
12
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
58 """
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
59 Represents an error in a JS-wrapped Python function that wasn't
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
60 expected to happen; because it's derived from BaseException, it
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
61 unrolls the whole JS/Python stack so that the error can be
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
62 reported to the outermost calling code.
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
63 """
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
64
11
74f27983a350 Added more to pydershell.
Atul Varma <varmaa@toolness.com>
parents: 10
diff changeset
65 def __init__(self):
74f27983a350 Added more to pydershell.
Atul Varma <varmaa@toolness.com>
parents: 10
diff changeset
66 BaseException.__init__(self)
74f27983a350 Added more to pydershell.
Atul Varma <varmaa@toolness.com>
parents: 10
diff changeset
67 self.exc_info = sys.exc_info()
74f27983a350 Added more to pydershell.
Atul Varma <varmaa@toolness.com>
parents: 10
diff changeset
68
12
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
69 def safejsfunc(cx, on_obj, name=None):
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
70 """
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
71 Exposes the decorated Python function on the given JS object.
10
fb25af17bae6 Added pydershell.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
72
12
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
73 Any unexpected exceptions raised by the function will be
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
74 re-raised as InternalError exceptions.
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
75 """
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
76
11
74f27983a350 Added more to pydershell.
Atul Varma <varmaa@toolness.com>
parents: 10
diff changeset
77 def make_wrapper(func):
74f27983a350 Added more to pydershell.
Atul Varma <varmaa@toolness.com>
parents: 10
diff changeset
78 if name is None:
74f27983a350 Added more to pydershell.
Atul Varma <varmaa@toolness.com>
parents: 10
diff changeset
79 func_name = func.__name__
74f27983a350 Added more to pydershell.
Atul Varma <varmaa@toolness.com>
parents: 10
diff changeset
80 else:
74f27983a350 Added more to pydershell.
Atul Varma <varmaa@toolness.com>
parents: 10
diff changeset
81 func_name = name
74f27983a350 Added more to pydershell.
Atul Varma <varmaa@toolness.com>
parents: 10
diff changeset
82 def wrapper(func_cx, this, args):
74f27983a350 Added more to pydershell.
Atul Varma <varmaa@toolness.com>
parents: 10
diff changeset
83 try:
74f27983a350 Added more to pydershell.
Atul Varma <varmaa@toolness.com>
parents: 10
diff changeset
84 return func(func_cx, this, args)
74f27983a350 Added more to pydershell.
Atul Varma <varmaa@toolness.com>
parents: 10
diff changeset
85 except pydermonkey.error:
74f27983a350 Added more to pydershell.
Atul Varma <varmaa@toolness.com>
parents: 10
diff changeset
86 raise
74f27983a350 Added more to pydershell.
Atul Varma <varmaa@toolness.com>
parents: 10
diff changeset
87 except Exception:
74f27983a350 Added more to pydershell.
Atul Varma <varmaa@toolness.com>
parents: 10
diff changeset
88 raise InternalError()
74f27983a350 Added more to pydershell.
Atul Varma <varmaa@toolness.com>
parents: 10
diff changeset
89 cx.define_property(
74f27983a350 Added more to pydershell.
Atul Varma <varmaa@toolness.com>
parents: 10
diff changeset
90 on_obj,
74f27983a350 Added more to pydershell.
Atul Varma <varmaa@toolness.com>
parents: 10
diff changeset
91 func_name,
74f27983a350 Added more to pydershell.
Atul Varma <varmaa@toolness.com>
parents: 10
diff changeset
92 cx.new_function(wrapper, func_name)
74f27983a350 Added more to pydershell.
Atul Varma <varmaa@toolness.com>
parents: 10
diff changeset
93 )
74f27983a350 Added more to pydershell.
Atul Varma <varmaa@toolness.com>
parents: 10
diff changeset
94 return func
74f27983a350 Added more to pydershell.
Atul Varma <varmaa@toolness.com>
parents: 10
diff changeset
95 return make_wrapper
74f27983a350 Added more to pydershell.
Atul Varma <varmaa@toolness.com>
parents: 10
diff changeset
96
12
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
97 def format_stack(js_stack):
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
98 """
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
99 Returns a formatted Python-esque stack traceback of the given
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
100 JS stack.
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
101 """
10
fb25af17bae6 Added pydershell.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
102
12
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
103 STACK_LINE =" File \"%(filename)s\", line %(lineno)d, in %(name)s"
10
fb25af17bae6 Added pydershell.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
104
fb25af17bae6 Added pydershell.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
105 lines = []
fb25af17bae6 Added pydershell.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
106 while js_stack:
12
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
107 script = js_stack['script']
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
108 function = js_stack['function']
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
109 if script:
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
110 frameinfo = dict(filename = script.filename,
10
fb25af17bae6 Added pydershell.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
111 lineno = js_stack['lineno'],
fb25af17bae6 Added pydershell.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
112 name = '<module>')
12
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
113 elif function and not function.is_python:
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
114 frameinfo = dict(filename = function.filename,
10
fb25af17bae6 Added pydershell.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
115 lineno = js_stack['lineno'],
12
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
116 name = function.name)
10
fb25af17bae6 Added pydershell.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
117 else:
12
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
118 frameinfo = None
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
119 if frameinfo:
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
120 lines.insert(0, STACK_LINE % frameinfo)
10
fb25af17bae6 Added pydershell.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
121 js_stack = js_stack['caller']
fb25af17bae6 Added pydershell.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
122 lines.insert(0, "Traceback (most recent call last):")
fb25af17bae6 Added pydershell.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
123 return '\n'.join(lines)
fb25af17bae6 Added pydershell.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
124
12
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
125 class JSRuntime(object):
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
126 """
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
127 A JS runtime capable of loading and executing scripts.
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
128 """
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
129
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
130 def __init__(self, watchdog=watchdog):
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
131 rt = pydermonkey.Runtime()
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
132 cx = rt.new_context()
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
133 globalobj = cx.new_object()
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
134 cx.init_standard_classes(globalobj)
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
135
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
136 @safejsfunc(cx, globalobj)
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
137 def foo(cx, this, args):
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
138 return cx.call_function(this, args[0], ())
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
139
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
140 @safejsfunc(cx, globalobj, 'print')
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
141 def jsprint(cx, this, args):
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
142 if len(args) > 0:
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
143 print args[0]
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
144
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
145 cx.set_operation_callback(self._opcb)
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
146 cx.set_throw_hook(self._throwhook)
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
147 watchdog.add_context(cx)
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
148
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
149 self.rt = rt
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
150 self.cx = cx
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
151 self.globalobj = globalobj
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
152 self.curr_exc = None
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
153 self.py_stack = None
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
154 self.js_stack = None
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
155
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
156 def _opcb(self, cx):
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
157 # Don't do anything; if a keyboard interrupt was triggered,
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
158 # it'll get raised here automatically.
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
159 pass
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
160
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
161 def _throwhook(self, cx):
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
162 curr_exc = cx.get_pending_exception()
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
163 if self.curr_exc != curr_exc:
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
164 self.curr_exc = curr_exc
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
165 self.py_stack = traceback.extract_stack()
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
166 self.js_stack = cx.get_stack()
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
167
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
168 def run_script(self, filename):
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
169 contents = open(filename).read()
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
170 cx = self.cx
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
171 try:
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
172 cx.evaluate_script(self.globalobj, contents,
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
173 filename, 1)
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
174 except pydermonkey.error, e:
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
175 print format_stack(self.js_stack)
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
176 print e.args[1]
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
177 except InternalError, e:
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
178 print "An internal error occurred."
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
179 traceback.print_tb(e.exc_info[2])
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
180 print e.exc_info[1]
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
181
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
182 if __name__ == '__main__':
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
183 runtime = JSRuntime()
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
184 runtime.run_script('test.js')