public void decodePrototype(Decoder decoder, PcodeFactory pcodeFactory)
			throws DecoderException {
		PcodeDataTypeManager dtmanage = pcodeFactory.getDataTypeManager();
		int node = decoder.openElement(ELEM_PROTOTYPE);
		modelname = decoder.readString(ATTRIB_MODEL);
		PrototypeModel protoModel =
			dtmanage.getProgram().getCompilerSpec().getCallingConvention(modelname);
		hasThis = (protoModel == null) ? false : protoModel.hasThisPointer();
		extrapop = (int) decoder.readSignedIntegerExpectString(ATTRIB_EXTRAPOP, "unknown",
			PrototypeModel.UNKNOWN_EXTRAPOP);
		modellock = false;
		dotdotdot = false;
		voidinputlock = false;
		isinline = false;
		noreturn = false;
		custom = false;
		isConstruct = false;
		isDestruct = false;
		for (;;) {
			int attribId = decoder.getNextAttributeId();
			if (attribId == 0) {
				break;
			}
			if (attribId == ATTRIB_MODELLOCK.id()) {
				modellock = decoder.readBool();
			}
			else if (attribId == ATTRIB_DOTDOTDOT.id()) {
				dotdotdot = decoder.readBool();
			}
			else if (attribId == ATTRIB_VOIDLOCK.id()) {
				voidinputlock = decoder.readBool();
			}
			else if (attribId == ATTRIB_INLINE.id()) {
				isinline = decoder.readBool();
			}
			else if (attribId == ATTRIB_NORETURN.id()) {
				noreturn = decoder.readBool();
			}
			else if (attribId == ATTRIB_CUSTOM.id()) {
				custom = decoder.readBool();
			}
			else if (attribId == ATTRIB_CONSTRUCTOR.id()) {
				isConstruct = decoder.readBool();
			}
			else if (attribId == ATTRIB_DESTRUCTOR.id()) {
				isDestruct = decoder.readBool();
			}
		}
		int retel = decoder.openElement(ELEM_RETURNSYM);
		outputlock = false;
		for (;;) {
			int attribId = decoder.getNextAttributeId();
			if (attribId == 0) {
				break;
			}
			if (attribId == ATTRIB_TYPELOCK.id()) {
				outputlock = decoder.readBool();
			}
		}

		int addrel = decoder.openElement(ELEM_ADDR);
		returnstorage = AddressXML.decodeStorageFromAttributes(-1, decoder, pcodeFactory);
		decoder.closeElement(addrel);
		returntype = dtmanage.decodeDataType(decoder);
		decoder.closeElement(retel);

		decoder.closeElementSkipping(node);
	}
Decode the function prototype from a {@code <prototype>} element in the stream.
@param decoder is the stream decoder
@param pcodeFactory is used to resolve data-type and address space references
@throws DecoderException for invalid encodings
Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/pcode/FunctionPrototype.java