diff --git a/blocks/procedures.js b/blocks/procedures.js
index ba252e162..7a0abf716 100644
--- a/blocks/procedures.js
+++ b/blocks/procedures.js
@@ -164,26 +164,44 @@ Blockly.Blocks['procedures_defnoreturn'] = {
* @this Blockly.Block
*/
decompose: function(workspace) {
- var xml = Blockly.Xml.textToDom(
- '' +
- ' ' +
- '');
- var node = xml.getElementsByTagName('statement')[0];
+ /*
+ * Creates the following XML:
+ *
+ *
+ *
+ * arg1_name
+ * etc...
+ *
+ *
+ *
+ */
+
+ var containerBlockNode = Blockly.utils.xml.createElement('block');
+ containerBlockNode.setAttribute('type', 'procedures_mutatorcontainer');
+ var statementNode = Blockly.utils.xml.createElement('statement');
+ statementNode.setAttribute('name', 'STACK');
+ containerBlockNode.appendChild(statementNode);
+
+ var node = statementNode;
for (var i = 0; i < this.arguments_.length; i++) {
- node.appendChild(Blockly.Xml.textToDom(
- '' +
- ' ' + this.arguments_[i] + '' +
- ' ' +
- ''
- ));
- node = node.getElementsByTagName('next')[0];
+ var argBlockNode = Blockly.utils.xml.createElement('block');
+ argBlockNode.setAttribute('type', 'procedures_mutatorarg');
+ var fieldNode = Blockly.utils.xml.createElement('field');
+ fieldNode.setAttribute('name', 'NAME');
+ var argumentName = Blockly.utils.xml.createTextNode(this.arguments_[i]);
+ fieldNode.appendChild(argumentName);
+ argBlockNode.appendChild(fieldNode);
+ var nextNode = Blockly.utils.xml.createElement('next');
+ argBlockNode.appendChild(nextNode);
+
+ node.appendChild(argBlockNode);
+ node = nextNode;
}
- var containerBlock = Blockly.Xml.domToBlock(xml, workspace);
+ var containerBlock = Blockly.Xml.domToBlock(containerBlockNode, workspace);
if (this.type == 'procedures_defreturn') {
- containerBlock.setFieldValue(
- this.hasStatements_ ? 'TRUE' : 'FALSE', 'STATEMENTS');
+ containerBlock.setFieldValue(this.hasStatements_, 'STATEMENTS');
} else {
containerBlock.removeInput('STATEMENT_INPUT');
}