Skip to content

[wip] update to spidermonkey 17 #44

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 3 commits into
base: develop
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
43 changes: 26 additions & 17 deletions c_src/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
UNAME := $(shell uname -s)
TAR ?= tar
GUNZIP ?= gunzip
SMONKEY_VER := 1.8.0-rc1
NSPR_VER := 4.8
SMONKEY_VER := mozjs17.0.0
NSPR_VER := 4.9.3

ifeq ($(UNAME),SunOS)
PATCH ?= gpatch
Expand All @@ -17,41 +17,50 @@ SYSTEM_DIR := $(CURDIR)/system
LIB_DIR := $(SYSTEM_DIR)/lib
INC_DIR := $(SYSTEM_DIR)/include

JS_DIR := $(CURDIR)/js
NSPR_DIR := $(CURDIR)/nsprpub
JS_DIR_BASE := $(CURDIR)/js
JS_DIR := $(JS_DIR_BASE)/js
NSPR_DIR := $(CURDIR)/nsprpub

# NSPR_SIXTYFOUR is defined in erlang_js/rebar.config

js: $(LIB_DIR)/libjs.a

$(LIB_DIR)/libjs.a: $(LIB_DIR)/libnspr4.a
$(GUNZIP) -c js-$(SMONKEY_VER).tar.gz | $(TAR) xf -
@for I in patches/js-*.patch; do \
($(PATCH) -p1 < $${I} || echo "Skipping patch"); \
done
$(GUNZIP) -c $(SMONKEY_VER).tar.gz | $(TAR) xf -
mv $(SMONKEY_VER) js
# @for I in patches/js-*.patch; do \
# ($(PATCH) -p1 < $${I} || echo "Skipping patch"); \
# done
(cd $(JS_DIR)/src/ && ./configure --enable-threadsafe --with-nspr-cflags='-I$(INC_DIR)/nspr' --with-nspr-libs="-L$(LIB_DIR) -lplds4 -lplc4 -lnspr4 -lpthread -ldl -lm -lz -ldl")

@$(MAKE) -C $(JS_DIR)/src BUILD_OPT=1 JS_DIST=$(SYSTEM_DIR) \
JS_THREADSAFE=1 \
XCFLAGS="-DHAVE_VA_COPY -DVA_COPY=va_copy $(CFLAGS)" \
XLDFLAGS="$(LDFLAGS)" \
-f Makefile.ref
XLDFLAGS="$(LDFLAGS) -lplds4 -lplc4 -lnspr4 -lpthread -ldl -lm -lz -ldl -lstdc++"
@mkdir $(INC_DIR)/js
@cp $(JS_DIR)/src/*.h $(INC_DIR)/js
@cp -r $(JS_DIR)/src/gc $(INC_DIR)/js
@cp -r $(JS_DIR)/src/ds $(INC_DIR)/js
@cp -r $(JS_DIR)/public/ $(INC_DIR)/js/js/
@cp -r $(JS_DIR_BASE)/mfbt $(INC_DIR)/js/mozilla
@cp $(JS_DIR)/src/*.tbl $(INC_DIR)/js
@cp $(JS_DIR)/src/*_OPT.OBJ/*.h $(INC_DIR)/js
@cp $(JS_DIR)/src/*_OPT.OBJ/libjs.a $(LIB_DIR)
# @cp $(JS_DIR)/src/*_OPT.OBJ/*.h $(INC_DIR)/js
@cp $(JS_DIR)/src/libjs_static.a $(LIB_DIR)/libjs.a

$(LIB_DIR)/libnspr4.a:
$(GUNZIP) -c nsprpub-$(NSPR_VER).tar.gz | $(TAR) xf -
@for I in patches/nspr-*.patch; do \
($(PATCH) -p1 < $${I} || echo "Skipping patch"); \
done
$(GUNZIP) -c nspr-$(NSPR_VER).tar.gz | $(TAR) xf -
mv nspr-$(NSPR_VER)/mozilla/nsprpub .
rm -rf nspr-$(NSPR_VER)
# @for I in patches/nspr-*.patch; do \
# ($(PATCH) -p1 < $${I} || echo "Skipping patch"); \
# done
(cd $(NSPR_DIR) && \
./configure --disable-debug --enable-optimize \
--prefix=$(SYSTEM_DIR) $(NSPR_SIXTYFOUR) && \
$(MAKE) all install)

clean:
@rm -rf $(SYSTEM_DIR) $(NSPR_DIR) $(JS_DIR)
@rm -rf $(SYSTEM_DIR) $(NSPR_DIR) $(JS_DIR_BASE)
@rm -rf *flymake*

nspryoink: deps
Expand Down
Binary file removed c_src/js-1.8.0-rc1.tar.gz
Binary file not shown.
Binary file added c_src/mozjs17.0.0.tar.gz
Binary file not shown.
Binary file added c_src/nspr-4.9.3.tar.gz
Binary file not shown.
Binary file removed c_src/nsprpub-4.8.tar.gz
Binary file not shown.
61 changes: 37 additions & 24 deletions c_src/spidermonkey.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,9 +28,10 @@ void free_error(spidermonkey_state *state);
/* The class of the global object. */
static JSClass global_class = {
"global", JSCLASS_GLOBAL_FLAGS,
JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_PropertyStub,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, JS_FinalizeStub,
JSCLASS_NO_OPTIONAL_MEMBERS
JS_PropertyStub, JS_PropertyStub, JS_PropertyStub, JS_StrictPropertyStub,
JS_EnumerateStub, JS_ResolveStub, JS_ConvertStub, NULL,
NULL /* checkAccess */, NULL /* call */, NULL /* hasInstance */, NULL /* construct */, NULL,
{ NULL }
};

char *copy_string(const char *source) {
Expand All @@ -41,19 +42,23 @@ char *copy_string(const char *source) {
return retval;
}

char *copy_jsstring(JSString *source) {
char *buf = JS_GetStringBytes(source);
return copy_string(buf);
char *copy_jsstring(JSContext *cx, JSString *source) {
char *buf = JS_EncodeString(cx, source);
char *retval = copy_string(buf);
JS_free(cx, buf);
return retval;
}

void begin_request(spidermonkey_vm *vm) {
JS_SetContextThread(vm->context);
//XXX: not available
//JS_SetContextThread(vm->context);
JS_BeginRequest(vm->context);
}

void end_request(spidermonkey_vm *vm) {
JS_EndRequest(vm->context);
JS_ClearContextThread(vm->context);
//XXX: not available
//JS_ClearContextThread(vm->context);
}

void on_error(JSContext *context, const char *message, JSErrorReport *report) {
Expand All @@ -78,7 +83,7 @@ void on_error(JSContext *context, const char *message, JSErrorReport *report) {
}
}

JSBool on_branch(JSContext *context, JSScript *script) {
JSBool on_branch(JSContext *context) {
JSBool return_value = JS_TRUE;
spidermonkey_state *state = (spidermonkey_state *) JS_GetContextPrivate(context);
state->branch_count++;
Expand All @@ -87,7 +92,7 @@ JSBool on_branch(JSContext *context, JSScript *script) {
return_value = JS_FALSE;
}
else if (state->branch_count == 550) {
JS_GC(context);
JS_GC(JS_GetRuntime(context));
state->branch_count = 0;
}
else if(state->branch_count % 100 == 0) {
Expand All @@ -108,16 +113,18 @@ void write_timestamp(FILE *fd) {
tmp->tm_hour, tmp->tm_min, tmp->tm_sec);
}

JSBool js_log(JSContext *cx, uintN argc, jsval *vp) {
// under mozjs17, 'uintN' has been deprecated in favor of 'unsigned'
// http://sourceforge.net/p/mediatomb/discussion/440751/thread/9945a07d/#177d
JSBool js_log(JSContext *cx, unsigned argc, jsval *vp) {
if (argc != 2) {
JS_SET_RVAL(cx, vp, JSVAL_FALSE);
}
else {
jsval *argv = JS_ARGV(cx, vp);
jsval jsfilename = argv[0];
jsval jsoutput = argv[1];
char *filename = JS_GetStringBytes(JS_ValueToString(cx, jsfilename));
char *output = JS_GetStringBytes(JS_ValueToString(cx, jsoutput));
char *filename = JS_EncodeString(cx, JS_ValueToString(cx, jsfilename));
char *output = JS_EncodeString(cx, JS_ValueToString(cx, jsoutput));
FILE *fd = fopen(filename, "a+");
if (fd != NULL) {
write_timestamp(fd);
Expand All @@ -130,7 +137,7 @@ JSBool js_log(JSContext *cx, uintN argc, jsval *vp) {
JS_SET_RVAL(cx, vp, JSVAL_FALSE);
}
}
return JSVAL_TRUE;
return JS_TRUE;
}

void sm_configure_locale(void) {
Expand All @@ -148,21 +155,23 @@ spidermonkey_vm *sm_initialize(long thread_stack, long heap_size) {
JS_SetGCParameter(vm->runtime, JSGC_MAX_BYTES, heap_size);
JS_SetGCParameter(vm->runtime, JSGC_MAX_MALLOC_BYTES, gc_size);
vm->context = JS_NewContext(vm->runtime, 8192);
JS_SetScriptStackQuota(vm->context, thread_stack);
// XXX: changed from JS_SetNativeStackQuota, don't know if it's ok
JS_SetNativeStackQuota(JS_GetRuntime(vm->context), thread_stack);

begin_request(vm);
JS_SetOptions(vm->context, JSOPTION_VAROBJFIX);
JS_SetOptions(vm->context, JSOPTION_STRICT);
JS_SetOptions(vm->context, JSOPTION_COMPILE_N_GO);
JS_SetOptions(vm->context, JSVERSION_LATEST);
vm->global = JS_NewObject(vm->context, &global_class, NULL, NULL);

vm->global = JS_NewGlobalObject(vm->context, &global_class, NULL);
JS_InitStandardClasses(vm->context, vm->global);
JS_SetErrorReporter(vm->context, on_error);
JS_SetBranchCallback(vm->context, on_branch);
JS_SetOperationCallback(vm->context, on_branch);
JS_SetContextPrivate(vm->context, state);
JSNative funptr = (JSNative) &js_log;
JS_DefineFunction(vm->context, JS_GetGlobalObject(vm->context), "ejsLog", funptr,
0, JSFUN_FAST_NATIVE);
0, 0);
end_request(vm);

return vm;
Expand Down Expand Up @@ -280,16 +289,20 @@ char *sm_eval(spidermonkey_vm *vm, const char *filename, const char *code, int h
if (handle_retval) {
if (JSVAL_IS_STRING(result)) {
JSString *str = JS_ValueToString(vm->context, result);
retval = copy_jsstring(str);
}
else if(strcmp(JS_GetStringBytes(JS_ValueToString(vm->context, result)), "undefined") == 0) {
retval = copy_string("{\"error\": \"Expression returned undefined\", \"lineno\": 0, \"source\": \"unknown\"}");
retval = copy_jsstring(vm->context, str);
}
else {
retval = copy_string("{\"error\": \"non-JSON return value\", \"lineno\": 0, \"source\": \"unknown\"}");
char *tmp = JS_EncodeString(vm->context, JS_ValueToString(vm->context, result));
if(strcmp(tmp, "undefined") == 0) {
retval = copy_string("{\"error\": \"Expression returned undefined\", \"lineno\": 0, \"source\": \"unknown\"}");
}
else {
retval = copy_string("{\"error\": \"non-JSON return value\", \"lineno\": 0, \"source\": \"unknown\"}");
}

JS_free(vm->context, tmp);
}
}
JS_DestroyScript(vm->context, script);
}
else {
retval = error_to_json(state->error);
Expand Down
2 changes: 1 addition & 1 deletion rebar.config
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@

{port_env, [
{"DRV_CFLAGS", "$DRV_CFLAGS -I c_src/system/include/js -DXP_UNIX -Wall"},
{"DRV_LDFLAGS", "$DRV_LDFLAGS c_src/system/lib/libjs.a c_src/system/lib/libnspr4.a"},
{"DRV_LDFLAGS", "$DRV_LDFLAGS c_src/system/lib/libjs.a c_src/system/lib/libnspr4.a -lstdc++"},

%% Define flags for enabling/disable 64 bit build of NSPR
{"-32$", "NSPR_SIXTYFOUR", "--disable-64bit"},
Expand Down