Skip to content

Commit d6d36db

Browse files
stranskylemenkov
authored andcommitted
build fix for js 1.8.5
1 parent ea4f032 commit d6d36db

File tree

1 file changed

+24
-17
lines changed

1 file changed

+24
-17
lines changed

c_src/spidermonkey.c

+24-17
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ void free_error(spidermonkey_state *state);
2828
/* The class of the global object. */
2929
static JSClass global_class = {
3030
"global", JSCLASS_GLOBAL_FLAGS,
31-
JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub,
31+
JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_StrictPropertyStub,
3232
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub,
3333
JSCLASS_NO_OPTIONAL_MEMBERS
3434
};
@@ -41,9 +41,11 @@ char *copy_string(const char *source) {
4141
return retval;
4242
}
4343

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;
4749
}
4850

4951
void begin_request(spidermonkey_vm *vm) {
@@ -78,7 +80,7 @@ void on_error(JSContext *context, const char *message, JSErrorReport *report) {
7880
}
7981
}
8082

81-
JSBool on_branch(JSContext *context, JSScript *script) {
83+
JSBool on_branch(JSContext *context) {
8284
JSBool return_value = JS_TRUE;
8385
spidermonkey_state *state = (spidermonkey_state *) JS_GetContextPrivate(context);
8486
state->branch_count++;
@@ -116,8 +118,8 @@ JSBool js_log(JSContext *cx, uintN argc, jsval *vp) {
116118
jsval *argv = JS_ARGV(cx, vp);
117119
jsval jsfilename = argv[0];
118120
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));
121123
FILE *fd = fopen(filename, "a+");
122124
if (fd != NULL) {
123125
write_timestamp(fd);
@@ -129,6 +131,8 @@ JSBool js_log(JSContext *cx, uintN argc, jsval *vp) {
129131
else {
130132
JS_SET_RVAL(cx, vp, JSVAL_FALSE);
131133
}
134+
JS_free(cx, filename);
135+
JS_free(cx, output);
132136
}
133137
return JSVAL_TRUE;
134138
}
@@ -155,14 +159,14 @@ spidermonkey_vm *sm_initialize(long thread_stack, long heap_size) {
155159
JS_SetOptions(vm->context, JSOPTION_STRICT);
156160
JS_SetOptions(vm->context, JSOPTION_COMPILE_N_GO);
157161
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);
159163
JS_InitStandardClasses(vm->context, vm->global);
160164
JS_SetErrorReporter(vm->context, on_error);
161-
JS_SetBranchCallback(vm->context, on_branch);
165+
JS_SetOperationCallback(vm->context, on_branch);
162166
JS_SetContextPrivate(vm->context, state);
163167
JSNative funptr = (JSNative) &js_log;
164168
JS_DefineFunction(vm->context, JS_GetGlobalObject(vm->context), "ejsLog", funptr,
165-
0, JSFUN_FAST_NATIVE);
169+
0, 0);
166170
end_request(vm);
167171

168172
return vm;
@@ -259,7 +263,7 @@ void free_error(spidermonkey_state *state) {
259263

260264
char *sm_eval(spidermonkey_vm *vm, const char *filename, const char *code, int handle_retval) {
261265
char *retval = NULL;
262-
JSScript *script;
266+
JSObject *script;
263267
jsval result;
264268

265269
if (code == NULL) {
@@ -280,16 +284,19 @@ char *sm_eval(spidermonkey_vm *vm, const char *filename, const char *code, int h
280284
if (handle_retval) {
281285
if (JSVAL_IS_STRING(result)) {
282286
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);
287288
}
288289
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);
290298
}
291299
}
292-
JS_DestroyScript(vm->context, script);
293300
}
294301
else {
295302
retval = error_to_json(state->error);

0 commit comments

Comments
 (0)