annotate pydershell/pydershell.py @ 16:a78570a423ea

Show code excerpts in js stack tracebacks
author Atul Varma <varmaa@toolness.com>
date Mon, 07 Sep 2009 00:33:56 -0700
parents 351525e95a45
children 1d62177c5c27
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,
16
a78570a423ea Show code excerpts in js stack tracebacks
Atul Varma <varmaa@toolness.com>
parents: 15
diff changeset
111 lineno = js_stack['lineno'],
a78570a423ea Show code excerpts in js stack tracebacks
Atul Varma <varmaa@toolness.com>
parents: 15
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,
16
a78570a423ea Show code excerpts in js stack tracebacks
Atul Varma <varmaa@toolness.com>
parents: 15
diff changeset
115 lineno = js_stack['lineno'],
a78570a423ea Show code excerpts in js stack tracebacks
Atul Varma <varmaa@toolness.com>
parents: 15
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)
16
a78570a423ea Show code excerpts in js stack tracebacks
Atul Varma <varmaa@toolness.com>
parents: 15
diff changeset
121 try:
a78570a423ea Show code excerpts in js stack tracebacks
Atul Varma <varmaa@toolness.com>
parents: 15
diff changeset
122 filelines = open(frameinfo['filename']).readlines()
a78570a423ea Show code excerpts in js stack tracebacks
Atul Varma <varmaa@toolness.com>
parents: 15
diff changeset
123 line = filelines[frameinfo['lineno'] - 1].strip()
a78570a423ea Show code excerpts in js stack tracebacks
Atul Varma <varmaa@toolness.com>
parents: 15
diff changeset
124 lines.insert(1, " %s" % line)
a78570a423ea Show code excerpts in js stack tracebacks
Atul Varma <varmaa@toolness.com>
parents: 15
diff changeset
125 except Exception:
a78570a423ea Show code excerpts in js stack tracebacks
Atul Varma <varmaa@toolness.com>
parents: 15
diff changeset
126 pass
10
fb25af17bae6 Added pydershell.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
127 js_stack = js_stack['caller']
fb25af17bae6 Added pydershell.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
128 lines.insert(0, "Traceback (most recent call last):")
fb25af17bae6 Added pydershell.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
129 return '\n'.join(lines)
fb25af17bae6 Added pydershell.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
130
12
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
131 class JSRuntime(object):
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
132 """
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
133 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
134 """
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 def __init__(self, watchdog=watchdog):
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
137 rt = pydermonkey.Runtime()
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
138 cx = rt.new_context()
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
139 globalobj = cx.new_object()
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
140 cx.init_standard_classes(globalobj)
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
141
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
142 @safejsfunc(cx, globalobj)
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
143 def foo(cx, this, args):
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
144 return cx.call_function(this, args[0], ())
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
145
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
146 @safejsfunc(cx, globalobj, 'print')
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
147 def jsprint(cx, this, args):
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
148 if len(args) > 0:
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
149 print args[0]
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
150
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
151 cx.set_operation_callback(self._opcb)
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
152 cx.set_throw_hook(self._throwhook)
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
153 watchdog.add_context(cx)
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
154
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
155 self.rt = rt
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
156 self.cx = cx
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
157 self.globalobj = globalobj
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
158 self.curr_exc = None
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
159 self.py_stack = None
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
160 self.js_stack = None
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
161
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
162 def _opcb(self, cx):
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
163 # 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
164 # it'll get raised here automatically.
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
165 pass
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
166
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
167 def _throwhook(self, cx):
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
168 curr_exc = cx.get_pending_exception()
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
169 if self.curr_exc != curr_exc:
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
170 self.curr_exc = curr_exc
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
171 self.py_stack = traceback.extract_stack()
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
172 self.js_stack = cx.get_stack()
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
173
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
174 def run_script(self, filename):
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
175 contents = open(filename).read()
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
176 cx = self.cx
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
177 try:
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
178 cx.evaluate_script(self.globalobj, contents,
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
179 filename, 1)
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
180 except pydermonkey.error, e:
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
181 print format_stack(self.js_stack)
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
182 print e.args[1]
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
183 except InternalError, e:
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
184 print "An internal error occurred."
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
185 traceback.print_tb(e.exc_info[2])
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
186 print e.exc_info[1]
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
187
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
188 if __name__ == '__main__':
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
189 runtime = JSRuntime()
f024e41d0fb9 More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents: 11
diff changeset
190 runtime.run_script('test.js')
14
9bcbf780581f Added a del statement that makes pydermonkey crash.
Atul Varma <varmaa@toolness.com>
parents: 13
diff changeset
191 del runtime
15
351525e95a45 Added memory leak detection.
Atul Varma <varmaa@toolness.com>
parents: 14
diff changeset
192
351525e95a45 Added memory leak detection.
Atul Varma <varmaa@toolness.com>
parents: 14
diff changeset
193 import gc
351525e95a45 Added memory leak detection.
Atul Varma <varmaa@toolness.com>
parents: 14
diff changeset
194 gc.collect()
351525e95a45 Added memory leak detection.
Atul Varma <varmaa@toolness.com>
parents: 14
diff changeset
195 if pydermonkey.get_debug_info()['runtime_count']:
351525e95a45 Added memory leak detection.
Atul Varma <varmaa@toolness.com>
parents: 14
diff changeset
196 print "WARNING: JS runtime was not destroyed."