예제 #1
0
/* 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());
    }
  }
}
예제 #2
0
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;
}