/ Hex Artifact Content
Login

Artifact 352a4319c0ad869eb26442bf7c3b015aa15594c21f1cce5a6420dbe999367c21:


0000: 23 21 2f 75 73 72 2f 62 69 6e 2f 74 63 6c 73 68  #!/usr/bin/tclsh
0010: 0a 23 0a 23 20 47 65 6e 65 72 61 74 65 20 74 68  .#.# Generate th
0020: 65 20 66 69 6c 65 20 6f 70 63 6f 64 65 73 2e 68  e file opcodes.h
0030: 2e 0a 23 0a 23 20 54 68 69 73 20 54 43 4c 20 73  ..#.# This TCL s
0040: 63 72 69 70 74 20 73 63 61 6e 73 20 61 20 63 6f  cript scans a co
0050: 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f 66 20 74  ncatenation of t
0060: 68 65 20 70 61 72 73 65 2e 68 20 6f 75 74 70 75  he parse.h outpu
0070: 74 20 66 69 6c 65 20 66 72 6f 6d 20 74 68 65 0a  t file from the.
0080: 23 20 70 61 72 73 65 72 20 61 6e 64 20 74 68 65  # parser and the
0090: 20 76 64 62 65 2e 63 20 73 6f 75 72 63 65 20 66   vdbe.c source f
00a0: 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f 20  ile in order to 
00b0: 67 65 6e 65 72 61 74 65 20 74 68 65 20 6f 70 63  generate the opc
00c0: 6f 64 65 73 20 6e 75 6d 62 65 72 73 0a 23 20 66  odes numbers.# f
00d0: 6f 72 20 61 6c 6c 20 6f 70 63 6f 64 65 73 2e 20  or all opcodes. 
00e0: 20 0a 23 0a 23 20 54 68 65 20 6c 69 6e 65 73 20   .#.# The lines 
00f0: 6f 66 20 74 68 65 20 76 64 62 65 2e 63 20 74 68  of the vdbe.c th
0100: 61 74 20 77 65 20 61 72 65 20 69 6e 74 65 72 65  at we are intere
0110: 73 74 65 64 20 69 6e 20 61 72 65 20 6f 66 20 74  sted in are of t
0120: 68 65 20 66 6f 72 6d 3a 0a 23 0a 23 20 20 20 20  he form:.#.#    
0130: 20 20 20 63 61 73 65 20 4f 50 5f 61 61 61 61 3a     case OP_aaaa:
0140: 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61 73        /* same as
0150: 20 54 4b 5f 62 62 62 62 62 20 2a 2f 0a 23 0a 23   TK_bbbbb */.#.#
0160: 20 54 68 65 20 54 4b 5f 20 63 6f 6d 6d 65 6e 74   The TK_ comment
0170: 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49   is optional.  I
0180: 66 20 69 74 20 69 73 20 70 72 65 73 65 6e 74 2c  f it is present,
0190: 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65 20   then the value 
01a0: 61 73 73 69 67 6e 65 64 20 74 6f 0a 23 20 74 68  assigned to.# th
01b0: 65 20 4f 50 5f 20 69 73 20 74 68 65 20 73 61 6d  e OP_ is the sam
01c0: 65 20 61 73 20 74 68 65 20 54 4b 5f 20 76 61 6c  e as the TK_ val
01d0: 75 65 2e 20 20 49 66 20 6d 69 73 73 69 6e 67 2c  ue.  If missing,
01e0: 20 74 68 65 20 4f 50 5f 20 76 61 6c 75 65 20 69   the OP_ value i
01f0: 73 20 61 73 73 69 67 6e 65 64 0a 23 20 61 20 73  s assigned.# a s
0200: 6d 61 6c 6c 20 69 6e 74 65 67 65 72 20 74 68 61  mall integer tha
0210: 74 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66  t is different f
0220: 72 6f 6d 20 65 76 65 72 79 20 6f 74 68 65 72 20  rom every other 
0230: 4f 50 5f 20 76 61 6c 75 65 2e 0a 23 0a 23 20 57  OP_ value..#.# W
0240: 65 20 67 6f 20 74 6f 20 74 68 65 20 74 72 6f 75  e go to the trou
0250: 62 6c 65 20 6f 66 20 6d 61 6b 69 6e 67 20 73 6f  ble of making so
0260: 6d 65 20 4f 50 5f 20 76 61 6c 75 65 73 20 74 68  me OP_ values th
0270: 65 20 73 61 6d 65 20 61 73 20 54 4b 5f 20 76 61  e same as TK_ va
0280: 6c 75 65 73 0a 23 20 61 73 20 61 6e 20 6f 70 74  lues.# as an opt
0290: 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 44 75 72 69  imization.  Duri
02a0: 6e 67 20 70 61 72 73 69 6e 67 2c 20 74 68 69 6e  ng parsing, thin
02b0: 67 73 20 6c 69 6b 65 20 65 78 70 72 65 73 73 69  gs like expressi
02c0: 6f 6e 20 6f 70 65 72 61 74 6f 72 73 0a 23 20 61  on operators.# a
02d0: 72 65 20 63 6f 64 65 64 20 77 69 74 68 20 54 4b  re coded with TK
02e0: 5f 20 76 61 6c 75 65 73 20 73 75 63 68 20 61 73  _ values such as
02f0: 20 54 4b 5f 41 44 44 2c 20 54 4b 5f 44 49 56 49   TK_ADD, TK_DIVI
0300: 44 45 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74 68  DE, and so forth
0310: 2e 20 20 4c 61 74 65 72 0a 23 20 64 75 72 69 6e  .  Later.# durin
0320: 67 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f  g code generatio
0330: 6e 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 67 65  n, we need to ge
0340: 6e 65 72 61 74 65 20 63 6f 72 72 65 73 70 6f 6e  nerate correspon
0350: 64 69 6e 67 20 6f 70 63 6f 64 65 73 20 6c 69 6b  ding opcodes lik
0360: 65 0a 23 20 4f 50 5f 41 64 64 20 61 6e 64 20 4f  e.# OP_Add and O
0370: 50 5f 44 69 76 69 64 65 2e 20 20 42 79 20 6d 61  P_Divide.  By ma
0380: 6b 69 6e 67 20 54 4b 5f 41 44 44 3d 3d 4f 50 5f  king TK_ADD==OP_
0390: 41 64 64 20 61 6e 64 20 54 4b 5f 44 49 56 49 44  Add and TK_DIVID
03a0: 45 3d 3d 4f 50 5f 44 69 76 69 64 65 2c 0a 23 20  E==OP_Divide,.# 
03b0: 63 6f 64 65 20 74 6f 20 74 72 61 6e 73 6c 61 74  code to translat
03c0: 65 20 66 72 6f 6d 20 6f 6e 65 20 74 6f 20 74 68  e from one to th
03d0: 65 20 6f 74 68 65 72 20 69 73 20 61 76 6f 69 64  e other is avoid
03e0: 65 64 2e 20 20 54 68 69 73 20 6d 61 6b 65 73 20  ed.  This makes 
03f0: 74 68 65 0a 23 20 63 6f 64 65 20 67 65 6e 65 72  the.# code gener
0400: 61 74 6f 72 20 73 6d 61 6c 6c 65 72 20 61 6e 64  ator smaller and
0410: 20 66 61 73 74 65 72 2e 0a 23 0a 23 20 54 68 69   faster..#.# Thi
0420: 73 20 73 63 72 69 70 74 20 61 6c 73 6f 20 73 63  s script also sc
0430: 61 6e 73 20 66 6f 72 20 6c 69 6e 65 73 20 6f 66  ans for lines of
0440: 20 74 68 65 20 66 6f 72 6d 3a 0a 23 0a 23 20 20   the form:.#.#  
0450: 20 20 20 20 20 63 61 73 65 20 4f 50 5f 61 61 61       case OP_aaa
0460: 61 3a 20 20 20 20 20 20 20 2f 2a 20 6a 75 6d 70  a:       /* jump
0470: 2c 20 69 6e 31 2c 20 69 6e 32 2c 20 69 6e 33 2c  , in1, in2, in3,
0480: 20 6f 75 74 32 2c 20 6f 75 74 33 20 2a 2f 0a 23   out2, out3 */.#
0490: 0a 23 20 57 68 65 6e 20 73 75 63 68 20 63 6f 6d  .# When such com
04a0: 6d 65 6e 74 73 20 61 72 65 20 66 6f 75 6e 64 20  ments are found 
04b0: 6f 6e 20 61 6e 20 6f 70 63 6f 64 65 2c 20 69 74  on an opcode, it
04c0: 20 6d 65 61 6e 73 20 74 68 61 74 20 63 65 72 74   means that cert
04d0: 61 69 6e 0a 23 20 70 72 6f 70 65 72 74 69 65 73  ain.# properties
04e0: 20 61 70 70 6c 79 20 74 6f 20 74 68 61 74 20 6f   apply to that o
04f0: 70 63 6f 64 65 2e 20 20 53 65 74 20 63 6f 72 72  pcode.  Set corr
0500: 65 73 70 6f 6e 64 69 6e 67 20 66 6c 61 67 73 20  esponding flags 
0510: 75 73 69 6e 67 20 74 68 65 0a 23 20 4f 50 46 4c  using the.# OPFL
0520: 47 5f 49 4e 49 54 49 41 4c 49 5a 45 52 20 6d 61  G_INITIALIZER ma
0530: 63 72 6f 2e 0a 23 0a 0a 73 65 74 20 69 6e 20 73  cro..#..set in s
0540: 74 64 69 6e 0a 73 65 74 20 63 75 72 72 65 6e 74  tdin.set current
0550: 4f 70 20 7b 7d 0a 73 65 74 20 70 72 65 76 4e 61  Op {}.set prevNa
0560: 6d 65 20 7b 7d 0a 73 65 74 20 6e 4f 70 20 30 0a  me {}.set nOp 0.
0570: 73 65 74 20 6e 47 72 6f 75 70 20 30 0a 77 68 69  set nGroup 0.whi
0580: 6c 65 20 7b 21 5b 65 6f 66 20 24 69 6e 5d 7d 20  le {![eof $in]} 
0590: 7b 0a 20 20 73 65 74 20 6c 69 6e 65 20 5b 67 65  {.  set line [ge
05a0: 74 73 20 24 69 6e 5d 0a 0a 20 20 23 20 52 65 6d  ts $in]..  # Rem
05b0: 65 6d 62 65 72 20 74 68 65 20 54 4b 5f 20 76 61  ember the TK_ va
05c0: 6c 75 65 73 20 66 72 6f 6d 20 74 68 65 20 70 61  lues from the pa
05d0: 72 73 65 2e 68 20 66 69 6c 65 2e 20 0a 20 20 23  rse.h file. .  #
05e0: 20 4e 42 3a 20 20 54 68 65 20 22 54 4b 5f 22 20   NB:  The "TK_" 
05f0: 70 72 65 66 69 78 20 73 74 61 6e 64 73 20 66 6f  prefix stands fo
0600: 72 20 22 54 6f 4b 65 6e 22 2c 20 6e 6f 74 20 74  r "ToKen", not t
0610: 68 65 20 67 72 61 70 68 69 63 61 6c 20 54 6b 20  he graphical Tk 
0620: 74 6f 6f 6c 6b 69 74 0a 20 20 23 20 63 6f 6d 6d  toolkit.  # comm
0630: 6f 6e 6c 79 20 61 73 73 6f 63 69 61 74 65 64 20  only associated 
0640: 77 69 74 68 20 54 43 4c 2e 0a 20 20 23 0a 20 20  with TCL..  #.  
0650: 69 66 20 7b 5b 72 65 67 65 78 70 20 7b 5e 23 64  if {[regexp {^#d
0660: 65 66 69 6e 65 20 54 4b 5f 7d 20 24 6c 69 6e 65  efine TK_} $line
0670: 5d 7d 20 7b 0a 20 20 20 20 73 65 74 20 74 6b 28  ]} {.    set tk(
0680: 5b 6c 69 6e 64 65 78 20 24 6c 69 6e 65 20 31 5d  [lindex $line 1]
0690: 29 20 5b 6c 69 6e 64 65 78 20 24 6c 69 6e 65 20  ) [lindex $line 
06a0: 32 5d 0a 20 20 20 20 63 6f 6e 74 69 6e 75 65 0a  2].    continue.
06b0: 20 20 7d 0a 0a 20 20 23 20 46 69 6e 64 20 22 2f    }..  # Find "/
06c0: 2a 20 4f 70 63 6f 64 65 3a 20 22 20 6c 69 6e 65  * Opcode: " line
06d0: 73 20 69 6e 20 74 68 65 20 76 64 62 65 2e 63 20  s in the vdbe.c 
06e0: 66 69 6c 65 2e 20 20 45 61 63 68 20 6f 6e 65 20  file.  Each one 
06f0: 69 6e 74 72 6f 64 75 63 65 73 0a 20 20 23 20 61  introduces.  # a
0700: 20 6e 65 77 20 6f 70 63 6f 64 65 2e 20 20 52 65   new opcode.  Re
0710: 6d 65 6d 62 65 72 20 77 68 69 63 68 20 70 61 72  member which par
0720: 61 6d 65 74 65 72 73 20 61 72 65 20 75 73 65 64  ameters are used
0730: 2e 0a 20 20 23 0a 20 20 69 66 20 7b 5b 72 65 67  ..  #.  if {[reg
0740: 65 78 70 20 7b 5e 2e 2e 20 4f 70 63 6f 64 65 3a  exp {^.. Opcode:
0750: 20 7d 20 24 6c 69 6e 65 5d 7d 20 7b 0a 20 20 20   } $line]} {.   
0760: 20 73 65 74 20 63 75 72 72 65 6e 74 4f 70 20 4f   set currentOp O
0770: 50 5f 5b 6c 69 6e 64 65 78 20 24 6c 69 6e 65 20  P_[lindex $line 
0780: 32 5d 0a 20 20 20 20 73 65 74 20 6d 20 30 0a 20  2].    set m 0. 
0790: 20 20 20 66 6f 72 65 61 63 68 20 74 65 72 6d 20     foreach term 
07a0: 24 6c 69 6e 65 20 7b 0a 20 20 20 20 20 20 73 77  $line {.      sw
07b0: 69 74 63 68 20 24 74 65 72 6d 20 7b 0a 20 20 20  itch $term {.   
07c0: 20 20 20 20 20 50 31 20 7b 69 6e 63 72 20 6d 20       P1 {incr m 
07d0: 31 7d 0a 20 20 20 20 20 20 20 20 50 32 20 7b 69  1}.        P2 {i
07e0: 6e 63 72 20 6d 20 32 7d 0a 20 20 20 20 20 20 20  ncr m 2}.       
07f0: 20 50 33 20 7b 69 6e 63 72 20 6d 20 34 7d 0a 20   P3 {incr m 4}. 
0800: 20 20 20 20 20 20 20 50 34 20 7b 69 6e 63 72 20         P4 {incr 
0810: 6d 20 38 7d 0a 20 20 20 20 20 20 20 20 50 35 20  m 8}.        P5 
0820: 7b 69 6e 63 72 20 6d 20 31 36 7d 0a 20 20 20 20  {incr m 16}.    
0830: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 65    }.    }.    se
0840: 74 20 70 61 72 61 6d 75 73 65 64 28 24 63 75 72  t paramused($cur
0850: 72 65 6e 74 4f 70 29 20 24 6d 0a 20 20 7d 0a 0a  rentOp) $m.  }..
0860: 20 20 23 20 46 69 6e 64 20 22 2a 2a 20 53 79 6e    # Find "** Syn
0870: 6f 70 73 69 73 3a 20 22 20 6c 69 6e 65 73 20 74  opsis: " lines t
0880: 68 61 74 20 66 6f 6c 6c 6f 77 20 4f 70 63 6f 64  hat follow Opcod
0890: 65 3a 0a 20 20 23 0a 20 20 69 66 20 7b 5b 72 65  e:.  #.  if {[re
08a0: 67 65 78 70 20 7b 5e 2e 2e 20 53 79 6e 6f 70 73  gexp {^.. Synops
08b0: 69 73 3a 20 28 2e 2a 29 7d 20 24 6c 69 6e 65 20  is: (.*)} $line 
08c0: 61 6c 6c 20 78 5d 20 26 26 20 24 63 75 72 72 65  all x] && $curre
08d0: 6e 74 4f 70 21 3d 22 22 7d 20 7b 0a 20 20 20 20  ntOp!=""} {.    
08e0: 73 65 74 20 73 79 6e 6f 70 73 69 73 28 24 63 75  set synopsis($cu
08f0: 72 72 65 6e 74 4f 70 29 20 5b 73 74 72 69 6e 67  rrentOp) [string
0900: 20 74 72 69 6d 20 24 78 5d 0a 20 20 7d 0a 0a 20   trim $x].  }.. 
0910: 20 23 20 53 63 61 6e 20 66 6f 72 20 22 63 61 73   # Scan for "cas
0920: 65 20 4f 50 5f 61 61 61 61 3a 22 20 6c 69 6e 65  e OP_aaaa:" line
0930: 73 20 69 6e 20 74 68 65 20 76 64 62 65 2e 63 20  s in the vdbe.c 
0940: 66 69 6c 65 0a 20 20 23 0a 20 20 69 66 20 7b 5b  file.  #.  if {[
0950: 72 65 67 65 78 70 20 7b 5e 63 61 73 65 20 4f 50  regexp {^case OP
0960: 5f 7d 20 24 6c 69 6e 65 5d 7d 20 7b 0a 20 20 20  _} $line]} {.   
0970: 20 73 65 74 20 6c 69 6e 65 20 5b 73 70 6c 69 74   set line [split
0980: 20 24 6c 69 6e 65 5d 0a 20 20 20 20 73 65 74 20   $line].    set 
0990: 6e 61 6d 65 20 5b 73 74 72 69 6e 67 20 74 72 69  name [string tri
09a0: 6d 20 5b 6c 69 6e 64 65 78 20 24 6c 69 6e 65 20  m [lindex $line 
09b0: 31 5d 20 3a 5d 0a 20 20 20 20 69 66 20 7b 24 6e  1] :].    if {$n
09c0: 61 6d 65 3d 3d 22 4f 50 5f 41 62 6f 72 74 61 62  ame=="OP_Abortab
09d0: 6c 65 22 7d 20 63 6f 6e 74 69 6e 75 65 3b 20 20  le"} continue;  
09e0: 23 20 70 75 74 20 4f 50 5f 41 62 6f 72 74 61 62  # put OP_Abortab
09f0: 6c 65 20 6c 61 73 74 20 0a 20 20 20 20 73 65 74  le last .    set
0a00: 20 6f 70 28 24 6e 61 6d 65 29 20 2d 31 0a 20 20   op($name) -1.  
0a10: 20 20 73 65 74 20 67 72 6f 75 70 28 24 6e 61 6d    set group($nam
0a20: 65 29 20 30 0a 20 20 20 20 73 65 74 20 6a 75 6d  e) 0.    set jum
0a30: 70 28 24 6e 61 6d 65 29 20 30 0a 20 20 20 20 73  p($name) 0.    s
0a40: 65 74 20 69 6e 31 28 24 6e 61 6d 65 29 20 30 0a  et in1($name) 0.
0a50: 20 20 20 20 73 65 74 20 69 6e 32 28 24 6e 61 6d      set in2($nam
0a60: 65 29 20 30 0a 20 20 20 20 73 65 74 20 69 6e 33  e) 0.    set in3
0a70: 28 24 6e 61 6d 65 29 20 30 0a 20 20 20 20 73 65  ($name) 0.    se
0a80: 74 20 6f 75 74 32 28 24 6e 61 6d 65 29 20 30 0a  t out2($name) 0.
0a90: 20 20 20 20 73 65 74 20 6f 75 74 33 28 24 6e 61      set out3($na
0aa0: 6d 65 29 20 30 0a 20 20 20 20 66 6f 72 20 7b 73  me) 0.    for {s
0ab0: 65 74 20 69 20 33 7d 20 7b 24 69 3c 5b 6c 6c 65  et i 3} {$i<[lle
0ac0: 6e 67 74 68 20 24 6c 69 6e 65 5d 2d 31 7d 20 7b  ngth $line]-1} {
0ad0: 69 6e 63 72 20 69 7d 20 7b 0a 20 20 20 20 20 20  incr i} {.      
0ae0: 20 73 77 69 74 63 68 20 5b 73 74 72 69 6e 67 20   switch [string 
0af0: 74 72 69 6d 20 5b 6c 69 6e 64 65 78 20 24 6c 69  trim [lindex $li
0b00: 6e 65 20 24 69 5d 20 2c 5d 20 7b 0a 20 20 20 20  ne $i] ,] {.    
0b10: 20 20 20 20 20 73 61 6d 65 20 7b 0a 20 20 20 20       same {.    
0b20: 20 20 20 20 20 20 20 69 6e 63 72 20 69 0a 20 20         incr i.  
0b30: 20 20 20 20 20 20 20 20 20 69 66 20 7b 5b 6c 69           if {[li
0b40: 6e 64 65 78 20 24 6c 69 6e 65 20 24 69 5d 3d 3d  ndex $line $i]==
0b50: 22 61 73 22 7d 20 7b 0a 20 20 20 20 20 20 20 20  "as"} {.        
0b60: 20 20 20 20 20 69 6e 63 72 20 69 0a 20 20 20 20       incr i.    
0b70: 20 20 20 20 20 20 20 20 20 73 65 74 20 73 79 6d           set sym
0b80: 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 5b 6c   [string trim [l
0b90: 69 6e 64 65 78 20 24 6c 69 6e 65 20 24 69 5d 20  index $line $i] 
0ba0: 2c 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ,].             
0bb0: 73 65 74 20 76 61 6c 20 24 74 6b 28 24 73 79 6d  set val $tk($sym
0bc0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 73  ).             s
0bd0: 65 74 20 6f 70 28 24 6e 61 6d 65 29 20 24 76 61  et op($name) $va
0be0: 6c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 73  l.             s
0bf0: 65 74 20 75 73 65 64 28 24 76 61 6c 29 20 31 0a  et used($val) 1.
0c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74               set
0c10: 20 73 61 6d 65 61 73 28 24 76 61 6c 29 20 24 73   sameas($val) $s
0c20: 79 6d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ym.             
0c30: 73 65 74 20 64 65 66 28 24 76 61 6c 29 20 24 6e  set def($val) $n
0c40: 61 6d 65 0a 20 20 20 20 20 20 20 20 20 20 20 7d  ame.           }
0c50: 0a 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  .         }.    
0c60: 20 20 20 20 20 67 72 6f 75 70 20 7b 73 65 74 20       group {set 
0c70: 67 72 6f 75 70 28 24 6e 61 6d 65 29 20 31 7d 0a  group($name) 1}.
0c80: 20 20 20 20 20 20 20 20 20 6a 75 6d 70 20 20 7b           jump  {
0c90: 73 65 74 20 6a 75 6d 70 28 24 6e 61 6d 65 29 20  set jump($name) 
0ca0: 31 7d 0a 20 20 20 20 20 20 20 20 20 69 6e 31 20  1}.         in1 
0cb0: 20 20 7b 73 65 74 20 69 6e 31 28 24 6e 61 6d 65    {set in1($name
0cc0: 29 20 31 7d 0a 20 20 20 20 20 20 20 20 20 69 6e  ) 1}.         in
0cd0: 32 20 20 20 7b 73 65 74 20 69 6e 32 28 24 6e 61  2   {set in2($na
0ce0: 6d 65 29 20 31 7d 0a 20 20 20 20 20 20 20 20 20  me) 1}.         
0cf0: 69 6e 33 20 20 20 7b 73 65 74 20 69 6e 33 28 24  in3   {set in3($
0d00: 6e 61 6d 65 29 20 31 7d 0a 20 20 20 20 20 20 20  name) 1}.       
0d10: 20 20 6f 75 74 32 20 20 7b 73 65 74 20 6f 75 74    out2  {set out
0d20: 32 28 24 6e 61 6d 65 29 20 31 7d 0a 20 20 20 20  2($name) 1}.    
0d30: 20 20 20 20 20 6f 75 74 33 20 20 7b 73 65 74 20       out3  {set 
0d40: 6f 75 74 33 28 24 6e 61 6d 65 29 20 31 7d 0a 20  out3($name) 1}. 
0d50: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
0d60: 20 20 69 66 20 7b 24 67 72 6f 75 70 28 24 6e 61    if {$group($na
0d70: 6d 65 29 7d 20 7b 0a 20 20 20 20 20 20 73 65 74  me)} {.      set
0d80: 20 6e 65 77 47 72 6f 75 70 20 30 0a 20 20 20 20   newGroup 0.    
0d90: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
0da0: 74 73 20 67 72 6f 75 70 73 28 24 6e 47 72 6f 75  ts groups($nGrou
0db0: 70 29 5d 7d 20 7b 0a 20 20 20 20 20 20 20 20 69  p)]} {.        i
0dc0: 66 20 7b 24 70 72 65 76 4e 61 6d 65 3d 3d 22 22  f {$prevName==""
0dd0: 20 7c 7c 20 21 24 67 72 6f 75 70 28 24 70 72 65   || !$group($pre
0de0: 76 4e 61 6d 65 29 7d 20 7b 0a 20 20 20 20 20 20  vName)} {.      
0df0: 20 20 20 20 73 65 74 20 6e 65 77 47 72 6f 75 70      set newGroup
0e00: 20 31 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   1.        }.   
0e10: 20 20 20 7d 0a 20 20 20 20 20 20 6c 61 70 70 65     }.      lappe
0e20: 6e 64 20 67 72 6f 75 70 73 28 24 6e 47 72 6f 75  nd groups($nGrou
0e30: 70 29 20 24 6e 61 6d 65 0a 20 20 20 20 20 20 69  p) $name.      i
0e40: 66 20 7b 24 6e 65 77 47 72 6f 75 70 7d 20 7b 69  f {$newGroup} {i
0e50: 6e 63 72 20 6e 47 72 6f 75 70 7d 0a 20 20 20 20  ncr nGroup}.    
0e60: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 69  } else {.      i
0e70: 66 20 7b 24 70 72 65 76 4e 61 6d 65 21 3d 22 22  f {$prevName!=""
0e80: 20 26 26 20 24 67 72 6f 75 70 28 24 70 72 65 76   && $group($prev
0e90: 4e 61 6d 65 29 7d 20 7b 0a 20 20 20 20 20 20 20  Name)} {.       
0ea0: 20 69 6e 63 72 20 6e 47 72 6f 75 70 0a 20 20 20   incr nGroup.   
0eb0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
0ec0: 65 74 20 6f 72 64 65 72 28 24 6e 4f 70 29 20 24  et order($nOp) $
0ed0: 6e 61 6d 65 0a 20 20 20 20 73 65 74 20 70 72 65  name.    set pre
0ee0: 76 4e 61 6d 65 20 24 6e 61 6d 65 0a 20 20 20 20  vName $name.    
0ef0: 69 6e 63 72 20 6e 4f 70 0a 20 20 7d 0a 7d 0a 0a  incr nOp.  }.}..
0f00: 23 20 41 73 73 69 67 6e 20 6e 75 6d 62 65 72 73  # Assign numbers
0f10: 20 74 6f 20 61 6c 6c 20 6f 70 63 6f 64 65 73 20   to all opcodes 
0f20: 61 6e 64 20 6f 75 74 70 75 74 20 74 68 65 20 72  and output the r
0f30: 65 73 75 6c 74 2e 0a 23 0a 70 75 74 73 20 22 2f  esult..#.puts "/
0f40: 2a 20 41 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  * Automatically 
0f50: 67 65 6e 65 72 61 74 65 64 2e 20 20 44 6f 20 6e  generated.  Do n
0f60: 6f 74 20 65 64 69 74 20 2a 2f 22 0a 70 75 74 73  ot edit */".puts
0f70: 20 22 2f 2a 20 53 65 65 20 74 68 65 20 74 6f 6f   "/* See the too
0f80: 6c 2f 6d 6b 6f 70 63 6f 64 65 68 2e 74 63 6c 20  l/mkopcodeh.tcl 
0f90: 73 63 72 69 70 74 20 66 6f 72 20 64 65 74 61 69  script for detai
0fa0: 6c 73 20 2a 2f 22 0a 66 6f 72 65 61 63 68 20 6e  ls */".foreach n
0fb0: 61 6d 65 20 7b 4f 50 5f 4e 6f 6f 70 20 4f 50 5f  ame {OP_Noop OP_
0fc0: 45 78 70 6c 61 69 6e 20 4f 50 5f 41 62 6f 72 74  Explain OP_Abort
0fd0: 61 62 6c 65 7d 20 7b 0a 20 20 73 65 74 20 6a 75  able} {.  set ju
0fe0: 6d 70 28 24 6e 61 6d 65 29 20 30 0a 20 20 73 65  mp($name) 0.  se
0ff0: 74 20 69 6e 31 28 24 6e 61 6d 65 29 20 30 0a 20  t in1($name) 0. 
1000: 20 73 65 74 20 69 6e 32 28 24 6e 61 6d 65 29 20   set in2($name) 
1010: 30 0a 20 20 73 65 74 20 69 6e 33 28 24 6e 61 6d  0.  set in3($nam
1020: 65 29 20 30 0a 20 20 73 65 74 20 6f 75 74 32 28  e) 0.  set out2(
1030: 24 6e 61 6d 65 29 20 30 0a 20 20 73 65 74 20 6f  $name) 0.  set o
1040: 75 74 33 28 24 6e 61 6d 65 29 20 30 0a 20 20 73  ut3($name) 0.  s
1050: 65 74 20 6f 70 28 24 6e 61 6d 65 29 20 2d 31 0a  et op($name) -1.
1060: 20 20 73 65 74 20 6f 72 64 65 72 28 24 6e 4f 70    set order($nOp
1070: 29 20 24 6e 61 6d 65 0a 20 20 69 6e 63 72 20 6e  ) $name.  incr n
1080: 4f 70 0a 7d 0a 0a 23 20 54 68 65 20 66 6f 6c 6c  Op.}..# The foll
1090: 6f 77 69 6e 67 20 61 72 65 20 74 68 65 20 6f 70  owing are the op
10a0: 63 6f 64 65 73 20 74 68 61 74 20 61 72 65 20 70  codes that are p
10b0: 72 6f 63 65 73 73 65 64 20 62 79 20 72 65 73 6f  rocessed by reso
10c0: 6c 76 65 50 32 56 61 6c 75 65 73 28 29 0a 23 0a  lveP2Values().#.
10d0: 73 65 74 20 72 70 32 76 5f 6f 70 73 20 7b 0a 20  set rp2v_ops {. 
10e0: 20 4f 50 5f 54 72 61 6e 73 61 63 74 69 6f 6e 0a   OP_Transaction.
10f0: 20 20 4f 50 5f 41 75 74 6f 43 6f 6d 6d 69 74 0a    OP_AutoCommit.
1100: 20 20 4f 50 5f 53 61 76 65 70 6f 69 6e 74 0a 20    OP_Savepoint. 
1110: 20 4f 50 5f 43 68 65 63 6b 70 6f 69 6e 74 0a 20   OP_Checkpoint. 
1120: 20 4f 50 5f 56 61 63 75 75 6d 0a 20 20 4f 50 5f   OP_Vacuum.  OP_
1130: 4a 6f 75 72 6e 61 6c 4d 6f 64 65 0a 20 20 4f 50  JournalMode.  OP
1140: 5f 56 55 70 64 61 74 65 0a 20 20 4f 50 5f 56 46  _VUpdate.  OP_VF
1150: 69 6c 74 65 72 0a 20 20 4f 50 5f 4e 65 78 74 0a  ilter.  OP_Next.
1160: 20 20 4f 50 5f 4e 65 78 74 49 66 4f 70 65 6e 0a    OP_NextIfOpen.
1170: 20 20 4f 50 5f 53 6f 72 74 65 72 4e 65 78 74 0a    OP_SorterNext.
1180: 20 20 4f 50 5f 50 72 65 76 0a 20 20 4f 50 5f 50    OP_Prev.  OP_P
1190: 72 65 76 49 66 4f 70 65 6e 0a 7d 0a 0a 23 20 41  revIfOpen.}..# A
11a0: 73 73 69 67 6e 20 73 6d 61 6c 6c 20 76 61 6c 75  ssign small valu
11b0: 65 73 20 74 6f 20 6f 70 63 6f 64 65 73 20 74 68  es to opcodes th
11c0: 61 74 20 61 72 65 20 70 72 6f 63 65 73 73 65 64  at are processed
11d0: 20 62 79 20 72 65 73 6f 6c 76 65 50 32 56 61 6c   by resolveP2Val
11e0: 75 65 73 28 29 0a 23 20 74 6f 20 6d 61 6b 65 20  ues().# to make 
11f0: 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 20  code generation 
1200: 66 6f 72 20 74 68 65 20 73 77 69 74 63 68 28 29  for the switch()
1210: 20 73 74 61 74 65 6d 65 6e 74 20 73 6d 61 6c 6c   statement small
1220: 65 72 20 61 6e 64 20 66 61 73 74 65 72 2e 0a 23  er and faster..#
1230: 0a 73 65 74 20 63 6e 74 20 2d 31 0a 66 6f 72 20  .set cnt -1.for 
1240: 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 3c 24 6e  {set i 0} {$i<$n
1250: 4f 70 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20  Op} {incr i} {. 
1260: 20 73 65 74 20 6e 61 6d 65 20 24 6f 72 64 65 72   set name $order
1270: 28 24 69 29 0a 20 20 69 66 20 7b 5b 6c 73 65 61  ($i).  if {[lsea
1280: 72 63 68 20 24 72 70 32 76 5f 6f 70 73 20 24 6e  rch $rp2v_ops $n
1290: 61 6d 65 5d 3e 3d 30 7d 20 7b 0a 20 20 20 20 69  ame]>=0} {.    i
12a0: 6e 63 72 20 63 6e 74 0a 20 20 20 20 77 68 69 6c  ncr cnt.    whil
12b0: 65 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  e {[info exists 
12c0: 75 73 65 64 28 24 63 6e 74 29 5d 7d 20 7b 69 6e  used($cnt)]} {in
12d0: 63 72 20 63 6e 74 7d 0a 20 20 20 20 73 65 74 20  cr cnt}.    set 
12e0: 6f 70 28 24 6e 61 6d 65 29 20 24 63 6e 74 0a 20  op($name) $cnt. 
12f0: 20 20 20 73 65 74 20 75 73 65 64 28 24 63 6e 74     set used($cnt
1300: 29 20 31 0a 20 20 20 20 73 65 74 20 64 65 66 28  ) 1.    set def(
1310: 24 63 6e 74 29 20 24 6e 61 6d 65 0a 20 20 7d 0a  $cnt) $name.  }.
1320: 7d 0a 0a 23 20 41 73 73 69 67 6e 20 74 68 65 20  }..# Assign the 
1330: 6e 65 78 74 20 67 72 6f 75 70 20 6f 66 20 76 61  next group of va
1340: 6c 75 65 73 20 74 6f 20 4a 55 4d 50 20 6f 70 63  lues to JUMP opc
1350: 6f 64 65 73 0a 23 0a 66 6f 72 20 7b 73 65 74 20  odes.#.for {set 
1360: 69 20 30 7d 20 7b 24 69 3c 24 6e 4f 70 7d 20 7b  i 0} {$i<$nOp} {
1370: 69 6e 63 72 20 69 7d 20 7b 0a 20 20 73 65 74 20  incr i} {.  set 
1380: 6e 61 6d 65 20 24 6f 72 64 65 72 28 24 69 29 0a  name $order($i).
1390: 20 20 69 66 20 7b 24 6f 70 28 24 6e 61 6d 65 29    if {$op($name)
13a0: 3e 3d 30 7d 20 63 6f 6e 74 69 6e 75 65 0a 20 20  >=0} continue.  
13b0: 69 66 20 7b 21 24 6a 75 6d 70 28 24 6e 61 6d 65  if {!$jump($name
13c0: 29 7d 20 63 6f 6e 74 69 6e 75 65 0a 20 20 69 6e  )} continue.  in
13d0: 63 72 20 63 6e 74 0a 20 20 77 68 69 6c 65 20 7b  cr cnt.  while {
13e0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 75 73 65  [info exists use
13f0: 64 28 24 63 6e 74 29 5d 7d 20 7b 69 6e 63 72 20  d($cnt)]} {incr 
1400: 63 6e 74 7d 0a 20 20 73 65 74 20 6f 70 28 24 6e  cnt}.  set op($n
1410: 61 6d 65 29 20 24 63 6e 74 0a 20 20 73 65 74 20  ame) $cnt.  set 
1420: 75 73 65 64 28 24 63 6e 74 29 20 31 0a 20 20 73  used($cnt) 1.  s
1430: 65 74 20 64 65 66 28 24 63 6e 74 29 20 24 6e 61  et def($cnt) $na
1440: 6d 65 0a 7d 0a 0a 23 20 46 69 6e 64 20 74 68 65  me.}..# Find the
1450: 20 6e 75 6d 65 72 69 63 20 76 61 6c 75 65 20 66   numeric value f
1460: 6f 72 20 74 68 65 20 6c 61 72 67 65 73 74 20 4a  or the largest J
1470: 55 4d 50 20 6f 70 63 6f 64 65 0a 23 0a 73 65 74  UMP opcode.#.set
1480: 20 6d 78 4a 75 6d 70 20 2d 31 0a 66 6f 72 20 7b   mxJump -1.for {
1490: 73 65 74 20 69 20 30 7d 20 7b 24 69 3c 24 6e 4f  set i 0} {$i<$nO
14a0: 70 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20  p} {incr i} {.  
14b0: 73 65 74 20 6e 61 6d 65 20 24 6f 72 64 65 72 28  set name $order(
14c0: 24 69 29 0a 20 20 69 66 20 7b 24 6a 75 6d 70 28  $i).  if {$jump(
14d0: 24 6e 61 6d 65 29 20 26 26 20 24 6f 70 28 24 6e  $name) && $op($n
14e0: 61 6d 65 29 3e 24 6d 78 4a 75 6d 70 7d 20 7b 73  ame)>$mxJump} {s
14f0: 65 74 20 6d 78 4a 75 6d 70 20 24 6f 70 28 24 6e  et mxJump $op($n
1500: 61 6d 65 29 7d 0a 7d 0a 0a 0a 23 20 47 65 6e 65  ame)}.}...# Gene
1510: 72 61 74 65 20 74 68 65 20 6e 75 6d 65 72 69 63  rate the numeric
1520: 20 76 61 6c 75 65 73 20 66 6f 72 20 61 6c 6c 20   values for all 
1530: 72 65 6d 61 69 6e 69 6e 67 20 6f 70 63 6f 64 65  remaining opcode
1540: 73 2c 20 77 68 69 6c 65 0a 23 20 70 72 65 73 65  s, while.# prese
1550: 72 76 69 6e 67 20 61 6e 79 20 67 72 6f 75 70 69  rving any groupi
1560: 6e 67 73 20 6f 66 20 6f 70 63 6f 64 65 73 20 28  ngs of opcodes (
1570: 69 2e 65 2e 20 74 68 6f 73 65 20 74 68 61 74 20  i.e. those that 
1580: 6d 75 73 74 20 62 65 0a 23 20 74 6f 67 65 74 68  must be.# togeth
1590: 65 72 29 2e 0a 23 0a 66 6f 72 20 7b 73 65 74 20  er)..#.for {set 
15a0: 67 20 30 7d 20 7b 24 67 3c 24 6e 47 72 6f 75 70  g 0} {$g<$nGroup
15b0: 7d 20 7b 69 6e 63 72 20 67 7d 20 7b 0a 20 20 73  } {incr g} {.  s
15c0: 65 74 20 67 4c 65 6e 20 5b 6c 6c 65 6e 67 74 68  et gLen [llength
15d0: 20 24 67 72 6f 75 70 73 28 24 67 29 5d 0a 20 20   $groups($g)].  
15e0: 73 65 74 20 6f 6b 20 30 3b 20 73 65 74 20 73 74  set ok 0; set st
15f0: 61 72 74 20 2d 31 0a 20 20 77 68 69 6c 65 20 7b  art -1.  while {
1600: 21 24 6f 6b 7d 20 7b 0a 20 20 20 20 73 65 74 20  !$ok} {.    set 
1610: 73 65 65 6b 20 24 63 6e 74 3b 20 69 6e 63 72 20  seek $cnt; incr 
1620: 73 65 65 6b 0a 20 20 20 20 77 68 69 6c 65 20 7b  seek.    while {
1630: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 75 73 65  [info exists use
1640: 64 28 24 73 65 65 6b 29 5d 7d 20 7b 69 6e 63 72  d($seek)]} {incr
1650: 20 73 65 65 6b 7d 0a 20 20 20 20 73 65 74 20 6f   seek}.    set o
1660: 6b 20 31 3b 20 73 65 74 20 73 74 61 72 74 20 24  k 1; set start $
1670: 73 65 65 6b 0a 20 20 20 20 66 6f 72 20 7b 73 65  seek.    for {se
1680: 74 20 6a 20 30 7d 20 7b 24 6a 3c 24 67 4c 65 6e  t j 0} {$j<$gLen
1690: 7d 20 7b 69 6e 63 72 20 6a 7d 20 7b 0a 20 20 20  } {incr j} {.   
16a0: 20 20 20 69 6e 63 72 20 73 65 65 6b 0a 20 20 20     incr seek.   
16b0: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
16c0: 73 74 73 20 75 73 65 64 28 24 73 65 65 6b 29 5d  sts used($seek)]
16d0: 7d 20 7b 0a 20 20 20 20 20 20 20 20 73 65 74 20  } {.        set 
16e0: 6f 6b 20 30 3b 20 62 72 65 61 6b 0a 20 20 20 20  ok 0; break.    
16f0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
1700: 69 66 20 7b 24 6f 6b 7d 20 7b 0a 20 20 20 20 73  if {$ok} {.    s
1710: 65 74 20 6e 65 78 74 20 24 73 74 61 72 74 0a 20  et next $start. 
1720: 20 20 20 66 6f 72 20 7b 73 65 74 20 6a 20 30 7d     for {set j 0}
1730: 20 7b 24 6a 3c 24 67 4c 65 6e 7d 20 7b 69 6e 63   {$j<$gLen} {inc
1740: 72 20 6a 7d 20 7b 0a 20 20 20 20 20 20 73 65 74  r j} {.      set
1750: 20 6e 61 6d 65 20 5b 6c 69 6e 64 65 78 20 24 67   name [lindex $g
1760: 72 6f 75 70 73 28 24 67 29 20 24 6a 5d 0a 20 20  roups($g) $j].  
1770: 20 20 20 20 69 66 20 7b 24 6f 70 28 24 6e 61 6d      if {$op($nam
1780: 65 29 3e 3d 30 7d 20 63 6f 6e 74 69 6e 75 65 0a  e)>=0} continue.
1790: 20 20 20 20 20 20 73 65 74 20 6f 70 28 24 6e 61        set op($na
17a0: 6d 65 29 20 24 6e 65 78 74 0a 20 20 20 20 20 20  me) $next.      
17b0: 73 65 74 20 75 73 65 64 28 24 6e 65 78 74 29 20  set used($next) 
17c0: 31 0a 20 20 20 20 20 20 73 65 74 20 64 65 66 28  1.      set def(
17d0: 24 6e 65 78 74 29 20 24 6e 61 6d 65 0a 20 20 20  $next) $name.   
17e0: 20 20 20 69 6e 63 72 20 6e 65 78 74 0a 20 20 20     incr next.   
17f0: 20 7d 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20   }.  } else {.  
1800: 20 20 65 72 72 6f 72 20 22 63 61 6e 6e 6f 74 20    error "cannot 
1810: 66 69 6e 64 20 6f 70 63 6f 64 65 73 20 66 6f 72  find opcodes for
1820: 20 67 72 6f 75 70 3a 20 24 67 72 6f 75 70 73 28   group: $groups(
1830: 24 67 29 22 0a 20 20 7d 0a 7d 0a 0a 66 6f 72 20  $g)".  }.}..for 
1840: 7b 73 65 74 20 69 20 30 7d 20 7b 24 69 3c 24 6e  {set i 0} {$i<$n
1850: 4f 70 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20  Op} {incr i} {. 
1860: 20 73 65 74 20 6e 61 6d 65 20 24 6f 72 64 65 72   set name $order
1870: 28 24 69 29 0a 20 20 69 66 20 7b 24 6f 70 28 24  ($i).  if {$op($
1880: 6e 61 6d 65 29 3c 30 7d 20 7b 0a 20 20 20 20 69  name)<0} {.    i
1890: 6e 63 72 20 63 6e 74 0a 20 20 20 20 77 68 69 6c  ncr cnt.    whil
18a0: 65 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  e {[info exists 
18b0: 75 73 65 64 28 24 63 6e 74 29 5d 7d 20 7b 69 6e  used($cnt)]} {in
18c0: 63 72 20 63 6e 74 7d 0a 20 20 20 20 73 65 74 20  cr cnt}.    set 
18d0: 6f 70 28 24 6e 61 6d 65 29 20 24 63 6e 74 0a 20  op($name) $cnt. 
18e0: 20 20 20 73 65 74 20 75 73 65 64 28 24 63 6e 74     set used($cnt
18f0: 29 20 31 0a 20 20 20 20 73 65 74 20 64 65 66 28  ) 1.    set def(
1900: 24 63 6e 74 29 20 24 6e 61 6d 65 0a 20 20 7d 0a  $cnt) $name.  }.
1910: 7d 0a 0a 73 65 74 20 6d 61 78 20 5b 6c 69 6e 64  }..set max [lind
1920: 65 78 20 5b 6c 73 6f 72 74 20 2d 64 65 63 72 20  ex [lsort -decr 
1930: 2d 69 6e 74 65 67 65 72 20 5b 61 72 72 61 79 20  -integer [array 
1940: 6e 61 6d 65 73 20 75 73 65 64 5d 5d 20 30 5d 0a  names used]] 0].
1950: 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20 7b 24  for {set i 0} {$
1960: 69 3c 3d 24 6d 61 78 7d 20 7b 69 6e 63 72 20 69  i<=$max} {incr i
1970: 7d 20 7b 0a 20 20 69 66 20 7b 21 5b 69 6e 66 6f  } {.  if {![info
1980: 20 65 78 69 73 74 73 20 75 73 65 64 28 24 69 29   exists used($i)
1990: 5d 7d 20 7b 0a 20 20 20 20 73 65 74 20 64 65 66  ]} {.    set def
19a0: 28 24 69 29 20 22 4f 50 5f 4e 6f 74 55 73 65 64  ($i) "OP_NotUsed
19b0: 5f 24 69 22 0a 20 20 7d 0a 20 20 69 66 20 7b 24  _$i".  }.  if {$
19c0: 69 3e 24 6d 61 78 7d 20 7b 73 65 74 20 6d 61 78  i>$max} {set max
19d0: 20 24 69 7d 0a 20 20 73 65 74 20 6e 61 6d 65 20   $i}.  set name 
19e0: 24 64 65 66 28 24 69 29 0a 20 20 70 75 74 73 20  $def($i).  puts 
19f0: 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5b 66 6f 72 6d  -nonewline [form
1a00: 61 74 20 7b 23 64 65 66 69 6e 65 20 25 2d 31 36  at {#define %-16
1a10: 73 20 25 33 64 7d 20 24 6e 61 6d 65 20 24 69 5d  s %3d} $name $i]
1a20: 0a 20 20 73 65 74 20 63 6f 6d 20 7b 7d 0a 20 20  .  set com {}.  
1a30: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
1a40: 20 6a 75 6d 70 28 24 6e 61 6d 65 29 5d 20 26 26   jump($name)] &&
1a50: 20 24 6a 75 6d 70 28 24 6e 61 6d 65 29 7d 20 7b   $jump($name)} {
1a60: 0a 20 20 20 20 6c 61 70 70 65 6e 64 20 63 6f 6d  .    lappend com
1a70: 20 22 6a 75 6d 70 22 0a 20 20 7d 0a 20 20 69 66   "jump".  }.  if
1a80: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 73   {[info exists s
1a90: 61 6d 65 61 73 28 24 69 29 5d 7d 20 7b 0a 20 20  ameas($i)]} {.  
1aa0: 20 20 6c 61 70 70 65 6e 64 20 63 6f 6d 20 22 73    lappend com "s
1ab0: 61 6d 65 20 61 73 20 24 73 61 6d 65 61 73 28 24  ame as $sameas($
1ac0: 69 29 22 0a 20 20 7d 0a 20 20 69 66 20 7b 5b 69  i)".  }.  if {[i
1ad0: 6e 66 6f 20 65 78 69 73 74 73 20 73 79 6e 6f 70  nfo exists synop
1ae0: 73 69 73 28 24 6e 61 6d 65 29 5d 7d 20 7b 0a 20  sis($name)]} {. 
1af0: 20 20 20 6c 61 70 70 65 6e 64 20 63 6f 6d 20 22     lappend com "
1b00: 73 79 6e 6f 70 73 69 73 3a 20 24 73 79 6e 6f 70  synopsis: $synop
1b10: 73 69 73 28 24 6e 61 6d 65 29 22 0a 20 20 7d 0a  sis($name)".  }.
1b20: 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24    if {[llength $
1b30: 63 6f 6d 5d 7d 20 7b 0a 20 20 20 20 70 75 74 73  com]} {.    puts
1b40: 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 5b 66 6f 72   -nonewline [for
1b50: 6d 61 74 20 22 20 2f 2a 20 25 2d 34 32 73 20 2a  mat " /* %-42s *
1b60: 2f 22 20 5b 6a 6f 69 6e 20 24 63 6f 6d 20 7b 2c  /" [join $com {,
1b70: 20 7d 5d 5d 0a 20 20 7d 0a 20 20 70 75 74 73 20   }]].  }.  puts 
1b80: 22 22 0a 7d 0a 0a 69 66 20 7b 24 6d 61 78 3e 32  "".}..if {$max>2
1b90: 35 35 7d 20 7b 0a 20 20 65 72 72 6f 72 20 22 4d  55} {.  error "M
1ba0: 6f 72 65 20 74 68 61 6e 20 32 35 35 20 6f 70 63  ore than 255 opc
1bb0: 6f 64 65 73 20 2d 20 56 64 62 65 4f 70 2e 6f 70  odes - VdbeOp.op
1bc0: 63 6f 64 65 20 69 73 20 6f 66 20 74 79 70 65 20  code is of type 
1bd0: 75 38 21 22 0a 7d 0a 0a 23 20 47 65 6e 65 72 61  u8!".}..# Genera
1be0: 74 65 20 74 68 65 20 62 69 74 76 65 63 74 6f 72  te the bitvector
1bf0: 73 3a 0a 23 0a 73 65 74 20 62 76 28 30 29 20 30  s:.#.set bv(0) 0
1c00: 0a 66 6f 72 20 7b 73 65 74 20 69 20 30 7d 20 7b  .for {set i 0} {
1c10: 24 69 3c 3d 24 6d 61 78 7d 20 7b 69 6e 63 72 20  $i<=$max} {incr 
1c20: 69 7d 20 7b 0a 20 20 73 65 74 20 78 20 30 0a 20  i} {.  set x 0. 
1c30: 20 73 65 74 20 6e 61 6d 65 20 24 64 65 66 28 24   set name $def($
1c40: 69 29 0a 20 20 69 66 20 7b 5b 73 74 72 69 6e 67  i).  if {[string
1c50: 20 6d 61 74 63 68 20 4f 50 5f 4e 6f 74 55 73 65   match OP_NotUse
1c60: 64 2a 20 24 6e 61 6d 65 5d 3d 3d 30 7d 20 7b 0a  d* $name]==0} {.
1c70: 20 20 20 20 69 66 20 7b 24 6a 75 6d 70 28 24 6e      if {$jump($n
1c80: 61 6d 65 29 7d 20 20 7b 69 6e 63 72 20 78 20 31  ame)}  {incr x 1
1c90: 7d 0a 20 20 20 20 69 66 20 7b 24 69 6e 31 28 24  }.    if {$in1($
1ca0: 6e 61 6d 65 29 7d 20 20 20 7b 69 6e 63 72 20 78  name)}   {incr x
1cb0: 20 32 7d 0a 20 20 20 20 69 66 20 7b 24 69 6e 32   2}.    if {$in2
1cc0: 28 24 6e 61 6d 65 29 7d 20 20 20 7b 69 6e 63 72  ($name)}   {incr
1cd0: 20 78 20 34 7d 0a 20 20 20 20 69 66 20 7b 24 69   x 4}.    if {$i
1ce0: 6e 33 28 24 6e 61 6d 65 29 7d 20 20 20 7b 69 6e  n3($name)}   {in
1cf0: 63 72 20 78 20 38 7d 0a 20 20 20 20 69 66 20 7b  cr x 8}.    if {
1d00: 24 6f 75 74 32 28 24 6e 61 6d 65 29 7d 20 20 7b  $out2($name)}  {
1d10: 69 6e 63 72 20 78 20 31 36 7d 0a 20 20 20 20 69  incr x 16}.    i
1d20: 66 20 7b 24 6f 75 74 33 28 24 6e 61 6d 65 29 7d  f {$out3($name)}
1d30: 20 20 7b 69 6e 63 72 20 78 20 33 32 7d 0a 20 20    {incr x 32}.  
1d40: 7d 0a 20 20 73 65 74 20 62 76 28 24 69 29 20 24  }.  set bv($i) $
1d50: 78 0a 7d 0a 70 75 74 73 20 22 22 0a 70 75 74 73  x.}.puts "".puts
1d60: 20 22 2f 2a 20 50 72 6f 70 65 72 74 69 65 73 20   "/* Properties 
1d70: 73 75 63 68 20 61 73 20 5c 22 6f 75 74 32 5c 22  such as \"out2\"
1d80: 20 6f 72 20 5c 22 6a 75 6d 70 5c 22 20 74 68 61   or \"jump\" tha
1d90: 74 20 61 72 65 20 73 70 65 63 69 66 69 65 64 20  t are specified 
1da0: 69 6e 22 0a 70 75 74 73 20 22 2a 2a 20 63 6f 6d  in".puts "** com
1db0: 6d 65 6e 74 73 20 66 6f 6c 6c 6f 77 69 6e 67 20  ments following 
1dc0: 74 68 65 20 5c 22 63 61 73 65 5c 22 20 66 6f 72  the \"case\" for
1dd0: 20 65 61 63 68 20 6f 70 63 6f 64 65 20 69 6e 20   each opcode in 
1de0: 74 68 65 20 76 64 62 65 2e 63 22 0a 70 75 74 73  the vdbe.c".puts
1df0: 20 22 2a 2a 20 61 72 65 20 65 6e 63 6f 64 65 64   "** are encoded
1e00: 20 69 6e 74 6f 20 62 69 74 76 65 63 74 6f 72 73   into bitvectors
1e10: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 22 0a 70 75   as follows:".pu
1e20: 74 73 20 22 2a 2f 22 0a 70 75 74 73 20 22 23 64  ts "*/".puts "#d
1e30: 65 66 69 6e 65 20 4f 50 46 4c 47 5f 4a 55 4d 50  efine OPFLG_JUMP
1e40: 20 20 20 20 20 20 20 20 30 78 30 31 20 20 2f 2a          0x01  /*
1e50: 20 6a 75 6d 70 3a 20 20 50 32 20 68 6f 6c 64 73   jump:  P2 holds
1e60: 20 6a 6d 70 20 74 61 72 67 65 74 20 2a 2f 22 0a   jmp target */".
1e70: 70 75 74 73 20 22 23 64 65 66 69 6e 65 20 4f 50  puts "#define OP
1e80: 46 4c 47 5f 49 4e 31 20 20 20 20 20 20 20 20 20  FLG_IN1         
1e90: 30 78 30 32 20 20 2f 2a 20 69 6e 31 3a 20 20 20  0x02  /* in1:   
1ea0: 50 31 20 69 73 20 61 6e 20 69 6e 70 75 74 20 2a  P1 is an input *
1eb0: 2f 22 0a 70 75 74 73 20 22 23 64 65 66 69 6e 65  /".puts "#define
1ec0: 20 4f 50 46 4c 47 5f 49 4e 32 20 20 20 20 20 20   OPFLG_IN2      
1ed0: 20 20 20 30 78 30 34 20 20 2f 2a 20 69 6e 32 3a     0x04  /* in2:
1ee0: 20 20 20 50 32 20 69 73 20 61 6e 20 69 6e 70 75     P2 is an inpu
1ef0: 74 20 2a 2f 22 0a 70 75 74 73 20 22 23 64 65 66  t */".puts "#def
1f00: 69 6e 65 20 4f 50 46 4c 47 5f 49 4e 33 20 20 20  ine OPFLG_IN3   
1f10: 20 20 20 20 20 20 30 78 30 38 20 20 2f 2a 20 69        0x08  /* i
1f20: 6e 33 3a 20 20 20 50 33 20 69 73 20 61 6e 20 69  n3:   P3 is an i
1f30: 6e 70 75 74 20 2a 2f 22 0a 70 75 74 73 20 22 23  nput */".puts "#
1f40: 64 65 66 69 6e 65 20 4f 50 46 4c 47 5f 4f 55 54  define OPFLG_OUT
1f50: 32 20 20 20 20 20 20 20 20 30 78 31 30 20 20 2f  2        0x10  /
1f60: 2a 20 6f 75 74 32 3a 20 20 50 32 20 69 73 20 61  * out2:  P2 is a
1f70: 6e 20 6f 75 74 70 75 74 20 2a 2f 22 0a 70 75 74  n output */".put
1f80: 73 20 22 23 64 65 66 69 6e 65 20 4f 50 46 4c 47  s "#define OPFLG
1f90: 5f 4f 55 54 33 20 20 20 20 20 20 20 20 30 78 32  _OUT3        0x2
1fa0: 30 20 20 2f 2a 20 6f 75 74 33 3a 20 20 50 33 20  0  /* out3:  P3 
1fb0: 69 73 20 61 6e 20 6f 75 74 70 75 74 20 2a 2f 22  is an output */"
1fc0: 0a 70 75 74 73 20 22 23 64 65 66 69 6e 65 20 4f  .puts "#define O
1fd0: 50 46 4c 47 5f 49 4e 49 54 49 41 4c 49 5a 45 52  PFLG_INITIALIZER
1fe0: 20 5c 31 37 33 5c 5c 22 0a 66 6f 72 20 7b 73 65   \173\\".for {se
1ff0: 74 20 69 20 30 7d 20 7b 24 69 3c 3d 24 6d 61 78  t i 0} {$i<=$max
2000: 7d 20 7b 69 6e 63 72 20 69 7d 20 7b 0a 20 20 69  } {incr i} {.  i
2010: 66 20 7b 24 69 25 38 3d 3d 30 7d 20 7b 0a 20 20  f {$i%8==0} {.  
2020: 20 20 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e    puts -nonewlin
2030: 65 20 5b 66 6f 72 6d 61 74 20 22 2f 2a 20 25 33  e [format "/* %3
2040: 64 20 2a 2f 22 20 24 69 5d 0a 20 20 7d 0a 20 20  d */" $i].  }.  
2050: 70 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20  puts -nonewline 
2060: 5b 66 6f 72 6d 61 74 20 22 20 30 78 25 30 32 78  [format " 0x%02x
2070: 2c 22 20 24 62 76 28 24 69 29 5d 0a 20 20 69 66  ," $bv($i)].  if
2080: 20 7b 24 69 25 38 3d 3d 37 7d 20 7b 0a 20 20 20   {$i%8==7} {.   
2090: 20 70 75 74 73 20 22 5c 5c 22 0a 20 20 7d 0a 7d   puts "\\".  }.}
20a0: 0a 70 75 74 73 20 22 5c 31 37 35 22 0a 70 75 74  .puts "\175".put
20b0: 73 20 22 22 0a 70 75 74 73 20 22 2f 2a 20 54 68  s "".puts "/* Th
20c0: 65 20 73 71 6c 69 74 65 33 50 32 56 61 6c 75 65  e sqlite3P2Value
20d0: 73 28 29 20 72 6f 75 74 69 6e 65 20 69 73 20 61  s() routine is a
20e0: 62 6c 65 20 74 6f 20 72 75 6e 20 66 61 73 74 65  ble to run faste
20f0: 72 20 69 66 20 69 74 20 6b 6e 6f 77 73 22 0a 70  r if it knows".p
2100: 75 74 73 20 22 2a 2a 20 74 68 65 20 76 61 6c 75  uts "** the valu
2110: 65 20 6f 66 20 74 68 65 20 6c 61 72 67 65 73 74  e of the largest
2120: 20 4a 55 4d 50 20 6f 70 63 6f 64 65 2e 20 20 54   JUMP opcode.  T
2130: 68 65 20 73 6d 61 6c 6c 65 72 20 74 68 65 20 6d  he smaller the m
2140: 61 78 69 6d 75 6d 22 0a 70 75 74 73 20 22 2a 2a  aximum".puts "**
2150: 20 4a 55 4d 50 20 6f 70 63 6f 64 65 20 74 68 65   JUMP opcode the
2160: 20 62 65 74 74 65 72 2c 20 73 6f 20 74 68 65 20   better, so the 
2170: 6d 6b 6f 70 63 6f 64 65 68 2e 74 63 6c 20 73 63  mkopcodeh.tcl sc
2180: 72 69 70 74 20 74 68 61 74 22 0a 70 75 74 73 20  ript that".puts 
2190: 22 2a 2a 20 67 65 6e 65 72 61 74 65 64 20 74 68  "** generated th
21a0: 69 73 20 69 6e 63 6c 75 64 65 20 66 69 6c 65 20  is include file 
21b0: 73 74 72 69 76 65 73 20 74 6f 20 67 72 6f 75 70  strives to group
21c0: 20 61 6c 6c 20 4a 55 4d 50 20 6f 70 63 6f 64 65   all JUMP opcode
21d0: 73 22 0a 70 75 74 73 20 22 2a 2a 20 74 6f 67 65  s".puts "** toge
21e0: 74 68 65 72 20 6e 65 61 72 20 74 68 65 20 62 65  ther near the be
21f0: 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 6c  ginning of the l
2200: 69 73 74 2e 22 0a 70 75 74 73 20 22 2a 2f 22 0a  ist.".puts "*/".
2210: 70 75 74 73 20 22 23 64 65 66 69 6e 65 20 53 51  puts "#define SQ
2220: 4c 49 54 45 5f 4d 58 5f 4a 55 4d 50 5f 4f 50 43  LITE_MX_JUMP_OPC
2230: 4f 44 45 20 20 24 6d 78 4a 75 6d 70 20 20 2f 2a  ODE  $mxJump  /*
2240: 20 4d 61 78 69 6d 75 6d 20 4a 55 4d 50 20 6f 70   Maximum JUMP op
2250: 63 6f 64 65 20 2a 2f 22 0a                       code */".