Mercurial > scratch
annotate pydershell/pydershell.py @ 19:057260102960
Made wrapping of python objects much nicer.
author | Atul Varma <varmaa@toolness.com> |
---|---|
date | Mon, 07 Sep 2009 12:57:20 -0700 |
parents | 69e5523ebdc6 |
children | 8dd18f864351 |
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 |
13 | 17 DEFAULT_INTERVAL = 0.25 |
18 | |
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 | 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 | 65 def __init__(self): |
66 BaseException.__init__(self) | |
67 self.exc_info = sys.exc_info() | |
68 | |
17
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
69 class SafeJsObjectWrapper(object): |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
70 """ |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
71 Securely wraps a JS object to behave like any normal Python object. |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
72 """ |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
73 |
19
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
74 __slots__ = ['_jsobject', '_sandbox', '_this'] |
17
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
75 |
19
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
76 def __init__(self, sandbox, jsobject, this): |
17
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
77 if not isinstance(jsobject, pydermonkey.Object): |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
78 raise TypeError("Cannot wrap '%s' object" % |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
79 type(jsobject).__name__) |
19
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
80 object.__setattr__(self, '_sandbox', sandbox) |
17
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
81 object.__setattr__(self, '_jsobject', jsobject) |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
82 object.__setattr__(self, '_this', this) |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
83 |
19
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
84 @property |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
85 def wrapped_jsobject(self): |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
86 return self._jsobject |
17
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
87 |
18
69e5523ebdc6
Separated out SafeJsObjectWrapper into itself and a new subclass, SafeJsFunctionWrapper, so that callable() works properly on instances.
Atul Varma <varmaa@toolness.com>
parents:
17
diff
changeset
|
88 def _wrap_to_python(self, jsvalue): |
19
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
89 return self._sandbox.wrap_jsobject(jsvalue, self._jsobject) |
18
69e5523ebdc6
Separated out SafeJsObjectWrapper into itself and a new subclass, SafeJsFunctionWrapper, so that callable() works properly on instances.
Atul Varma <varmaa@toolness.com>
parents:
17
diff
changeset
|
90 |
69e5523ebdc6
Separated out SafeJsObjectWrapper into itself and a new subclass, SafeJsFunctionWrapper, so that callable() works properly on instances.
Atul Varma <varmaa@toolness.com>
parents:
17
diff
changeset
|
91 def _wrap_to_js(self, value): |
19
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
92 return self._sandbox.wrap_pyobject(value) |
17
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
93 |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
94 def __eq__(self, other): |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
95 if isinstance(other, SafeJsObjectWrapper): |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
96 return self._jsobject == other._jsobject |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
97 else: |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
98 return False |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
99 |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
100 def __str__(self): |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
101 return self.toString() |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
102 |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
103 def __unicode__(self): |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
104 return self.toString() |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
105 |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
106 def __setitem__(self, item, value): |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
107 self.__setattr__(item, value) |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
108 |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
109 def __setattr__(self, name, value): |
19
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
110 cx = self._sandbox.cx |
17
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
111 jsobject = self._jsobject |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
112 |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
113 cx.define_property(jsobject, name, |
18
69e5523ebdc6
Separated out SafeJsObjectWrapper into itself and a new subclass, SafeJsFunctionWrapper, so that callable() works properly on instances.
Atul Varma <varmaa@toolness.com>
parents:
17
diff
changeset
|
114 self._wrap_to_js(value)) |
17
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
115 |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
116 def __getitem__(self, item): |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
117 return self.__getattr__(item) |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
118 |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
119 def __getattr__(self, name): |
19
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
120 cx = self._sandbox.cx |
17
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
121 jsobject = self._jsobject |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
122 |
18
69e5523ebdc6
Separated out SafeJsObjectWrapper into itself and a new subclass, SafeJsFunctionWrapper, so that callable() works properly on instances.
Atul Varma <varmaa@toolness.com>
parents:
17
diff
changeset
|
123 return self._wrap_to_python(cx.get_property(jsobject, name)) |
17
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
124 |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
125 def __contains__(self, item): |
19
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
126 cx = self._sandbox.cx |
17
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
127 jsobject = self._jsobject |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
128 |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
129 return cx.has_property(jsobject, item) |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
130 |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
131 def __iter__(self): |
19
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
132 cx = self._sandbox.cx |
17
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
133 jsobject = self._jsobject |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
134 |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
135 properties = cx.enumerate(jsobject) |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
136 for property in properties: |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
137 yield property |
1d62177c5c27
Added a safe js object wrapper.
Atul Varma <varmaa@toolness.com>
parents:
16
diff
changeset
|
138 |
18
69e5523ebdc6
Separated out SafeJsObjectWrapper into itself and a new subclass, SafeJsFunctionWrapper, so that callable() works properly on instances.
Atul Varma <varmaa@toolness.com>
parents:
17
diff
changeset
|
139 class SafeJsFunctionWrapper(SafeJsObjectWrapper): |
69e5523ebdc6
Separated out SafeJsObjectWrapper into itself and a new subclass, SafeJsFunctionWrapper, so that callable() works properly on instances.
Atul Varma <varmaa@toolness.com>
parents:
17
diff
changeset
|
140 """ |
69e5523ebdc6
Separated out SafeJsObjectWrapper into itself and a new subclass, SafeJsFunctionWrapper, so that callable() works properly on instances.
Atul Varma <varmaa@toolness.com>
parents:
17
diff
changeset
|
141 Securely wraps a JS function to behave like any normal Python object. |
69e5523ebdc6
Separated out SafeJsObjectWrapper into itself and a new subclass, SafeJsFunctionWrapper, so that callable() works properly on instances.
Atul Varma <varmaa@toolness.com>
parents:
17
diff
changeset
|
142 """ |
69e5523ebdc6
Separated out SafeJsObjectWrapper into itself and a new subclass, SafeJsFunctionWrapper, so that callable() works properly on instances.
Atul Varma <varmaa@toolness.com>
parents:
17
diff
changeset
|
143 |
19
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
144 def __init__(self, sandbox, jsfunction, this): |
18
69e5523ebdc6
Separated out SafeJsObjectWrapper into itself and a new subclass, SafeJsFunctionWrapper, so that callable() works properly on instances.
Atul Varma <varmaa@toolness.com>
parents:
17
diff
changeset
|
145 if not isinstance(jsfunction, pydermonkey.Function): |
69e5523ebdc6
Separated out SafeJsObjectWrapper into itself and a new subclass, SafeJsFunctionWrapper, so that callable() works properly on instances.
Atul Varma <varmaa@toolness.com>
parents:
17
diff
changeset
|
146 raise TypeError("Cannot wrap '%s' object" % |
69e5523ebdc6
Separated out SafeJsObjectWrapper into itself and a new subclass, SafeJsFunctionWrapper, so that callable() works properly on instances.
Atul Varma <varmaa@toolness.com>
parents:
17
diff
changeset
|
147 type(jsobject).__name__) |
19
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
148 SafeJsObjectWrapper.__init__(self, sandbox, jsfunction, this) |
18
69e5523ebdc6
Separated out SafeJsObjectWrapper into itself and a new subclass, SafeJsFunctionWrapper, so that callable() works properly on instances.
Atul Varma <varmaa@toolness.com>
parents:
17
diff
changeset
|
149 |
69e5523ebdc6
Separated out SafeJsObjectWrapper into itself and a new subclass, SafeJsFunctionWrapper, so that callable() works properly on instances.
Atul Varma <varmaa@toolness.com>
parents:
17
diff
changeset
|
150 def __call__(self, *args): |
19
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
151 cx = self._sandbox.cx |
18
69e5523ebdc6
Separated out SafeJsObjectWrapper into itself and a new subclass, SafeJsFunctionWrapper, so that callable() works properly on instances.
Atul Varma <varmaa@toolness.com>
parents:
17
diff
changeset
|
152 jsobject = self._jsobject |
69e5523ebdc6
Separated out SafeJsObjectWrapper into itself and a new subclass, SafeJsFunctionWrapper, so that callable() works properly on instances.
Atul Varma <varmaa@toolness.com>
parents:
17
diff
changeset
|
153 this = self._this |
69e5523ebdc6
Separated out SafeJsObjectWrapper into itself and a new subclass, SafeJsFunctionWrapper, so that callable() works properly on instances.
Atul Varma <varmaa@toolness.com>
parents:
17
diff
changeset
|
154 |
19
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
155 arglist = [] |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
156 for arg in args: |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
157 arglist.append(self._wrap_to_js(arg)) |
12
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
158 |
19
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
159 obj = cx.call_function(this, jsobject, tuple(arglist)) |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
160 return self._wrap_to_python(obj) |
11 | 161 |
12
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
162 def format_stack(js_stack): |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
163 """ |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
164 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
|
165 JS stack. |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
166 """ |
10 | 167 |
12
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
168 STACK_LINE =" File \"%(filename)s\", line %(lineno)d, in %(name)s" |
10 | 169 |
170 lines = [] | |
171 while js_stack: | |
12
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
172 script = js_stack['script'] |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
173 function = js_stack['function'] |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
174 if script: |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
175 frameinfo = dict(filename = script.filename, |
16
a78570a423ea
Show code excerpts in js stack tracebacks
Atul Varma <varmaa@toolness.com>
parents:
15
diff
changeset
|
176 lineno = js_stack['lineno'], |
a78570a423ea
Show code excerpts in js stack tracebacks
Atul Varma <varmaa@toolness.com>
parents:
15
diff
changeset
|
177 name = '<module>') |
12
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
178 elif function and not function.is_python: |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
179 frameinfo = dict(filename = function.filename, |
16
a78570a423ea
Show code excerpts in js stack tracebacks
Atul Varma <varmaa@toolness.com>
parents:
15
diff
changeset
|
180 lineno = js_stack['lineno'], |
a78570a423ea
Show code excerpts in js stack tracebacks
Atul Varma <varmaa@toolness.com>
parents:
15
diff
changeset
|
181 name = function.name) |
10 | 182 else: |
12
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
183 frameinfo = None |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
184 if frameinfo: |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
185 lines.insert(0, STACK_LINE % frameinfo) |
16
a78570a423ea
Show code excerpts in js stack tracebacks
Atul Varma <varmaa@toolness.com>
parents:
15
diff
changeset
|
186 try: |
a78570a423ea
Show code excerpts in js stack tracebacks
Atul Varma <varmaa@toolness.com>
parents:
15
diff
changeset
|
187 filelines = open(frameinfo['filename']).readlines() |
a78570a423ea
Show code excerpts in js stack tracebacks
Atul Varma <varmaa@toolness.com>
parents:
15
diff
changeset
|
188 line = filelines[frameinfo['lineno'] - 1].strip() |
a78570a423ea
Show code excerpts in js stack tracebacks
Atul Varma <varmaa@toolness.com>
parents:
15
diff
changeset
|
189 lines.insert(1, " %s" % line) |
a78570a423ea
Show code excerpts in js stack tracebacks
Atul Varma <varmaa@toolness.com>
parents:
15
diff
changeset
|
190 except Exception: |
a78570a423ea
Show code excerpts in js stack tracebacks
Atul Varma <varmaa@toolness.com>
parents:
15
diff
changeset
|
191 pass |
10 | 192 js_stack = js_stack['caller'] |
193 lines.insert(0, "Traceback (most recent call last):") | |
194 return '\n'.join(lines) | |
195 | |
19
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
196 class JSSandbox(object): |
12
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
197 """ |
19
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
198 A JS runtime and associated functionality capable of securely |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
199 loading and executing scripts. |
12
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
200 """ |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
201 |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
202 def __init__(self, watchdog=watchdog): |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
203 rt = pydermonkey.Runtime() |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
204 cx = rt.new_context() |
19
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
205 root = cx.new_object() |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
206 cx.init_standard_classes(root) |
12
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
207 |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
208 cx.set_operation_callback(self._opcb) |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
209 cx.set_throw_hook(self._throwhook) |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
210 watchdog.add_context(cx) |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
211 |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
212 self.rt = rt |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
213 self.cx = cx |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
214 self.curr_exc = None |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
215 self.py_stack = None |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
216 self.js_stack = None |
19
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
217 self.__py_to_js = {} |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
218 self.root = self.wrap_jsobject(root, root) |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
219 |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
220 def finish(self): |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
221 for jsobj in self.__py_to_js.values(): |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
222 self.cx.clear_object_private(jsobj) |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
223 del self.__py_to_js |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
224 del self.curr_exc |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
225 del self.py_stack |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
226 del self.js_stack |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
227 del self.cx |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
228 del self.rt |
12
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
229 |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
230 def _opcb(self, cx): |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
231 # 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
|
232 # it'll get raised here automatically. |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
233 pass |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
234 |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
235 def _throwhook(self, cx): |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
236 curr_exc = cx.get_pending_exception() |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
237 if self.curr_exc != curr_exc: |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
238 self.curr_exc = curr_exc |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
239 self.py_stack = traceback.extract_stack() |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
240 self.js_stack = cx.get_stack() |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
241 |
19
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
242 def __wrap_pycallable(self, func): |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
243 if func in self.__py_to_js: |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
244 return self.__py_to_js[func] |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
245 |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
246 if hasattr(func, '__name__'): |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
247 name = func.__name__ |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
248 else: |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
249 name = "" |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
250 |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
251 def wrapper(func_cx, this, args): |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
252 try: |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
253 arglist = [] |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
254 for arg in args: |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
255 arglist.append(self.wrap_jsobject(arg)) |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
256 # TODO: Fill in extra required params with pymonkey.undefined? |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
257 # or automatically throw an exception to calling js code? |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
258 return func(*arglist) |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
259 except pydermonkey.error: |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
260 raise |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
261 except Exception: |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
262 raise InternalError() |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
263 wrapper.wrapped_pyobject = func |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
264 wrapper.__name__ = name |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
265 |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
266 jsfunc = self.cx.new_function(wrapper, name) |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
267 self.__py_to_js[func] = jsfunc |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
268 |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
269 return jsfunc |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
270 |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
271 def wrap_pyobject(self, value): |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
272 if isinstance(value, SafeJsObjectWrapper): |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
273 # It's already wrapped, just unwrap it. |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
274 return value.wrapped_jsobject |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
275 elif callable(value): |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
276 return self.__wrap_pycallable(value) |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
277 elif isinstance(value, object): |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
278 raise NotImplementedError("TODO") |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
279 else: |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
280 # Here's hoping it's a primitive value. |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
281 return value |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
282 |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
283 def wrap_jsobject(self, jsvalue, this=None): |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
284 if this is None: |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
285 this = self.root.wrapped_jsobject |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
286 if isinstance(jsvalue, pydermonkey.Function): |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
287 if jsvalue.is_python: |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
288 # It's a Python function, just unwrap it. |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
289 return self.cx.get_object_private(jsvalue).wrapped_pyobject |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
290 return SafeJsFunctionWrapper(self, jsvalue, this) |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
291 elif isinstance(jsvalue, pydermonkey.Object): |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
292 return SafeJsObjectWrapper(self, jsvalue, this) |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
293 else: |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
294 # It's a primitive value. |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
295 return jsvalue |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
296 |
12
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
297 def run_script(self, filename): |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
298 contents = open(filename).read() |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
299 cx = self.cx |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
300 try: |
19
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
301 cx.evaluate_script(self.root.wrapped_jsobject, contents, |
12
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
302 filename, 1) |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
303 except pydermonkey.error, e: |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
304 print format_stack(self.js_stack) |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
305 print e.args[1] |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
306 except InternalError, e: |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
307 print "An internal error occurred." |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
308 traceback.print_tb(e.exc_info[2]) |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
309 print e.exc_info[1] |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
310 |
f024e41d0fb9
More refactoring, a bit more documentation.
Atul Varma <varmaa@toolness.com>
parents:
11
diff
changeset
|
311 if __name__ == '__main__': |
19
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
312 sandbox = JSSandbox() |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
313 |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
314 def bar(obj): |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
315 print obj.bar() |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
316 sandbox.root.bar = bar |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
317 |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
318 def foo(callback): |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
319 return callback() |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
320 sandbox.root.foo = foo |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
321 |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
322 def jsprint(string): |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
323 print string |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
324 sandbox.root['print'] = jsprint |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
325 |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
326 sandbox.run_script('test.js') |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
327 |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
328 sandbox.finish() |
057260102960
Made wrapping of python objects much nicer.
Atul Varma <varmaa@toolness.com>
parents:
18
diff
changeset
|
329 del sandbox |
15
351525e95a45
Added memory leak detection.
Atul Varma <varmaa@toolness.com>
parents:
14
diff
changeset
|
330 |
351525e95a45
Added memory leak detection.
Atul Varma <varmaa@toolness.com>
parents:
14
diff
changeset
|
331 import gc |
351525e95a45
Added memory leak detection.
Atul Varma <varmaa@toolness.com>
parents:
14
diff
changeset
|
332 gc.collect() |
351525e95a45
Added memory leak detection.
Atul Varma <varmaa@toolness.com>
parents:
14
diff
changeset
|
333 if pydermonkey.get_debug_info()['runtime_count']: |
351525e95a45
Added memory leak detection.
Atul Varma <varmaa@toolness.com>
parents:
14
diff
changeset
|
334 print "WARNING: JS runtime was not destroyed." |