bool BaselineInspector::commonGetPropFunction(jsbytecode *pc, JSObject **holder, Shape **holderShape, JSFunction **commonGetter, Shape **globalShape, bool *isOwnProperty, ShapeVector &nativeShapes, ObjectGroupVector &unboxedGroups) { if (!hasBaselineScript()) return false; MOZ_ASSERT(nativeShapes.empty()); MOZ_ASSERT(unboxedGroups.empty()); *holder = nullptr; const ICEntry &entry = icEntryFromPC(pc); for (ICStub *stub = entry.firstStub(); stub; stub = stub->next()) { if (stub->isGetProp_CallScripted() || stub->isGetProp_CallNative()) { ICGetPropCallGetter *nstub = static_cast<ICGetPropCallGetter *>(stub); bool isOwn = nstub->isOwnGetter(); if (!AddReceiverForGetPropFunction(nativeShapes, unboxedGroups, nstub)) return false; if (!*holder) { *holder = nstub->holder(); *holderShape = nstub->holderShape(); *commonGetter = nstub->getter(); *globalShape = GlobalShapeForGetPropFunction(nstub); *isOwnProperty = isOwn; } else if (nstub->holderShape() != *holderShape || GlobalShapeForGetPropFunction(nstub) != *globalShape || isOwn != *isOwnProperty) { return false; } else { MOZ_ASSERT(*commonGetter == nstub->getter()); } } else if (stub->isGetProp_Fallback()) { // If we have an unoptimizable access, don't try to optimize. if (stub->toGetProp_Fallback()->hadUnoptimizableAccess()) return false; } else if (stub->isGetName_Fallback()) { if (stub->toGetName_Fallback()->hadUnoptimizableAccess()) return false; } else { return false; } } if (!*holder) return false; MOZ_ASSERT(*isOwnProperty == (nativeShapes.empty() && unboxedGroups.empty())); return true; }
void TransposeNode::verify() const { auto dest = getResult(); auto src = getInput(); (void)dest; ShapeVector shape; auto dims = src.dims(); for (size_t i = 0; i < dims.size(); i++) { shape.push_back(dims[Shuffle_[i]]); } assert(dest.dims().equals(shape) && "Invalid transpose dims"); }
bool BaselineInspector::maybeShapesForPropertyOp(jsbytecode *pc, ShapeVector &shapes) { // Return a list of shapes seen by the baseline IC for the current op. // An empty list indicates no shapes are known, or there was an uncacheable // access. JS_ASSERT(shapes.empty()); if (!hasBaselineScript()) return true; JS_ASSERT(isValidPC(pc)); const ICEntry &entry = icEntryFromPC(pc); ICStub *stub = entry.firstStub(); while (stub->next()) { Shape *shape; if (stub->isGetProp_Native()) { shape = stub->toGetProp_Native()->shape(); } else if (stub->isSetProp_Native()) { shape = stub->toSetProp_Native()->shape(); } else { shapes.clear(); return true; } // Don't add the same shape twice (this can happen if there are multiple // SetProp_Native stubs with different TypeObject's). bool found = false; for (size_t i = 0; i < shapes.length(); i++) { if (shapes[i] == shape) { found = true; break; } } if (!found && !shapes.append(shape)) return false; stub = stub->next(); } if (stub->isGetProp_Fallback()) { if (stub->toGetProp_Fallback()->hadUnoptimizableAccess()) shapes.clear(); } else { if (stub->toSetProp_Fallback()->hadUnoptimizableAccess()) shapes.clear(); } // Don't inline if there are more than 5 shapes. if (shapes.length() > 5) shapes.clear(); return true; }
void CollisionShapeManager::SaveShapesToBinaryFile(const String& FileName, ShapeVector& ShapesToSave) { btDefaultSerializer* BulletSerializer = new btDefaultSerializer(1024*1024*5); BulletSerializer->startSerialization(); for( ShapeVectorIterator it = ShapesToSave.begin() ; it != ShapesToSave.end() ; it++ ) { Physics::CollisionShape* Shape = (*it); BulletSerializer->registerNameForPointer((void*)Shape->_GetInternalShape(),(*it)->GetName().c_str()); int len = Shape->_GetInternalShape()->calculateSerializeBufferSize(); btChunk* chunk = BulletSerializer->allocate(len,1); const char* structType = Shape->_GetInternalShape()->serialize(chunk->m_oldPtr, BulletSerializer); BulletSerializer->finalizeChunk(chunk,structType,BT_SHAPE_CODE,Shape->_GetInternalShape()); } BulletSerializer->finishSerialization(); FILE* f2 = fopen(FileName.c_str(),"wb"); fwrite(BulletSerializer->getBufferPointer(),BulletSerializer->getCurrentBufferSize(),1,f2); fclose(f2); }
void CollisionShapeManager::SaveShapesToXMLFile(const String& FileName, ShapeVector& ShapesToSave) { XML::Document ShapesDoc; XML::Node DeclNode = ShapesDoc.AppendChild(XML::NodeDeclaration); XML::Attribute VerAttrib = DeclNode.AppendAttribute("version"); if( DeclNode.SetName("xml") && VerAttrib.SetValue("1.0") ) { XML::Node ShapesRoot = ShapesDoc.AppendChild( "ShapesRoot" ); for( ShapeVectorIterator ShapeIt = ShapesToSave.begin() ; ShapeIt != ShapesToSave.end() ; ++ShapeIt ) { (*ShapeIt)->ProtoSerialize( ShapesRoot ); } /// @todo Replace this stack allocated stream for one initialized from the Resource Manager, after the system is ready. Resource::FileStream SettingsStream(FileName,".",Resource::SF_Truncate | Resource::SF_Write); ShapesDoc.Save(SettingsStream,"\t",XML::FormatIndent); }else{ MEZZ_EXCEPTION(ExceptionBase::INVALID_STATE_EXCEPTION,"Failed to create XML document declaration for file \"" + FileName + "\"."); } }
Intersection *Raytracer::get_closest_intersection(Scene *scene, const Ray &ray) { ShapeVector *shapes = scene->shapes(); ShapeIterator iter = shapes->begin(); Intersection *closest_intersection = nullptr; for (; iter != shapes->end(); ++iter) { // Calculate the intersection with this shape Ray *intersection = (*iter)->intersect(ray); if (intersection != nullptr) { // Check if this intersection is closer if ((closest_intersection == nullptr) || (distance_between(ray.vertex(), intersection->vertex()) < distance_between(ray.vertex(), closest_intersection->intersection_point()))) { // Latest intersection is closer if (closest_intersection != nullptr) delete closest_intersection; closest_intersection = new Intersection( intersection->vertex(), intersection->direction(), *iter); } delete intersection; intersection = nullptr; } } return closest_intersection; }
bool BaselineInspector::commonSetPropFunction(jsbytecode *pc, JSObject **holder, Shape **holderShape, JSFunction **commonSetter, bool *isOwnProperty, ShapeVector &nativeShapes, ObjectGroupVector &unboxedGroups) { if (!hasBaselineScript()) return false; MOZ_ASSERT(nativeShapes.empty()); MOZ_ASSERT(unboxedGroups.empty()); *holder = nullptr; const ICEntry &entry = icEntryFromPC(pc); for (ICStub *stub = entry.firstStub(); stub; stub = stub->next()) { if (stub->isSetProp_CallScripted() || stub->isSetProp_CallNative()) { ICSetPropCallSetter *nstub = static_cast<ICSetPropCallSetter *>(stub); if (!AddReceiver(nativeShapes, unboxedGroups, nstub->guard())) return false; if (!*holder) { *holder = nstub->holder(); *holderShape = nstub->holderShape(); *commonSetter = nstub->setter(); *isOwnProperty = false; } else if (nstub->holderShape() != *holderShape) { return false; } else { MOZ_ASSERT(*commonSetter == nstub->setter()); } } else if (!stub->isSetProp_Fallback() || stub->toSetProp_Fallback()->hadUnoptimizableAccess()) { // We have an unoptimizable access, so don't try to optimize. return false; } } if (!*holder) return false; return true; }
//+----------------------------------------------------------------------------+ //| main() | //-----------------------------------------------------------------------------+ int main(int argc, char** argv) { common::PathFileString pfs(argv[0]); ////////////////////////////////////////////////////////////////////////////// // User command line parser AnyOption *opt = new AnyOption(); opt->autoUsagePrint(true); opt->addUsage( "" ); opt->addUsage( "Usage: " ); char buff[256]; sprintf(buff, " Example: %s -r example1_noisy.cfg", pfs.getFileName().c_str()); opt->addUsage( buff ); opt->addUsage( " -h --help Prints this help" ); opt->addUsage( " -r --readfile <filename> Reads the polyhedra description file" ); opt->addUsage( " -t --gltopic <topic name> (opt) ROS Topic to send OpenGL commands " ); opt->addUsage( "" ); opt->setFlag( "help", 'h' ); opt->setOption( "readfile", 'r' ); opt->processCommandArgs( argc, argv ); if( opt->getFlag( "help" ) || opt->getFlag( 'h' ) ) {opt->printUsage(); delete opt; return(1);} std::string gltopic("OpenGLRosComTopic"); if( opt->getValue( 't' ) != NULL || opt->getValue( "gltopic" ) != NULL ) gltopic = opt->getValue( 't' ); std::cerr << "[OpenGL communication topic is set to : \"" << gltopic << "\"]\n"; std::string readfile; if( opt->getValue( 'r' ) != NULL || opt->getValue( "readfile" ) != NULL ) { readfile = opt->getValue( 'r' ); std::cerr << "[ World description is read from \"" << readfile << "\"]\n"; } else{opt->printUsage(); delete opt; return(-1);} delete opt; // ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// // Initialize ROS and OpenGLRosCom node (visualization) std::cerr << "["<<pfs.getFileName()<<"]:" << "[Initializing ROS]"<< std::endl; ros::init(argc, argv, pfs.getFileName().c_str()); if(ros::isInitialized()) std::cerr << "["<<pfs.getFileName()<<"]:" << "[Initializing ROS]:[OK]\n"<< std::endl; else{ std::cerr << "["<<pfs.getFileName()<<"]:" << "[Initializing ROS]:[FAILED]\n"<< std::endl; return(1); } COpenGLRosCom glNode; glNode.CreateNode(gltopic); // ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// // Reading the input file std::cerr << "Reading the input file..." << std::endl; ShapeVector shapes; PoseVector poses; IDVector ID; if(ReadPolyhedraConfigFile(readfile, shapes, poses, ID)==false) { std::cerr << "["<<pfs.getFileName()<<"]:" << "Error reading file \"" << readfile << "\"\n"; return(-1); } std::cerr << "Read " << poses.size() << " poses of " << shapes.size() << " shapes with " << ID.size() << " IDs.\n"; // ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// // Visualizing the configuration of objects std::cerr << "Visualizing the configuration of objects..." << std::endl; for(unsigned int i=0; i<shapes.size(); i++) { for(size_t j=0; j<shapes[i].F.size(); j++) { glNode.LineWidth(1.0f); glNode.AddColor3(0.3f, 0.6f, 0.5f); glNode.AddBegin("LINE_LOOP"); for(size_t k=0; k<shapes[i].F[j].Idx.size(); k++) { int idx = shapes[i].F[j].Idx[k]; Eigen::Matrix<Real,3,1> Vt = poses[i]*shapes[i].V[ idx ]; glNode.AddVertex(Vt.x(), Vt.y(), Vt.z()); } glNode.AddEnd(); } } glNode.SendCMDbuffer(); ros::spinOnce(); common::PressEnterToContinue(); // ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// // Running PROMTS with A* search algorithm std::cerr << "Running PROMTS with Depth Limited search algorithm..." << std::endl; promts::ProblemDataStruct pds("Depth-Limited Search"); pds.m_glNodePtr = &glNode; PoseVector refined_poses(shapes.size()); refinePoses_DLSearch(shapes, poses, ID, refined_poses, pds); // ////////////////////////////////////////////////////////////////////////////// return(0); }
bool BaselineInspector::maybeInfoForPropertyOp(jsbytecode *pc, ShapeVector &nativeShapes, ObjectGroupVector &unboxedGroups, ObjectGroupVector &convertUnboxedGroups) { // Return lists of native shapes and unboxed objects seen by the baseline // IC for the current op. Empty lists indicate no shapes/types are known, // or there was an uncacheable access. convertUnboxedGroups is used for // unboxed object groups which have been seen, but have had instances // converted to native objects and should be eagerly converted by Ion. MOZ_ASSERT(nativeShapes.empty()); MOZ_ASSERT(unboxedGroups.empty()); MOZ_ASSERT(convertUnboxedGroups.empty()); if (!hasBaselineScript()) return true; MOZ_ASSERT(isValidPC(pc)); const ICEntry &entry = icEntryFromPC(pc); ICStub *stub = entry.firstStub(); while (stub->next()) { Shape *shape = nullptr; ObjectGroup *group = nullptr; if (stub->isGetProp_Native()) { shape = stub->toGetProp_Native()->shape(); } else if (stub->isSetProp_Native()) { shape = stub->toSetProp_Native()->shape(); } else if (stub->isGetProp_Unboxed()) { group = stub->toGetProp_Unboxed()->group(); } else if (stub->isSetProp_Unboxed()) { group = stub->toSetProp_Unboxed()->group(); } else { nativeShapes.clear(); unboxedGroups.clear(); return true; } if (group && group->unboxedLayout().nativeGroup()) { if (!VectorAppendNoDuplicate(convertUnboxedGroups, group)) return false; shape = group->unboxedLayout().nativeShape(); group = nullptr; } if (shape) { if (!VectorAppendNoDuplicate(nativeShapes, shape)) return false; } else { if (!VectorAppendNoDuplicate(unboxedGroups, group)) return false; } stub = stub->next(); } if (stub->isGetProp_Fallback()) { if (stub->toGetProp_Fallback()->hadUnoptimizableAccess()) { nativeShapes.clear(); unboxedGroups.clear(); } } else { if (stub->toSetProp_Fallback()->hadUnoptimizableAccess()) { nativeShapes.clear(); unboxedGroups.clear(); } } // Don't inline if there are more than 5 shapes/groups. if (nativeShapes.length() + unboxedGroups.length() > 5) { nativeShapes.clear(); unboxedGroups.clear(); } return true; }