/* static */ void ThreadSafeChromeUtils::NondeterministicGetWeakMapKeys(GlobalObject& aGlobal, JS::Handle<JS::Value> aMap, JS::MutableHandle<JS::Value> aRetval, ErrorResult& aRv) { if (!aMap.isObject()) { aRetval.setUndefined(); } else { JSContext* cx = aGlobal.Context(); JS::Rooted<JSObject*> objRet(cx); JS::Rooted<JSObject*> mapObj(cx, &aMap.toObject()); if (!JS_NondeterministicGetWeakMapKeys(cx, mapObj, &objRet)) { aRv.Throw(NS_ERROR_OUT_OF_MEMORY); } else { aRetval.set(objRet ? JS::ObjectValue(*objRet) : JS::UndefinedValue()); } } }
int main(int argc, char* argv[]) #endif { #if defined(_DEBUG) && defined(__WINDOWS__) int tmpDbgFlag; _CrtSetReportMode( _CRT_ERROR, _CRTDBG_MODE_FILE ); _CrtSetReportFile( _CRT_ERROR, _CRTDBG_FILE_STDERR ); tmpDbgFlag = _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG); tmpDbgFlag |= _CRTDBG_DELAY_FREE_MEM_DF; tmpDbgFlag |= _CRTDBG_LEAK_CHECK_DF; _CrtSetDbgFlag(tmpDbgFlag); #endif #if defined(__LINUX__) signal(SIGPIPE,SIG_IGN); #endif g_pSharedMessageQueueT2M=new SharedMessageQueue(); g_pMap=new SharedStringMap(); g_pMap->InitMap(1024); int runFlag=TRUE; int onlyOnce=FALSE; InterpreterOptions options; options.SetExpressionPoolSize(4*1024); options.SetMaxPredefinedValueNum(256); options.SetMaxFunctionDimensionNum(8); options.SetMaxInnerFunctionApiNum(256); options.SetMaxInnerStatementApiNum(32); options.SetMaxLocalNum(256); options.SetMaxProgramSize(4*1024); options.SetMaxStatementApiNum(4); options.SetMaxStatementNum(1024); options.SetStackValuePoolSize(4*1024); options.SetStringBufferSize(32*1024); options.SetValuePoolSize(4*1024); SourceCodeScript script(options); Interpreter& interpreter=script.GetInterpreter(); interpreter.SetExternRunFlagRef(runFlag); ConsoleScriptSource source(runFlag); char tempBuf[64]; tsnprintf(tempBuf,64,"%d",argc-1); g_pMap->Set("argc",tempBuf); for(int argIx=1;argIx<argc;++argIx) { tsnprintf(tempBuf,64,"argv%d",argIx-1); g_pMap->Set(tempBuf,argv[argIx]); } g_Argc = argc-1; g_Argv = (argc>1 ? &argv[1] : NULL); if(argc>=2) { runFlag=FALSE; const char* pFile=argv[1]; FILE* fp=fopen(pFile,"r"); if(NULL!=fp) { int size=(int)fread(g_FileBuffer,1,g_c_MaxFileBuffer,fp); if(size>=0) { g_FileBuffer[size]=0; int outSize=0; char* pOutMemory=NULL; int haveOutMemory=FALSE; int isContinue=DecryptMemoryWithCyclone(g_FileBuffer,size,pOutMemory,outSize,haveOutMemory); if(TRUE==isContinue) { if(TRUE==haveOutMemory && NULL!=pOutMemory && outSize>0) { tsnprintf(g_FileBuffer,g_c_MaxFileBuffer,"%s",pOutMemory); size=outSize; g_FileBuffer[size]=0; delete[] pOutMemory; } source.SetBuffer(g_FileBuffer); runFlag=TRUE; onlyOnce=TRUE; } } fclose(fp); } else { printf("Can't open %s !!!\n",pFile); } } else { printf("[usage]:\n"); printf("\tadmintool\n"); printf("\tadmintool file.scp [arg1 arg2 ...]\n"); printf("Start interaction script ...\n"); } for(int ix=0;ix<g_c_MaxScriptThread;++ix) { g_pScriptThread[ix]=NULL; } g_ScriptThreadNum=0; SharedStringMapObj mapObj(interpreter); interpreter.RegisterPredefinedValue("stringMap",FunctionScript::Value(&mapObj)); SleepApi sleepApi(interpreter); interpreter.RegisterPredefinedValue("sleep", FunctionScript::Value(&sleepApi)); TestPrintfApi testPrintfApi(interpreter); interpreter.RegisterPredefinedValue("sprintf",FunctionScript::Value(&testPrintfApi)); ArgvApi argvApi(interpreter); interpreter.RegisterPredefinedValue("argv",FunctionScript::Value(&argvApi)); interpreter.RegisterPredefinedValue("argc",FunctionScript::Value(g_Argc)); WriteConsoleApi writeConsoleApi(interpreter); interpreter.RegisterPredefinedValue("writeConsole",FunctionScript::Value(&writeConsoleApi)); GetLogFileIdApi getLogFileIdApi(interpreter); interpreter.RegisterPredefinedValue("getLogFileId",FunctionScript::Value(&getLogFileIdApi)); GetTimeStringApi getTimeStringApi(interpreter); interpreter.RegisterPredefinedValue("getTimeString",FunctionScript::Value(&getTimeStringApi)); GetMillisecondsApi getMillisecondsApi(interpreter); interpreter.RegisterPredefinedValue("getMilliseconds",FunctionScript::Value(&getMillisecondsApi)); ReadStringApi readStringApi(interpreter); interpreter.RegisterPredefinedValue("readString",FunctionScript::Value(&readStringApi)); WriteStringApi writeStringApi(interpreter); interpreter.RegisterPredefinedValue("writeString",FunctionScript::Value(&writeStringApi)); CreateIniReaderApi createIniReaderApi(interpreter); interpreter.RegisterPredefinedValue("createIniReader",FunctionScript::Value(&createIniReaderApi)); CreateTxtTableApi createTxtTableApi(interpreter); interpreter.RegisterPredefinedValue("createTxtTable",FunctionScript::Value(&createTxtTableApi)); CreateConfigTableApi createConfigTableApi(interpreter); interpreter.RegisterPredefinedValue("createConfigTable",FunctionScript::Value(&createConfigTableApi)); CreateXmlVisitorApi createXmlVisitorApi(interpreter); interpreter.RegisterPredefinedValue("createXmlVisitor",FunctionScript::Value(&createXmlVisitorApi)); SimpleClientObj clientObj(interpreter); RunFileApi runfileApi(interpreter,source); RunScriptApi runscriptApi(interpreter,source); QuitApi quitApi(interpreter,runFlag); GetScriptThreadNumApi getScriptThreadNumApi(interpreter); StartScriptThreadApi startScriptThreadApi(interpreter); MarkWaitingQuitApi markWaitingQuitApi(interpreter); StopScriptThreadApi stopScriptThreadApi(interpreter); IsScriptThreadRunningApi isScriptThreadRunningApi(interpreter); SendMessageM2TApi sendMessageApi(interpreter); PushMessageMT2MApi pushMessageApi(interpreter); PopMessageMT2MApi popMessageApi(interpreter); interpreter.RegisterPredefinedValue("client", FunctionScript::Value(&clientObj)); interpreter.RegisterPredefinedValue("runfile",FunctionScript::Value(&runfileApi)); interpreter.RegisterPredefinedValue("runscript",FunctionScript::Value(&runscriptApi)); interpreter.RegisterPredefinedValue("quit",FunctionScript::Value(&quitApi)); interpreter.RegisterPredefinedValue("getScriptThreadNum",FunctionScript::Value(&getScriptThreadNumApi)); interpreter.RegisterPredefinedValue("startScriptThread",FunctionScript::Value(&startScriptThreadApi)); interpreter.RegisterPredefinedValue("markWaitingQuit",FunctionScript::Value(&markWaitingQuitApi)); interpreter.RegisterPredefinedValue("stopScriptThread",FunctionScript::Value(&stopScriptThreadApi)); interpreter.RegisterPredefinedValue("isScriptThreadRunning", FunctionScript::Value(&isScriptThreadRunningApi)); interpreter.RegisterPredefinedValue("sendMessage", FunctionScript::Value(&sendMessageApi)); interpreter.RegisterPredefinedValue("pushMessage",FunctionScript::Value(&pushMessageApi)); interpreter.RegisterPredefinedValue("popMessage",FunctionScript::Value(&popMessageApi)); int lastValue=0; for(;TRUE==runFlag;) { source.ClearBuffer(); source.ResetTime(); unsigned int t1=MyTimeGetTime(); script.Parse(source); t1+=source.GetTime(); unsigned int t2=MyTimeGetTime(); if(interpreter.HasError()) { for(int ix=0;ix<interpreter.GetErrorNum();++ix) { printf("%s\n",interpreter.GetErrorInfo(ix)); } interpreter.Reset(); printf("Interpreter has already reset !\n"); } else { if(interpreter.GetStatementNum()>=options.GetMaxProgramSize()-10 || interpreter.GetValueNum()>=options.GetValuePoolSize()-10 || interpreter.GetStackValueNum()!=options.GetStackValuePoolSize() && interpreter.GetStackValueNum()>=options.GetStackValuePoolSize()-10 || interpreter.GetSyntaxComponentNum()>=options.GetExpressionPoolSize()-10 || int(interpreter.GetUnusedStringPtrRef()-interpreter.GetStringBuffer())>=options.GetStringBufferSize()-1024) { printf("[Statistic] statements:%u value:%u stack:%u syntax:%u string:%u\n",interpreter.GetStatementNum(),interpreter.GetValueNum(),interpreter.GetStackValueNum(),interpreter.GetSyntaxComponentNum(),(unsigned int)(interpreter.GetUnusedStringPtrRef()-interpreter.GetStringBuffer())); } Value val; interpreter.Execute(&val); if(argc==1) { if(!val.IsInvalid()) { if(val.IsString()) { printf("%s\n",val.GetString()); } else { char temp[MAX_NUMBER_STRING_SIZE]; const char* p=val.ToString(temp,MAX_NUMBER_STRING_SIZE); if(p && p[0]!='\0') { printf("Command Result:%s\n",p); } } } } else { if (val.IsInt()){ lastValue = val.GetInt(); } else { lastValue = 0; } } } unsigned int t3=MyTimeGetTime(); //printf("[Time] parse:%u interpret:%u\n",t2-t1,t3-t2); const char* line=source.GetBackBuffer(); if(NULL!=line) { if(strcmp(line,".")==0) { interpreter.Reset(); runFlag=TRUE; if(argc==1) { printf("Process command: reset\n"); } } else if(strcmp(line,"quit")==0 || strcmp(line,"exit")==0) { runFlag=FALSE; } else if(strcmp(line,"enabledebuginfo")==0) { interpreter.EnableDebugInfo(); } else if(strcmp(line,"disabledebuginfo")==0) { interpreter.DisableDebugInfo(); } } MySleep(100); if(TRUE==onlyOnce) break; } for(int ix=0;ix<g_ScriptThreadNum;++ix) { if(g_pScriptThread[ix] && g_pScriptThread[ix]->getStatus()==Thread::RUNNING) { g_pScriptThread[ix]->stop(); } } if(argc==1) { printf("Wait script thread exiting ...\n"); } while(g_CreateThreadCount!=g_QuitThreadCount) { MySleep(100); } if(argc==1) { printf("Now quit ...\n"); } for(int ix=0;ix<g_ScriptThreadNum;++ix) { if(g_pScriptThread[ix]) { delete g_pScriptThread[ix]; g_pScriptThread[ix]=NULL; } } if(g_pSharedMessageQueueT2M) { delete g_pSharedMessageQueueT2M; g_pSharedMessageQueueT2M=NULL; } return lastValue; }