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
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
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
74f27983a350 Added more to pydershell.
Atul Varma <varmaa@toolness.com>
parents: 10
diff changeset
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
fb25af17bae6 Added pydershell.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
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
fb25af17bae6 Added pydershell.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
169
fb25af17bae6 Added pydershell.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
170 lines = []
fb25af17bae6 Added pydershell.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
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
fb25af17bae6 Added pydershell.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
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
fb25af17bae6 Added pydershell.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
192 js_stack = js_stack['caller']
fb25af17bae6 Added pydershell.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
193 lines.insert(0, "Traceback (most recent call last):")
fb25af17bae6 Added pydershell.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
194 return '\n'.join(lines)
fb25af17bae6 Added pydershell.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
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."