annotate jseval.py @ 9:0f1545ef023e

Added tag ink_blog_post for changeset 05f467a83cb9
author Atul Varma <varmaa@toolness.com>
date Fri, 04 Sep 2009 06:30:38 -0700
parents 1102944b174d
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
1 # jseval.py
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
2 # By Atul Varma <varmaa@toolness.com>
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
3 #
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
4 # This is a simple example of embedding the SpiderMonkey engine into
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
5 # Python using ctypes.
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
6
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
7 import sys
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
8 import ctypes
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
9
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
10 # Sample Python function to inject into JavaScript space.
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
11 def displayMessage(msg):
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
12 print msg
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
13
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
14 class JSEngine( object ):
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
15 def __init__( self, dllpath ):
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
16 self._dllpath = dllpath
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
17
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
18 class JSClass( ctypes.Structure ):
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
19 _fields_ = [("name", ctypes.c_char_p),
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
20 ("flags", ctypes.c_uint32),
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
21 # Mandatory non-null members
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
22 ("addProperty", ctypes.c_void_p),
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
23 ("delProperty", ctypes.c_void_p),
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
24 ("getProperty", ctypes.c_void_p),
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
25 ("setProperty", ctypes.c_void_p),
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
26 ("enumerate", ctypes.c_void_p),
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
27 ("resolve", ctypes.c_void_p),
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
28 ("convert", ctypes.c_void_p),
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
29 ("finalize", ctypes.c_void_p),
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
30 # Optionally non-null members
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
31 ("getObjectOps", ctypes.c_void_p),
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
32 ("checkAccess", ctypes.c_void_p),
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
33 ("call", ctypes.c_void_p),
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
34 ("construct", ctypes.c_void_p),
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
35 ("xdrObject", ctypes.c_void_p),
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
36 ("hasInstance", ctypes.c_void_p),
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
37 ("mark", ctypes.c_void_p),
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
38 ("reserveSlots", ctypes.c_void_p)
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
39 ]
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
40
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
41 JSNativeFunction = ctypes.CFUNCTYPE(
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
42 ctypes.c_int, # Return value
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
43 ctypes.c_void_p, # Context
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
44 ctypes.c_void_p, # Object
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
45 ctypes.c_int, # argc
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
46 ctypes.POINTER( ctypes.c_int ), # argv
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
47 ctypes.POINTER( ctypes.c_int ), # retval
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
48 )
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
49
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
50 def _initRuntime( self ):
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
51 self.jsdll = ctypes.cdll.LoadLibrary(self._dllpath)
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
52 self.runtime = self.jsdll.JS_Init( 32768 )
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
53
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
54 if self.runtime == 0:
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
55 raise JSError( "JS_Init() failed." )
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
56
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
57 def _shutdownRuntime( self ):
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
58 self.jsdll.JS_Finish( self.runtime )
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
59 del self.runtime
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
60 del self.jsdll
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
61
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
62 def _getNewContext( self ):
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
63 context = self.jsdll.JS_NewContext(self.runtime, 8192)
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
64 if context == 0:
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
65 raise JSError( "JS_NewContext() failed." )
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
66 return context
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
67
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
68 def _createGlobalClass( self, name ):
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
69 globalClass = self.JSClass(
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
70 name, 0,
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
71 ctypes.cast( self.jsdll.JS_PropertyStub, ctypes.c_void_p ),
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
72 ctypes.cast( self.jsdll.JS_PropertyStub, ctypes.c_void_p ),
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
73 ctypes.cast( self.jsdll.JS_PropertyStub, ctypes.c_void_p ),
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
74 ctypes.cast( self.jsdll.JS_PropertyStub, ctypes.c_void_p ),
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
75 ctypes.cast( self.jsdll.JS_EnumerateStub, ctypes.c_void_p ),
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
76 ctypes.cast( self.jsdll.JS_ResolveStub, ctypes.c_void_p ),
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
77 ctypes.cast( self.jsdll.JS_ConvertStub, ctypes.c_void_p ),
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
78 ctypes.cast( self.jsdll.JS_FinalizeStub, ctypes.c_void_p ),
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
79 0, 0, 0, 0, 0, 0, 0, 0
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
80 )
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
81 return globalClass
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
82
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
83 def _createGlobalObject( self, context, globalClass ):
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
84 globalObj = self.jsdll.JS_NewObject(
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
85 context,
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
86 ctypes.byref( globalClass ),
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
87 0,
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
88 0
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
89 )
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
90
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
91 if not globalObj:
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
92 raise JSError( "JS_NewObject() failed." )
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
93
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
94 return globalObj
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
95
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
96 def _installDisplayMessageFunction( self, context, globalObj ):
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
97 def jsDisplayMessage( context, object, argc, argv, retval ):
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
98 jsString = self.jsdll.JS_ValueToString( context, argv[0] )
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
99 cString = ctypes.c_char_p( self.jsdll.JS_GetStringBytes( jsString ) )
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
100 displayMessage( cString.value )
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
101 retval[0] = 0
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
102 return 1
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
103
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
104 retval = self.jsdll.JS_DefineFunction(
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
105 context,
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
106 globalObj,
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
107 "displayMessage",
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
108 self.JSNativeFunction( jsDisplayMessage ),
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
109 1,
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
110 0
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
111 )
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
112
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
113 if retval == 0:
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
114 raise JSError( "JS_DefineFunction() failed." )
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
115
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
116 def eval( self, scriptString ):
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
117 """
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
118 Evaluates the given string of JavaScript code and returns the
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
119 result as a string.
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
120
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
121 The string must be ascii-encodable, as this function does not
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
122 currently use JavaScript's unicode API.
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
123 """
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
124
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
125 # For more information on what's going on here, see:
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
126 #
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
127 # http://developer.mozilla.org [continued on next line]
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
128 # /en/docs/JavaScript_C_Engine_Embedder%27s_Guide
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
129 # http://www.mozilla.org/js/spidermonkey/tutorial.html
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
130
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
131 script = scriptString.encode( "ascii" )
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
132
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
133 # We carefully set up and shutdown everything on each pass, to
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
134 # make the world a happier place.
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
135 self._initRuntime()
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
136 context = self._getNewContext()
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
137 name = ctypes.c_char_p( "enso" )
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
138 globalClass = self._createGlobalClass( name )
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
139 globalObj = self._createGlobalObject( context, globalClass )
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
140 self._installDisplayMessageFunction( context, globalObj )
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
141 builtins = self.jsdll.JS_InitStandardClasses( context, globalObj )
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
142
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
143 try:
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
144 rval = ctypes.c_int()
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
145
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
146 ok = self.jsdll.JS_EvaluateScript(
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
147 context,
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
148 globalObj,
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
149 script,
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
150 len(script),
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
151 "<string>",
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
152 0,
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
153 ctypes.byref( rval )
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
154 )
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
155
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
156 if not ok:
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
157 raise JSEvalError( "JS_EvaluateScript() failed." )
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
158
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
159 jsString = self.jsdll.JS_ValueToString( context, rval )
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
160 cString = ctypes.c_char_p(
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
161 self.jsdll.JS_GetStringBytes( jsString )
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
162 )
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
163 retval = cString.value
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
164 finally:
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
165 self.jsdll.JS_DestroyContext( context )
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
166 self._shutdownRuntime()
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
167
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
168 return retval
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
169
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
170 class JSError( Exception ):
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
171 pass
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
172
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
173 class JSEvalError( JSError ):
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
174 pass
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
175
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
176 if __name__ == "__main__":
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
177 args = sys.argv[1:]
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
178 if len(args) < 1:
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
179 print "usage: %s <path-to-spidermonkey-dll>" % sys.argv[0]
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
180 sys.exit(1)
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
181
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
182 e = JSEngine(sys.argv[1])
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
183
1102944b174d Origination.
Atul Varma <varmaa@toolness.com>
parents:
diff changeset
184 e.eval("displayMessage('hi from spidermonkey! ' + Math.abs(-5));")