private boolean applyFunctionData(boolean commitFullParamDetails) {

		try {

			String name = functionData.getName();
			if (!name.equals(function.getName())) {
				function.setName(name, SourceType.USER_DEFINED);
			}

			boolean isInline = functionData.isInline();
			if (function.isInline() != isInline) {
				function.setInline(isInline);
			}

			boolean hasNoReturn = functionData.hasNoReturn();
			if (function.hasNoReturn() != hasNoReturn) {
				function.setNoReturn(hasNoReturn);
			}

			String fixupName = functionData.getCallFixupName();
			if (!SystemUtilities.isEqual(fixupName, function.getCallFixup())) {
				function.setCallFixup(fixupName);
			}

			boolean hasVarArgs = hasVarArgs();
			if (function.hasVarArgs() != hasVarArgs) {
				function.setVarArgs(hasVarArgs);
			}

			String callingConventionName = functionData.getCallingConventionName();
			boolean isCallingConventionChanged =
				!Objects.equals(callingConventionName, originalFunctionData.callingConventionName);

			boolean useCustomStorage = functionData.canCustomizeStorage();

			if (!commitFullParamDetails) {

				// Partial commit without return/parameter details - no need for source type change

				if (useCustomStorage != function.hasCustomVariableStorage()) {
					function.setCustomVariableStorage(useCustomStorage);
				}

				if (isCallingConventionChanged) {
					function.setCallingConvention(callingConventionName);
				}

				if (!hasSignificantParameterChanges &&
					functionData.hasParameterNamesChanged(originalFunctionData)) {

					for (ParamInfo paramInfo : functionData.getParameters()) {
						Parameter param = function.getParameter(paramInfo.getOrdinal());
						if (param != null) {
							if (param.getSymbol().isDeleted()) {
								// concurrent removal of param - must do full update
								break;
							}
							param.setName(paramInfo.getName(), SourceType.USER_DEFINED);
						}
					}
				}

				return true;
			}

			SourceType sigSource =
				hasSignificantParameterChanges ? SourceType.USER_DEFINED : SourceType.ANALYSIS;

			SymbolTable symbolTable = program.getSymbolTable();

			List<Parameter> params = new ArrayList<>();
			for (ParamInfo paramInfo : functionData.getParameters()) {
				if (paramInfo.isAutoParameter()) {
					continue;
				}
				SourceType source = SourceType.USER_DEFINED;
				Symbol var = symbolTable.getLocalVariableSymbol(paramInfo.getName(), function);
				if (var instanceof Parameter) {
					source = var.getSource();
				}
				params.add(paramInfo.getParameter(source));
			}

			// TODO: How should we handle conflicts with locals?
			function.updateFunction(callingConventionName,
				functionData.getReturnInfo().getParameter(SourceType.DEFAULT), params,
				useCustomStorage ? FunctionUpdateType.CUSTOM_STORAGE
						: FunctionUpdateType.DYNAMIC_STORAGE_FORMAL_PARAMS,
				true, sigSource);
		}
		catch (DuplicateNameException e) {
			Msg.showError(this, null, "Function Edit Error", e.getMessage());
			return false;
		}
		catch (InvalidInputException e) {
			Msg.showError(this, null, "Function Edit Error", e.getMessage());
			return false;
		}

		return true;
	}
Change custom storage enablement
@param b enablement state
Ghidra/Features/Base/src/main/java/ghidra/app/plugin/core/function/editor/FunctionEditorModel.java