From 9c5d941e37d5777ec6f2571998de84d5a4d768de Mon Sep 17 00:00:00 2001 From: deuce <> Date: Mon, 8 Dec 2008 07:44:32 +0000 Subject: [PATCH] Move towards shared runtimes... --- src/sbbs3/js_global.c | 192 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 182 insertions(+), 10 deletions(-) diff --git a/src/sbbs3/js_global.c b/src/sbbs3/js_global.c index 5bcbd40b2a..9826ef9775 100644 --- a/src/sbbs3/js_global.c +++ b/src/sbbs3/js_global.c @@ -227,6 +227,7 @@ js_load(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) JSBool success; JSBool background=JS_FALSE; background_data_t* bg; + jsrefcount rc; *rval=JSVAL_VOID; @@ -330,6 +331,7 @@ js_load(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ,NULL,NULL,JSPROP_ENUMERATE|JSPROP_READONLY); } + rc=JS_SuspendRequest(cx); errno = 0; if(isfullpath(filename)) strcpy(path,filename); @@ -338,6 +340,7 @@ js_load(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) if(p->cfg->mods_dir[0]==0 || !fexistcase(path)) sprintf(path,"%s%s",p->cfg->exec_dir,filename); } + JS_ResumeRequest(cx, rc); JS_ClearPendingException(exec_cx); @@ -384,14 +387,17 @@ static JSBool js_yield(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { BOOL forced=TRUE; + jsrefcount rc; if(argc) JS_ValueToBoolean(cx, argv[0], &forced); + rc=JS_SuspendRequest(cx); if(forced) { YIELD(); } else { MAYBE_YIELD(); } + JS_ResumeRequest(cx, rc); return(JS_TRUE); } @@ -401,10 +407,13 @@ js_mswait(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { int32 val=1; clock_t start=msclock(); + jsrefcount rc; if(argc) JS_ValueToInt32(cx,argv[0],&val); + rc=JS_SuspendRequest(cx); mswait(val); + JS_ResumeRequest(cx, rc); JS_NewNumberValue(cx,msclock()-start,rval); @@ -436,13 +445,16 @@ js_beep(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { int32 freq=500; int32 dur=500; + jsrefcount rc; if(argc) JS_ValueToInt32(cx,argv[0],&freq); if(argc>1) JS_ValueToInt32(cx,argv[1],&dur); + rc=JS_SuspendRequest(cx); sbbs_beep(freq,dur); + JS_ResumeRequest(cx, rc); return(JS_TRUE); } @@ -461,6 +473,7 @@ js_crc16(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { char* p; size_t len; + jsrefcount rc; if(JSVAL_IS_VOID(argv[0])) return(JS_TRUE); @@ -468,7 +481,9 @@ js_crc16(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) if((p=js_ValueToStringBytes(cx, argv[0], &len))==NULL) return(JS_FALSE); + rc=JS_SuspendRequest(cx); *rval = INT_TO_JSVAL(crc16(p,len)); + JS_ResumeRequest(cx, rc); return(JS_TRUE); } @@ -477,6 +492,10 @@ js_crc32(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { char* p; size_t len; + uint32_t cs; + jsrefcount rc; + rc=JS_SuspendRequest(cx); + JS_ResumeRequest(cx, rc); if(JSVAL_IS_VOID(argv[0])) return(JS_TRUE); @@ -484,7 +503,10 @@ js_crc32(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) if((p=js_ValueToStringBytes(cx, argv[0], &len))==NULL) return(JS_FALSE); - JS_NewNumberValue(cx,crc32(p,len),rval); + cs=crc32(p,len); + rc=JS_SuspendRequest(cx); + JS_NewNumberValue(cx,cs,rval); + JS_ResumeRequest(cx, rc); return(JS_TRUE); } @@ -494,6 +516,7 @@ js_chksum(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ulong sum=0; char* p; size_t len; + jsrefcount rc; if(JSVAL_IS_VOID(argv[0])) return(JS_TRUE); @@ -501,7 +524,9 @@ js_chksum(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) if((p=js_ValueToStringBytes(cx, argv[0], &len))==NULL) return(JS_FALSE); + rc=JS_SuspendRequest(cx); while(len--) sum+=*(p++); + JS_ResumeRequest(cx, rc); JS_NewNumberValue(cx,sum,rval); return(JS_TRUE); @@ -839,6 +864,7 @@ js_word_wrap(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) int old_prefix_bytes=0; int outbuf_size=0; JSString* js_str; + jsrefcount rc; if(JSVAL_IS_VOID(argv[0])) return(JS_TRUE); @@ -870,6 +896,7 @@ js_word_wrap(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) } prefix[0]=0; } + rc=JS_SuspendRequest(cx); outbuf[0]=0; /* Get prefix from the first line (ouch) */ @@ -1071,6 +1098,7 @@ js_word_wrap(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) } } + JS_ResumeRequest(cx, rc); js_str = JS_NewStringCopyZ(cx, outbuf); free(outbuf); free(linebuf); @@ -1093,6 +1121,7 @@ js_quote_msg(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) char* linebuf; char* prefix=" > "; JSString* js_str; + jsrefcount rc; if(JSVAL_IS_VOID(argv[0])) return(JS_TRUE); @@ -1116,6 +1145,7 @@ js_quote_msg(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) if((linebuf=(char*)alloca(len*2+2))==NULL) /* (Hopefully) Room for ^A codes. ToDo */ return(JS_FALSE); + rc=JS_SuspendRequest(cx); outbuf[0]=0; clen=0; for(i=l=0;inbuf[i];i++) { @@ -1139,6 +1169,7 @@ js_quote_msg(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) } if(l) /* remainder */ strncat(outbuf,linebuf,l); + JS_ResumeRequest(cx, rc); js_str = JS_NewStringCopyZ(cx, outbuf); free(outbuf); @@ -1409,6 +1440,7 @@ js_html_encode(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rva ulong clear_screen=0; JSObject* stateobj=NULL; jsval val; + jsrefcount rc; if(JSVAL_IS_VOID(argv[0])) return(JS_TRUE); @@ -1472,6 +1504,7 @@ js_html_encode(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rva if((tmpbuf=(char*)malloc((strlen(inbuf)*10)+1))==NULL) return(JS_FALSE); + rc=JS_SuspendRequest(cx); for(i=j=0;inbuf[i];i++) { switch(inbuf[i]) { case TAB: @@ -1549,6 +1582,7 @@ js_html_encode(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rva if((outbuf=(uchar*)malloc(obsize))==NULL) { free(tmpbuf); + rc=JS_SuspendRequest(cx); return(JS_FALSE); } j=sprintf(outbuf,"<span style=\"%s\">",htmlansi[7]); @@ -1561,6 +1595,7 @@ js_html_encode(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rva { free(tmpbuf); free(outbuf); + rc=JS_SuspendRequest(cx); return(JS_FALSE); } outbuf=param; @@ -2014,12 +2049,15 @@ js_html_encode(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rva } } strcpy(outbuf+j,"</span>"); + rc=JS_SuspendRequest(cx); js_str = JS_NewStringCopyZ(cx, outbuf); free(outbuf); } - else + else { + rc=JS_SuspendRequest(cx); js_str = JS_NewStringCopyZ(cx, tmpbuf); + } free(tmpbuf); /* assertion here, Feb-20-2006 */ if(js_str==NULL) @@ -2064,6 +2102,7 @@ js_html_decode(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rva char token[16]; size_t t; JSString* js_str; + jsrefcount rc; if(JSVAL_IS_VOID(argv[0])) return(JS_TRUE); @@ -2074,6 +2113,7 @@ js_html_decode(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rva if((outbuf=(char*)malloc(strlen(inbuf)+1))==NULL) return(JS_FALSE); + rc=JS_SuspendRequest(cx); for(i=j=0;inbuf[i];i++) { if(inbuf[i]!='&') { outbuf[j++]=inbuf[i]; @@ -2143,6 +2183,7 @@ js_html_decode(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rva } outbuf[j]=0; + JS_ResumeRequest(cx, rc); js_str = JS_NewStringCopyZ(cx, outbuf); free(outbuf); @@ -2162,6 +2203,7 @@ js_b64_encode(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval uchar* inbuf; uchar* outbuf; JSString* js_str; + jsrefcount rc; *rval = JSVAL_NULL; @@ -2176,7 +2218,9 @@ js_b64_encode(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval if((outbuf=(char*)malloc(len))==NULL) return(JS_FALSE); + rc=JS_SuspendRequest(cx); res=b64_encode(outbuf,len,inbuf,inbuf_len); + JS_ResumeRequest(cx, rc); if(res<1) { free(outbuf); @@ -2200,6 +2244,7 @@ js_b64_decode(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval uchar* inbuf; uchar* outbuf; JSString* js_str; + jsrefcount rc; *rval = JSVAL_NULL; @@ -2214,7 +2259,9 @@ js_b64_decode(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval if((outbuf=(char*)malloc(len))==NULL) return(JS_FALSE); + rc=JS_SuspendRequest(cx); res=b64_decode(outbuf,len,inbuf,strlen(inbuf)); + JS_ResumeRequest(cx, rc); if(res<1) { free(outbuf); @@ -2239,6 +2286,7 @@ js_md5_calc(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval) char* inbuf; char outbuf[64]; JSString* js_str; + jsrefcount rc; *rval = JSVAL_NULL; @@ -2251,12 +2299,14 @@ js_md5_calc(JSContext* cx, JSObject* obj, uintN argc, jsval* argv, jsval* rval) if(argc>1 && JSVAL_IS_BOOLEAN(argv[1])) hex=JSVAL_TO_BOOLEAN(argv[1]); + rc=JS_SuspendRequest(cx); MD5_calc(digest,inbuf,inbuf_len); if(hex) MD5_hex(outbuf,digest); else b64_encode(outbuf,sizeof(outbuf),digest,sizeof(digest)); + JS_ResumeRequest(cx, rc); js_str = JS_NewStringCopyZ(cx, outbuf); if(js_str==NULL) @@ -2373,6 +2423,7 @@ js_fullpath(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) char path[MAX_PATH+1]; char* str; JSString* js_str; + jsrefcount rc; if(JSVAL_IS_VOID(argv[0])) return(JS_TRUE); @@ -2381,7 +2432,9 @@ js_fullpath(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) return(JS_FALSE); SAFECOPY(path,str); + rc=JS_SuspendRequest(cx); _fullpath(path, str, sizeof(path)); + JS_ResumeRequest(cx, rc); if((js_str = JS_NewStringCopyZ(cx, path))==NULL) return(JS_FALSE); @@ -2441,6 +2494,8 @@ js_getfcase(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) char* str; char path[MAX_PATH+1]; JSString* js_str; + jsrefcount rc; + rc=JS_SuspendRequest(cx); if(JSVAL_IS_VOID(argv[0])) return(JS_TRUE); @@ -2449,13 +2504,17 @@ js_getfcase(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) return(JS_FALSE); SAFECOPY(path,str); + rc=JS_SuspendRequest(cx); if(fexistcase(path)) { + JS_ResumeRequest(cx, rc); js_str = JS_NewStringCopyZ(cx, path); if(js_str==NULL) return(JS_FALSE); *rval = STRING_TO_JSVAL(js_str); } + else + JS_ResumeRequest(cx, rc); return(JS_TRUE); } @@ -2465,6 +2524,7 @@ js_dosfname(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) char* str; char path[MAX_PATH+1]; JSString* js_str; + jsrefcount rc; if(JSVAL_IS_VOID(argv[0])) return(JS_TRUE); @@ -2474,13 +2534,17 @@ js_dosfname(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) if((str=js_ValueToStringBytes(cx, argv[0], NULL))==NULL) return(JS_FALSE); + rc=JS_SuspendRequest(cx); if(GetShortPathName(str,path,sizeof(path))) { + JS_ResumeRequest(cx, rc); js_str = JS_NewStringCopyZ(cx, path); if(js_str==NULL) return(JS_FALSE); *rval = STRING_TO_JSVAL(js_str); } + else + JS_ResumeRequest(cx, rc); #else /* No non-Windows equivalent */ @@ -2497,6 +2561,10 @@ js_cfgfname(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) char* path; char* fname; char result[MAX_PATH+1]; + char* cstr; + jsrefcount rc; + rc=JS_SuspendRequest(cx); + JS_ResumeRequest(cx, rc); if(JSVAL_IS_VOID(argv[0])) return(JS_TRUE); @@ -2507,7 +2575,10 @@ js_cfgfname(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) if((fname=js_ValueToStringBytes(cx, argv[1], NULL))==NULL) return(JS_FALSE); - *rval = STRING_TO_JSVAL(JS_NewStringCopyZ(cx,iniFileName(result,sizeof(result),path,fname))); + rc=JS_SuspendRequest(cx); + cstr = iniFileName(result,sizeof(result),path,fname); + JS_ResumeRequest(cx, rc); + *rval = STRING_TO_JSVAL(JS_NewStringCopyZ(cx,cstr)); return(JS_TRUE); } @@ -2516,6 +2587,7 @@ static JSBool js_fexist(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { char* p; + jsrefcount rc; if(JSVAL_IS_VOID(argv[0])) return(JS_TRUE); @@ -2523,7 +2595,9 @@ js_fexist(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) if((p=js_ValueToStringBytes(cx, argv[0], NULL))==NULL) return(JS_FALSE); + rc=JS_SuspendRequest(cx); *rval = BOOLEAN_TO_JSVAL(fexist(p)); + JS_ResumeRequest(cx, rc); return(JS_TRUE); } @@ -2531,6 +2605,7 @@ static JSBool js_removecase(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { char* p; + jsrefcount rc; if(JSVAL_IS_VOID(argv[0])) return(JS_TRUE); @@ -2538,7 +2613,9 @@ js_removecase(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval if((p=js_ValueToStringBytes(cx, argv[0], NULL))==NULL) return(JS_FALSE); + rc=JS_SuspendRequest(cx); *rval = BOOLEAN_TO_JSVAL(removecase(p)==0); + JS_ResumeRequest(cx, rc); return(JS_TRUE); } @@ -2546,6 +2623,7 @@ static JSBool js_remove(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { char* p; + jsrefcount rc; if(JSVAL_IS_VOID(argv[0])) return(JS_TRUE); @@ -2553,7 +2631,9 @@ js_remove(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) if((p=js_ValueToStringBytes(cx, argv[0], NULL))==NULL) return(JS_FALSE); + rc=JS_SuspendRequest(cx); *rval = BOOLEAN_TO_JSVAL(remove(p)==0); + JS_ResumeRequest(cx, rc); return(JS_TRUE); } @@ -2562,6 +2642,7 @@ js_rename(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { char* oldname; char* newname; + jsrefcount rc; if(JSVAL_IS_VOID(argv[0])) return(JS_TRUE); @@ -2572,7 +2653,9 @@ js_rename(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) if((newname=js_ValueToStringBytes(cx, argv[1], NULL))==NULL) return(JS_TRUE); + rc=JS_SuspendRequest(cx); *rval = BOOLEAN_TO_JSVAL(rename(oldname,newname)==0); + JS_ResumeRequest(cx, rc); return(JS_TRUE); } @@ -2581,6 +2664,7 @@ js_fcopy(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { char* src; char* dest; + jsrefcount rc; if(JSVAL_IS_VOID(argv[0])) return(JS_TRUE); @@ -2591,7 +2675,9 @@ js_fcopy(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) if((dest=js_ValueToStringBytes(cx, argv[1], NULL))==NULL) return(JS_TRUE); + rc=JS_SuspendRequest(cx); *rval = BOOLEAN_TO_JSVAL(fcopy(src,dest)); + JS_ResumeRequest(cx, rc); return(JS_TRUE); } @@ -2600,6 +2686,7 @@ js_fcompare(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { char* fn1; char* fn2; + jsrefcount rc; if(JSVAL_IS_VOID(argv[0])) return(JS_TRUE); @@ -2610,7 +2697,9 @@ js_fcompare(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) if((fn2=js_ValueToStringBytes(cx, argv[1], NULL))==NULL) return(JS_TRUE); + rc=JS_SuspendRequest(cx); *rval = BOOLEAN_TO_JSVAL(fcompare(fn1,fn2)); + JS_ResumeRequest(cx, rc); return(JS_TRUE); } @@ -2620,6 +2709,7 @@ js_backup(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) char* fname; int32 level=5; BOOL ren=FALSE; + jsrefcount rc; if(JSVAL_IS_VOID(argv[0])) return(JS_TRUE); @@ -2633,7 +2723,9 @@ js_backup(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) if(argc>2) JS_ValueToBoolean(cx,argv[2],&ren); + rc=JS_SuspendRequest(cx); *rval = BOOLEAN_TO_JSVAL(backup(fname,level,ren)); + JS_ResumeRequest(cx, rc); return(JS_TRUE); } @@ -2641,6 +2733,7 @@ static JSBool js_isdir(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { char* p; + jsrefcount rc; if(JSVAL_IS_VOID(argv[0])) return(JS_TRUE); @@ -2648,7 +2741,9 @@ js_isdir(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) if((p=js_ValueToStringBytes(cx, argv[0], NULL))==NULL) return(JS_FALSE); + rc=JS_SuspendRequest(cx); *rval = BOOLEAN_TO_JSVAL(isdir(p)); + JS_ResumeRequest(cx, rc); return(JS_TRUE); } @@ -2656,6 +2751,8 @@ static JSBool js_fattr(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { char* p; + jsrefcount rc; + int attr; if(JSVAL_IS_VOID(argv[0])) return(JS_TRUE); @@ -2663,7 +2760,10 @@ js_fattr(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) if((p=js_ValueToStringBytes(cx, argv[0], NULL))==NULL) return(JS_FALSE); - JS_NewNumberValue(cx,getfattr(p),rval); + rc=JS_SuspendRequest(cx); + attr=getfattr(p); + JS_ResumeRequest(cx, rc); + JS_NewNumberValue(cx,attr,rval); return(JS_TRUE); } @@ -2671,6 +2771,8 @@ static JSBool js_fdate(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { char* p; + time_t fd; + jsrefcount rc; if(JSVAL_IS_VOID(argv[0])) return(JS_TRUE); @@ -2678,7 +2780,10 @@ js_fdate(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) if((p=js_ValueToStringBytes(cx, argv[0], NULL))==NULL) return(JS_FALSE); - JS_NewNumberValue(cx,fdate(p),rval); + rc=JS_SuspendRequest(cx); + fd=fdate(p); + JS_ResumeRequest(cx, rc); + JS_NewNumberValue(cx,fd,rval); return(JS_TRUE); } @@ -2689,6 +2794,7 @@ js_utime(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) int32 actime; int32 modtime; struct utimbuf ut; + jsrefcount rc; if(JSVAL_IS_VOID(argv[0])) return(JS_TRUE); @@ -2709,7 +2815,9 @@ js_utime(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) ut.modtime=modtime; } + rc=JS_SuspendRequest(cx); *rval = BOOLEAN_TO_JSVAL(utime(fname,&ut)==0); + JS_ResumeRequest(cx, rc); return(JS_TRUE); } @@ -2719,6 +2827,8 @@ static JSBool js_flength(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { char* p; + long fl; + jsrefcount rc; if(JSVAL_IS_VOID(argv[0])) return(JS_TRUE); @@ -2726,7 +2836,10 @@ js_flength(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) if((p=js_ValueToStringBytes(cx, argv[0], NULL))==NULL) return(JS_FALSE); - JS_NewNumberValue(cx,flength(p),rval); + rc=JS_SuspendRequest(cx); + fl=flength(p); + JS_ResumeRequest(cx, rc); + JS_NewNumberValue(cx,fl,rval); return(JS_TRUE); } @@ -2735,6 +2848,7 @@ static JSBool js_ftouch(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { char* fname; + jsrefcount rc; if(JSVAL_IS_VOID(argv[0])) return(JS_TRUE); @@ -2742,7 +2856,9 @@ js_ftouch(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) if((fname=js_ValueToStringBytes(cx, argv[0], NULL))==NULL) return(JS_FALSE); + rc=JS_SuspendRequest(cx); *rval = BOOLEAN_TO_JSVAL(ftouch(fname)); + JS_ResumeRequest(cx, rc); return(JS_TRUE); } @@ -2753,6 +2869,7 @@ js_fmutex(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) char* text=NULL; int32 max_age=0; uintN argn=0; + jsrefcount rc; if(JSVAL_IS_VOID(argv[0])) return(JS_TRUE); @@ -2764,7 +2881,9 @@ js_fmutex(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) if(argc > argn && JSVAL_IS_NUMBER(argv[argn])) JS_ValueToInt32(cx, argv[argn++], &max_age); + rc=JS_SuspendRequest(cx); *rval = BOOLEAN_TO_JSVAL(fmutex(fname,text,max_age)); + JS_ResumeRequest(cx, rc); return(JS_TRUE); } @@ -2772,6 +2891,7 @@ static JSBool js_sound(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { char* p; + jsrefcount rc; if(!argc) { /* Stop playing sound */ #ifdef _WIN32 @@ -2787,11 +2907,13 @@ js_sound(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) if((p=js_ValueToStringBytes(cx, argv[0], NULL))==NULL) return(JS_FALSE); + rc=JS_SuspendRequest(cx); #ifdef _WIN32 *rval = BOOLEAN_TO_JSVAL(PlaySound(p, NULL, SND_ASYNC|SND_FILENAME)); #else *rval = BOOLEAN_TO_JSVAL(JS_FALSE); #endif + JS_ResumeRequest(cx, rc); return(JS_TRUE); } @@ -2807,6 +2929,7 @@ js_directory(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) JSString* js_str; jsint len=0; jsval val; + jsrefcount rc; if(JSVAL_IS_VOID(argv[0])) return(JS_TRUE); @@ -2822,7 +2945,9 @@ js_directory(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) if((array = JS_NewArrayObject(cx, 0, NULL))==NULL) return(JS_FALSE); + rc=JS_SuspendRequest(cx); glob(p,flags,NULL,&g); + JS_ResumeRequest(cx, rc); for(i=0;i<(int)g.gl_pathc;i++) { if((js_str=JS_NewStringCopyZ(cx,g.gl_pathv[i]))==NULL) break; @@ -2830,7 +2955,9 @@ js_directory(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) if(!JS_SetElement(cx, array, len++, &val)) break; } + rc=JS_SuspendRequest(cx); globfree(&g); + JS_ResumeRequest(cx, rc); *rval = OBJECT_TO_JSVAL(array); @@ -2845,6 +2972,7 @@ js_wildmatch(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) char* fname; char* spec="*"; uintN argn=0; + jsrefcount rc; if(JSVAL_IS_BOOLEAN(argv[argn])) JS_ValueToBoolean(cx, argv[argn++], &case_sensitive); @@ -2859,10 +2987,12 @@ js_wildmatch(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) if(argn<argc && argv[argn]!=JSVAL_VOID) JS_ValueToBoolean(cx, argv[argn++], &path); + rc=JS_SuspendRequest(cx); if(case_sensitive) *rval = BOOLEAN_TO_JSVAL(wildmatch(fname, spec, path)); else *rval = BOOLEAN_TO_JSVAL(wildmatchi(fname, spec, path)); + JS_ResumeRequest(cx, rc); return(JS_TRUE); } @@ -2873,6 +3003,8 @@ js_freediskspace(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *r { int32 unit=0; char* p; + ulong fd; + jsrefcount rc; if(JSVAL_IS_VOID(argv[0])) return(JS_TRUE); @@ -2883,7 +3015,10 @@ js_freediskspace(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *r if(argc>1) JS_ValueToInt32(cx,argv[1],&unit); - JS_NewNumberValue(cx,getfreediskspace(p,unit),rval); + rc=JS_SuspendRequest(cx); + fd=getfreediskspace(p,unit); + JS_ResumeRequest(cx, rc); + JS_NewNumberValue(cx,fd,rval); return(JS_TRUE); } @@ -2893,6 +3028,8 @@ js_disksize(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { int32 unit=0; char* p; + ulong ds; + jsrefcount rc; if(JSVAL_IS_VOID(argv[0])) return(JS_TRUE); @@ -2903,7 +3040,10 @@ js_disksize(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) if(argc>1) JS_ValueToInt32(cx,argv[1],&unit); - JS_NewNumberValue(cx,getdisksize(p,unit),rval); + rc=JS_SuspendRequest(cx); + ds=getdisksize(p,unit); + JS_ResumeRequest(cx, rc); + JS_NewNumberValue(cx,ds,rval); return(JS_TRUE); } @@ -2927,6 +3067,7 @@ js_socket_select(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *r SOCKET* index; jsval val; int len=0; + jsrefcount rc; *rval = JSVAL_NULL; @@ -2970,18 +3111,24 @@ js_socket_select(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *r } } + rc=JS_SuspendRequest(cx); if(select(maxsock+1,rd_set,wr_set,NULL,&tv) >= 0) { for(i=0;i<limit;i++) { if(index[i]!=INVALID_SOCKET && FD_ISSET(index[i],&socket_set)) { val=INT_TO_JSVAL(i); - if(!JS_SetElement(cx, rarray, len++, &val)) + JS_ResumeRequest(cx, rc); + if(!JS_SetElement(cx, rarray, len++, &val)) { + rc=JS_SuspendRequest(cx); break; + } + rc=JS_SuspendRequest(cx); } } *rval = OBJECT_TO_JSVAL(rarray); } + JS_ResumeRequest(cx, rc); return(JS_TRUE); } @@ -2990,6 +3137,7 @@ static JSBool js_mkdir(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { char* p; + jsrefcount rc; if(JSVAL_IS_VOID(argv[0])) return(JS_TRUE); @@ -2997,7 +3145,9 @@ js_mkdir(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) if((p=js_ValueToStringBytes(cx, argv[0], NULL))==NULL) return(JS_FALSE); + rc=JS_SuspendRequest(cx); *rval = BOOLEAN_TO_JSVAL(MKDIR(p)==0); + JS_ResumeRequest(cx, rc); return(JS_TRUE); } @@ -3005,6 +3155,7 @@ static JSBool js_mkpath(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { char* p; + jsrefcount rc; if(JSVAL_IS_VOID(argv[0])) return(JS_TRUE); @@ -3012,7 +3163,9 @@ js_mkpath(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) if((p=js_ValueToStringBytes(cx, argv[0], NULL))==NULL) return(JS_FALSE); + rc=JS_SuspendRequest(cx); *rval = BOOLEAN_TO_JSVAL(mkpath(p)==0); + JS_ResumeRequest(cx, rc); return(JS_TRUE); } @@ -3020,6 +3173,7 @@ static JSBool js_rmdir(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) { char* p; + jsrefcount rc; if(JSVAL_IS_VOID(argv[0])) return(JS_TRUE); @@ -3027,7 +3181,9 @@ js_rmdir(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) if((p=js_ValueToStringBytes(cx, argv[0], NULL))==NULL) return(JS_FALSE); + rc=JS_SuspendRequest(cx); *rval = BOOLEAN_TO_JSVAL(rmdir(p)==0); + JS_ResumeRequest(cx, rc); return(JS_TRUE); } @@ -3041,6 +3197,7 @@ js_strftime(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) time_t t; struct tm tm; JSString* js_str; + jsrefcount rc; if(JSVAL_IS_VOID(argv[0])) return(JS_TRUE); @@ -3051,11 +3208,13 @@ js_strftime(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval) if(argc>1) JS_ValueToInt32(cx,argv[1],&i); + rc=JS_SuspendRequest(cx); strcpy(str,"-Invalid time-"); t=i; if(localtime_r(&t,&tm)==NULL) memset(&tm,0,sizeof(tm)); strftime(str,sizeof(str),fmt,&tm); + JS_ResumeRequest(cx, rc); if((js_str=JS_NewStringCopyZ(cx, str))==NULL) return(JS_FALSE); @@ -3070,6 +3229,7 @@ js_resolve_ip(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval struct in_addr addr; JSString* str; char* p; + jsrefcount rc; *rval = JSVAL_NULL; @@ -3079,8 +3239,10 @@ js_resolve_ip(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rval if((p=js_ValueToStringBytes(cx, argv[0], NULL))==NULL) return(JS_FALSE); + rc=JS_SuspendRequest(cx); if((addr.s_addr=resolve_ip(p))==INADDR_NONE) return(JS_TRUE); + JS_ResumeRequest(cx, rc); if((str=JS_NewStringCopyZ(cx, inet_ntoa(addr)))==NULL) return(JS_FALSE); @@ -3096,6 +3258,7 @@ js_resolve_host(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rv struct in_addr addr; HOSTENT* h; char* p; + jsrefcount rc; *rval = JSVAL_NULL; @@ -3105,8 +3268,10 @@ js_resolve_host(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsval *rv if((p=js_ValueToStringBytes(cx, argv[0], NULL))==NULL) return(JS_FALSE); + rc=JS_SuspendRequest(cx); addr.s_addr=inet_addr(p); h=gethostbyaddr((char *)&addr,sizeof(addr),AF_INET); + JS_ResumeRequest(cx, rc); if(h!=NULL && h->h_name!=NULL) *rval = STRING_TO_JSVAL(JS_NewStringCopyZ(cx,h->h_name)); @@ -3125,17 +3290,24 @@ js_list_named_queues(JSContext *cx, JSObject *obj, uintN argc, jsval *argv, jsva jsval val; list_node_t* node; msg_queue_t* q; + jsrefcount rc; if((array = JS_NewArrayObject(cx, 0, NULL))==NULL) return(JS_FALSE); + rc=JS_SuspendRequest(cx); for(node=listFirstNode(&named_queues);node!=NULL;node=listNextNode(node)) { if((q=listNodeData(node))==NULL) continue; + JS_ResumeRequest(cx, rc); val=STRING_TO_JSVAL(JS_NewStringCopyZ(cx,q->name)); - if(!JS_SetElement(cx, array, len++, &val)) + if(!JS_SetElement(cx, array, len++, &val)) { + rc=JS_SuspendRequest(cx); break; + } + rc=JS_SuspendRequest(cx); } + JS_ResumeRequest(cx, rc); *rval = OBJECT_TO_JSVAL(array); -- GitLab