@@ -28,7 +28,7 @@ void free_error(spidermonkey_state *state);
28
28
/* The class of the global object. */
29
29
static JSClass global_class = {
30
30
"global" , JSCLASS_GLOBAL_FLAGS ,
31
- JS_PropertyStub , JS_PropertyStub , JS_PropertyStub , JS_PropertyStub ,
31
+ JS_PropertyStub , JS_PropertyStub , JS_PropertyStub , JS_StrictPropertyStub ,
32
32
JS_EnumerateStub , JS_ResolveStub , JS_ConvertStub , JS_FinalizeStub ,
33
33
JSCLASS_NO_OPTIONAL_MEMBERS
34
34
};
@@ -41,9 +41,11 @@ char *copy_string(const char *source) {
41
41
return retval ;
42
42
}
43
43
44
- char * copy_jsstring (JSString * source ) {
45
- char * buf = JS_GetStringBytes (source );
46
- return copy_string (buf );
44
+ char * copy_jsstring (JSContext * cx , JSString * source ) {
45
+ char * buf = JS_EncodeString (cx , source );
46
+ char * retval = copy_string (buf );
47
+ JS_free (cx , buf );
48
+ return retval ;
47
49
}
48
50
49
51
void begin_request (spidermonkey_vm * vm ) {
@@ -78,7 +80,7 @@ void on_error(JSContext *context, const char *message, JSErrorReport *report) {
78
80
}
79
81
}
80
82
81
- JSBool on_branch (JSContext * context , JSScript * script ) {
83
+ JSBool on_branch (JSContext * context ) {
82
84
JSBool return_value = JS_TRUE ;
83
85
spidermonkey_state * state = (spidermonkey_state * ) JS_GetContextPrivate (context );
84
86
state -> branch_count ++ ;
@@ -116,8 +118,8 @@ JSBool js_log(JSContext *cx, uintN argc, jsval *vp) {
116
118
jsval * argv = JS_ARGV (cx , vp );
117
119
jsval jsfilename = argv [0 ];
118
120
jsval jsoutput = argv [1 ];
119
- char * filename = JS_GetStringBytes ( JS_ValueToString (cx , jsfilename ));
120
- char * output = JS_GetStringBytes ( JS_ValueToString (cx , jsoutput ));
121
+ char * filename = JS_EncodeString ( cx , JS_ValueToString (cx , jsfilename ));
122
+ char * output = JS_EncodeString ( cx , JS_ValueToString (cx , jsoutput ));
121
123
FILE * fd = fopen (filename , "a+" );
122
124
if (fd != NULL ) {
123
125
write_timestamp (fd );
@@ -129,6 +131,8 @@ JSBool js_log(JSContext *cx, uintN argc, jsval *vp) {
129
131
else {
130
132
JS_SET_RVAL (cx , vp , JSVAL_FALSE );
131
133
}
134
+ JS_free (cx , filename );
135
+ JS_free (cx , output );
132
136
}
133
137
return JSVAL_TRUE ;
134
138
}
@@ -155,14 +159,14 @@ spidermonkey_vm *sm_initialize(long thread_stack, long heap_size) {
155
159
JS_SetOptions (vm -> context , JSOPTION_STRICT );
156
160
JS_SetOptions (vm -> context , JSOPTION_COMPILE_N_GO );
157
161
JS_SetOptions (vm -> context , JSVERSION_LATEST );
158
- vm -> global = JS_NewObject (vm -> context , & global_class , NULL , NULL );
162
+ vm -> global = JS_NewCompartmentAndGlobalObject (vm -> context , & global_class , NULL );
159
163
JS_InitStandardClasses (vm -> context , vm -> global );
160
164
JS_SetErrorReporter (vm -> context , on_error );
161
- JS_SetBranchCallback (vm -> context , on_branch );
165
+ JS_SetOperationCallback (vm -> context , on_branch );
162
166
JS_SetContextPrivate (vm -> context , state );
163
167
JSNative funptr = (JSNative ) & js_log ;
164
168
JS_DefineFunction (vm -> context , JS_GetGlobalObject (vm -> context ), "ejsLog" , funptr ,
165
- 0 , JSFUN_FAST_NATIVE );
169
+ 0 , 0 );
166
170
end_request (vm );
167
171
168
172
return vm ;
@@ -259,7 +263,7 @@ void free_error(spidermonkey_state *state) {
259
263
260
264
char * sm_eval (spidermonkey_vm * vm , const char * filename , const char * code , int handle_retval ) {
261
265
char * retval = NULL ;
262
- JSScript * script ;
266
+ JSObject * script ;
263
267
jsval result ;
264
268
265
269
if (code == NULL ) {
@@ -280,16 +284,19 @@ char *sm_eval(spidermonkey_vm *vm, const char *filename, const char *code, int h
280
284
if (handle_retval ) {
281
285
if (JSVAL_IS_STRING (result )) {
282
286
JSString * str = JS_ValueToString (vm -> context , result );
283
- retval = copy_jsstring (str );
284
- }
285
- else if (strcmp (JS_GetStringBytes (JS_ValueToString (vm -> context , result )), "undefined" ) == 0 ) {
286
- retval = copy_string ("{\"error\": \"Expression returned undefined\", \"lineno\": 0, \"source\": \"unknown\"}" );
287
+ retval = copy_jsstring (vm -> context , str );
287
288
}
288
289
else {
289
- retval = copy_string ("{\"error\": \"non-JSON return value\", \"lineno\": 0, \"source\": \"unknown\"}" );
290
+ char * tmp = JS_EncodeString (vm -> context , JS_ValueToString (vm -> context , result ));
291
+ if (strcmp (tmp , "undefined" ) == 0 ) {
292
+ retval = copy_string ("{\"error\": \"Expression returned undefined\", \"lineno\": 0, \"source\": \"unknown\"}" );
293
+ }
294
+ else {
295
+ retval = copy_string ("{\"error\": \"non-JSON return value\", \"lineno\": 0, \"source\": \"unknown\"}" );
296
+ }
297
+ JS_free (vm -> context , tmp );
290
298
}
291
299
}
292
- JS_DestroyScript (vm -> context , script );
293
300
}
294
301
else {
295
302
retval = error_to_json (state -> error );
0 commit comments