DP NR::selip(const int k, Vec_I_DP &arr) { const int M=64; const DP BIG=1.0e30; int i,j,jl,jm,ju,kk,mm,nlo,nxtmm; DP ahi,alo,sum; Vec_INT isel(M+2); Vec_DP sel(M+2); int n=arr.size(); if (k < 0 || k > n-1) nrerror("bad input to selip"); kk=k; ahi=BIG; alo = -BIG; for (;;) { mm=nlo=0; sum=0.0; nxtmm=M+1; for (i=0;i<n;i++) { if (arr[i] >= alo && arr[i] <= ahi) { mm++; if (arr[i] == alo) nlo++; if (mm <= M) sel[mm-1]=arr[i]; else if (mm == nxtmm) { nxtmm=mm+mm/M; sel[(i+2+mm+kk) % M]=arr[i]; } sum += arr[i]; } } if (kk < nlo) { return alo; } else if (mm < M+1) { shell(mm,sel); ahi = sel[kk]; return ahi; } sel[M]=sum/mm; shell(M+1,sel); sel[M+1]=ahi; for (j=0;j<M+2;j++) isel[j]=0; for (i=0;i<n;i++) { if (arr[i] >= alo && arr[i] <= ahi) { jl=0; ju=M+2; while (ju-jl > 1) { jm=(ju+jl)/2; if (arr[i] >= sel[jm-1]) jl=jm; else ju=jm; } isel[ju-1]++; } } j=0; while (kk >= isel[j]) { alo=sel[j]; kk -= isel[j++]; } ahi=sel[j]; } }
bool QmcTypeCompiler::precompile() { // QQmlTypeCompiler::compile // qqmltypecompiler.cpp:68 compiledData->importCache = new QQmlTypeNameCache; // namespaces // qqmltypecompiler.cpp:72 // qqmltypeloader.cpp:2356 foreach (const QString &ns, compilation->namespaces) { compiledData->importCache->add(ns); } // TBD: qqmltypecompiler.cpp:72 namespaces, copy from QmlCompilation->namespaces // qqmltypecompiler.cpp:76 composite singletons // Add any Composite Singletons that were used to the import cache foreach (const QmlCompilation::TypeReference &singleton, compilation->m_compositeSingletons) { compiledData->importCache->add(singleton.type->qmlTypeName(), singleton.type->sourceUrl(), singleton.prefix); } compilation->importCache->populateCache(compiledData->importCache); // create typemap qqmltypecompiler.cpp:81 if (!createTypeMap()) return false; // qqmltypecompiler.cpp:134 // Build property caches and VME meta object data if (!createPropertyCacheVmeMetaData()) { return false; } // default property merger mergeDefaultProperties(); // convert signal handlers to functions if (!convertSignalHandlersToFunctions()) return false; // resolve enums if (!resolveEnums()) return false; // index custom parser scripts indexCustomParserScripts(); // annotate aliases annotateAliases(); // collect imported scripts // qqmltypecompiler.cpp:180 // script data collection // 1. QQmlTypeData::continueLoadFromIR qqmltypeloader.cpp:2271 from QmlIR::Document -> QQmlTypeData::m_scripts // 2. QQmlTypeData::resolveTypes qqmltypeloader.cpp:2356 from QQmlImports -> QQmlTypeData::m_scripts // TBD: are actual script blobs needed ? #if 0 compiledData->scripts.reserve(compilation->scripts.count()); #endif for (int scriptIndex = 0; scriptIndex < compilation->scripts.count(); ++scriptIndex) { const QmlCompilation::ScriptReference &script = compilation->scripts.at(scriptIndex); QString qualifier = script.qualifier; QString enclosingNamespace; const int lastDotIndex = qualifier.lastIndexOf(QLatin1Char('.')); if (lastDotIndex != -1) { enclosingNamespace = qualifier.left(lastDotIndex); qualifier = qualifier.mid(lastDotIndex+1); } compiledData->importCache->add(qualifier, scriptIndex, enclosingNamespace); #if 0 QQmlScriptData *scriptData = script.script->scriptData(); scriptData->addref(); compiledData->scripts << scriptData; #endif } // resolve component boundaries and aliases if (!resolveComponentBoundariesAndAliases()) return false; // Compile JS binding expressions and signal handlers if (!compilation->document->javaScriptCompilationUnit) { // We can compile script strings ahead of time, but they must be compiled // without type optimizations as their scope is always entirely dynamic. scanScriptStrings(); // TBD: check how it uses importCache // TBD: check how links with other scripts QmlIR::JSCodeGen v4CodeGenerator(compilation->urlString, compilation->document->code, &compilation->document->jsModule, &compilation->document->jsParserEngine, compilation->document->program, compiledData->importCache, &compilation->document->jsGenerator.stringTable); JSCodeGenerator jsCodeGen(this, &v4CodeGenerator); if (!jsCodeGen.generateCodeForComponents()) return false; simplifyJavaScriptBindingExpressions(); QQmlEnginePrivate *enginePrivate = QQmlEnginePrivate::get(compilation->engine); QV4::ExecutionEngine *v4 = enginePrivate->v4engine(); // TBD: store unlinked binaries #if 0 QScopedPointer<QV4::EvalInstructionSelection> isel( v4->iselFactory->create(enginePrivate, v4->executableAllocator, &compilation->document->jsModule, &compilation->document->jsGenerator)); #endif QScopedPointer<QmcInstructionSelection> isel( new QmcInstructionSelection(enginePrivate, v4->executableAllocator, &compilation->document->jsModule, &compilation->document->jsGenerator)); isel->setUseFastLookups(false); compilation->document->javaScriptCompilationUnit = isel->compile(/*generated unit data*/false); compilation->linkData = isel->linkData(); compilation->exceptionReturnLabels = isel->exceptionReturnLabelsData(); compilation->exceptionPropagationJumps = isel->exceptionPropagationJumpsData(); #if CPU(ARM_THUMB2) compilation->jumpsToLinkData = isel->linkRecordData(); compilation->unlinkedCodeData = isel->unlinkedCodeData(); #endif } // Generate QML compiled type data structures QmlIR::QmlUnitGenerator qmlGenerator; QV4::CompiledData::QmlUnit *qmlUnit = qmlGenerator.generate(*compilation->document); Q_ASSERT(compilation->document->javaScriptCompilationUnit); Q_ASSERT((void*)qmlUnit == (void*)&qmlUnit->header); // The js unit owns the data and will free the qml unit. compilation->document->javaScriptCompilationUnit->data = &qmlUnit->header; compiledData->compilationUnit = compilation->document->javaScriptCompilationUnit; if (compiledData->compilationUnit) compiledData->compilationUnit->ref(); compiledData->qmlUnit = qmlUnit; // ownership transferred to m_compiledData // add to type registry // qqmltypecompiler.cpp:248 if (compiledData->isCompositeType()) { if (compilation->singleton) qmlUnit->header.flags |= QV4::CompiledData::Unit::IsSingleton; QQmlEnginePrivate::get(compilation->engine)->registerInternalCompositeType(compiledData); } else { if (compilation->singleton) { qmlUnit->header.flags = qmlUnit->header.flags | QV4::CompiledData::Unit::IsSingleton; } const QV4::CompiledData::Object *obj = qmlUnit->objectAt(qmlUnit->indexOfRootObject); QQmlCompiledData::TypeReference *typeRef = compiledData->resolvedTypes.value(obj->inheritedTypeNameIndex); Q_ASSERT(typeRef); if (typeRef->component) { compiledData->metaTypeId = typeRef->component->metaTypeId; compiledData->listMetaTypeId = typeRef->component->listMetaTypeId; } else { compiledData->metaTypeId = typeRef->type->typeId(); compiledData->listMetaTypeId = typeRef->type->qListTypeId(); } } // Sanity check property bindings and compile custom parsers if (!validateProperties()) return false; return true; }