code: function(containerBlock) {
      // Parameter list.
      this.arguments_ = [];
      this.paramIds_ = [];
      var paramBlock = containerBlock.getInputTargetBlock('STACK');
      while (paramBlock) {
        this.arguments_.push(paramBlock.getFieldValue('NAME'));
        this.paramIds_.push(paramBlock.id);
        paramBlock = paramBlock.nextConnection &&
            paramBlock.nextConnection.targetBlock();
      }
      this.updateParams_();
      Blockly.Procedures.mutateCallers(this);
  
      // Show/hide the statement input.
      var hasStatements = containerBlock.getFieldValue('STATEMENTS');
      if (hasStatements !== null) {
        hasStatements = hasStatements == 'TRUE';
        if (this.hasStatements_ != hasStatements) {
          if (hasStatements) {
            this.setStatements_(true);
            // Restore the stack, if one was saved.
            Blockly.Mutator.reconnect(this.statementConnection_, this, 'STACK');
            this.statementConnection_ = null;
          } else {
            // Save the stack, then disconnect it.
            var stackConnection = this.getInput('STACK').connection;
            this.statementConnection_ = stackConnection.targetConnection;
            if (this.statementConnection_) {
              var stackBlock = stackConnection.targetBlock();
              stackBlock.unplug();
              stackBlock.bumpNeighbours_();
            }
            this.setStatements_(false);
          }
        }
      }
    }
docs: Reconfigure this block based on the mutator dialog's components.
  @param {!Blockly.Block} containerBlock Root block in mutator.
  @this Blockly.Block