void Runtime::Debugger::EvaluateByteReference(Reference* reference, int index) { long* array = (long*)ref_mem[index]; if(array) { const int max = array[0]; const int dim = array[1]; // de-reference array value ExpressionList* indices = reference->GetIndices(); if(indices) { // calculate indices values vector<Expression*> expressions = indices->GetExpressions(); vector<int> values; for(size_t i = 0; i < expressions.size(); i++) { EvaluateExpression(expressions[i]); if(expressions[i]->GetExpressionType() == INT_LIT_EXPR) { values.push_back(static_cast<IntegerLiteral*>(expressions[i])->GetValue()); } else { values.push_back(expressions[i]->GetIntValue()); } } // match the dimensions if(expressions.size() == (size_t)dim) { // calculate indices array += 2; int j = dim - 1; long array_index = values[j--]; for(long i = 1; i < dim; i++) { array_index *= array[i]; array_index += values[j--]; } array += dim; if(array_index > -1 && array_index < max) { reference->SetIntValue(((char*)array)[array_index]); } else { wcout << L"array index out of bounds." << endl; is_error = true; } } else { wcout << L"array dimension mismatch." << endl; is_error = true; } } // set array address else { reference->SetArrayDimension(dim); reference->SetArraySize(max); reference->SetIntValue(ref_mem[index]); } } else { wcout << L"current array value is Nil" << endl; is_error = true; } }
avtContract_p avtVolumeFilter::ModifyContract(avtContract_p contract) { avtContract_p newcontract = NULL; if (primaryVariable != NULL) { delete [] primaryVariable; } avtDataRequest_p ds = new avtDataRequest(contract->GetDataRequest()); const char *var = ds->GetVariable(); bool setupExpr = false; char exprDef[128]; std::string exprName = (std::string)"_expr_" + (std::string)var; if (atts.GetScaling() == VolumeAttributes::Linear) { #ifdef HAVE_LIBSLIVR if ((atts.GetRendererType() == VolumeAttributes::RayCastingSLIVR) || ((atts.GetRendererType() == VolumeAttributes::RayCasting) && (atts.GetSampling() == VolumeAttributes::Trilinear))) ds->SetDesiredGhostDataType(GHOST_ZONE_DATA); #endif newcontract = new avtContract(contract, ds); primaryVariable = new char[strlen(var)+1]; strcpy(primaryVariable, var); } else if (atts.GetScaling() == VolumeAttributes::Log) { setupExpr = true; if (atts.GetUseColorVarMin()) { char m[16]; SNPRINTF(m, 16, "%f", atts.GetColorVarMin()); SNPRINTF(exprDef, 128, "log10withmin(<%s>, %s)", var, m); } else { SNPRINTF(exprDef, 128, "log10(<%s>)", var); } avtDataRequest_p nds = new avtDataRequest(exprName.c_str(), ds->GetTimestep(), ds->GetRestriction()); nds->AddSecondaryVariable(var); #ifdef HAVE_LIBSLIVR if ((atts.GetRendererType() == VolumeAttributes::RayCastingSLIVR) || ((atts.GetRendererType() == VolumeAttributes::RayCasting) && (atts.GetSampling() == VolumeAttributes::Trilinear))) nds->SetDesiredGhostDataType(GHOST_ZONE_DATA); #endif newcontract = new avtContract(contract, nds); primaryVariable = new char[exprName.size()+1]; strcpy(primaryVariable, exprName.c_str()); } else // VolumeAttributes::Skew) { setupExpr = true; SNPRINTF(exprDef, 128, "var_skew(<%s>, %f)", var, atts.GetSkewFactor()); avtDataRequest_p nds = new avtDataRequest(exprName.c_str(), ds->GetTimestep(), ds->GetRestriction()); nds->AddSecondaryVariable(var); #ifdef HAVE_LIBSLIVR if ((atts.GetRendererType() == VolumeAttributes::RayCastingSLIVR) || ((atts.GetRendererType() == VolumeAttributes::RayCasting) && (atts.GetSampling() == VolumeAttributes::Trilinear))) nds->SetDesiredGhostDataType(GHOST_ZONE_DATA); #endif newcontract = new avtContract(contract, nds); primaryVariable = new char[strlen(exprName.c_str())+1]; strcpy(primaryVariable, exprName.c_str()); } if (setupExpr) { ExpressionList *elist = ParsingExprList::Instance()->GetList(); Expression *e = NULL; for (int i = 0 ; i < elist->GetNumExpressions() ; i++) { if (elist->GetExpressions(i).GetName() == exprName) { e = &(elist->GetExpressions(i)); break; } } bool shouldDelete = false; if (e == NULL) { e = new Expression(); shouldDelete = true; } e->SetName(exprName.c_str()); e->SetDefinition(exprDef); e->SetType(Expression::ScalarMeshVar); elist->AddExpressions(*e); if (shouldDelete) delete e; } newcontract->NoStreaming(); newcontract->SetHaveRectilinearMeshOptimizations(true); return newcontract; }