@Override
	public void restoreXml(XmlPullParser parser, CompilerSpec cspec) throws XmlParseException {
		ArrayList<ParamEntry> pe = new ArrayList<>();
		numgroup = 0;
		language = cspec.getLanguage();
		spacebase = null;
		int pointermax = 0;
		thisbeforeret = false;
		autoKilledByCall = false;
		splitMetatype = true;
		XmlElement mainel = parser.start();
		String attribute = mainel.getAttribute(ATTRIB_POINTERMAX.name());
		if (attribute != null) {
			pointermax = SpecXmlUtils.decodeInt(attribute);
		}
		attribute = mainel.getAttribute(ATTRIB_THISBEFORERETPOINTER.name());
		if (attribute != null) {
			thisbeforeret = SpecXmlUtils.decodeBoolean(attribute);
		}
		attribute = mainel.getAttribute(ATTRIB_KILLEDBYCALL.name());
		if (attribute != null) {
			autoKilledByCall = SpecXmlUtils.decodeBoolean(attribute);
		}
		attribute = mainel.getAttribute(ATTRIB_SEPARATEFLOAT.name());
		if (attribute != null) {
			splitMetatype = SpecXmlUtils.decodeBoolean(attribute);
		}
//		resourceStart = new int[0];
		for (;;) {
			XmlElement el = parser.peek();
			if (!el.isStart()) {
				break;
			}
			if (el.getName().equals(ELEM_PENTRY.name())) {
				parsePentry(parser, cspec, pe, numgroup, splitMetatype, false);
			}
			else if (el.getName().equals(ELEM_GROUP.name())) {
				parseGroup(parser, cspec, pe, numgroup, splitMetatype);
			}
			else if (el.getName().equals(ELEM_RULE.name())) {
				break;
			}
		}
		entry = new ParamEntry[pe.size()];
		pe.toArray(entry);

		ArrayList<ModelRule> rules = new ArrayList<>();
		for (;;) {
			XmlElement subId = parser.peek();
			if (!subId.isStart()) {
				break;
			}
			if (subId.getName().equals(ELEM_RULE.name())) {
				ModelRule rule = new ModelRule();
				rule.restoreXml(parser, this);
				rules.add(rule);
			}
			else {
				throw new XmlParseException(
					"<pentry> and <group> elements must come before any <modelrule>");
			}
		}

		parser.end(mainel);
//		int[] newResourceStart = new int[resourceStart.length + 1];
//		System.arraycopy(resourceStart, 0, newResourceStart, 0, resourceStart.length);
//		newResourceStart[resourceStart.length] = numgroup;
//		resourceStart = newResourceStart;
		if (pointermax > 0) {	// Add a ModelRule at the end that converts too big data-types to pointers
			SizeRestrictedFilter typeFilter = new SizeRestrictedFilter(pointermax + 1, 0);
			ConvertToPointer action = new ConvertToPointer(this);
			try {
				rules.add(new ModelRule(typeFilter, action, this));
			}
			catch (InvalidInputException e) {
				throw new XmlParseException(e.getMessage());
			}
		}
		modelRules = new ModelRule[rules.size()];
		rules.toArray(modelRules);
	}
Within this list, get the ParamEntry at the given index
@param index is the given index
@return the selected ParamEntry
Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/lang/ParamListStandard.java