// // ::virtual_makeObjects // virtual void virtual_makeObjects(ObjectVector *objects, VariableData *dst) { VariableType::Reference type = getType(); bigsint size = type->getSize(pos); VariableType::BasicType bt = type->getBasicType(); VariableData::Pointer src = expr->getData(); VariableData::Pointer data = VariableData::create_stack(size); VariableData::Pointer tmp = VariableData:: create_stack(src->type == VariableData::MT_FARPTR ? 2 : 1); if (dst->type != VariableData::MT_VOID) make_objects_memcpy_prep(objects, dst, data, pos); if(bt == VariableType::BT_INT_L || bt == VariableType::BT_INT_LL || bt == VariableType::BT_UNS_L || bt == VariableType::BT_UNS_LL) { doL(objects, dst, src, tmp); } else if (VariableType::IsTypeInteger(bt)) { doI(objects, dst, src, tmp); } else if (bt == VariableType::BT_PTR) { bigsint value = type->getReturn()->getSize(pos); if(type->getSize(pos) == 1) { if(value == 1) doP(objects, dst, src, tmp, NULL); else doP(objects, dst, src, tmp, objects->getValue(value)); } else { if(value == 1) doPF(objects, dst, src, tmp, NULL); else doPF(objects, dst, src, tmp, objects->getValue(value)); } } else if (VariableType::IsTypeFixed(bt)) { doX(objects, dst, src, tmp); } else Error_NP("invalid BT"); if (dst->type != VariableData::MT_VOID) make_objects_memcpy_post(objects, dst, data, type, context, pos); }
bool SceneLoader::doG(istream &str, string &name) { name = getString(str); if (name.empty()) { *err << "Couldn't read group name at "; errLine(str.tellg()); return false; } if (groups[name] != NULL) { *err << "Illegal re-use of group name \"" << name << "\" at "; curPos(*err,str.tellg()); *err << endl; return false; } SceneGroup *n = new SceneGroup(); groups[name] = n; n->_name = name; do { int state = findOpenOrClosedParen(str); if (state == ERROR) return false; else if (state == CLOSED) return true; else if (state == OPEN) { string cmd; if (readCommand(str, cmd)) { if (cmd != "I") { *err << "Command other than I from G at "; curPos(*err,str.tellg()); *err << endl; } string iname; SceneInstance *newNode; if ((newNode = doI(str,iname)) != NULL) { n->_children.push_back( newNode ); } findCloseParen(str); } } } while (true); }