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