/ Hex Artifact Content
Login

Artifact 799a299eaf3173c0f8ac0bd7c4b49c0f4d4590ca:


0000: 23 21 2f 75 73 72 2f 62 69 6e 2f 61 77 6b 20 2d  #!/usr/bin/awk -
0010: 66 0a 23 0a 23 20 47 65 6e 65 72 61 74 65 20 74  f.#.# Generate t
0020: 68 65 20 66 69 6c 65 20 6f 70 63 6f 64 65 73 2e  he file opcodes.
0030: 68 2e 0a 23 0a 23 20 54 68 69 73 20 41 57 4b 20  h..#.# This AWK 
0040: 73 63 72 69 70 74 20 73 63 61 6e 73 20 61 20 63  script scans a c
0050: 6f 6e 63 61 74 65 6e 61 74 69 6f 6e 20 6f 66 20  oncatenation of 
0060: 74 68 65 20 70 61 72 73 65 2e 68 20 6f 75 74 70  the parse.h outp
0070: 75 74 20 66 69 6c 65 20 66 72 6f 6d 20 74 68 65  ut file from the
0080: 0a 23 20 70 61 72 73 65 72 20 61 6e 64 20 74 68  .# parser and th
0090: 65 20 76 64 62 65 2e 63 20 73 6f 75 72 63 65 20  e vdbe.c source 
00a0: 66 69 6c 65 20 69 6e 20 6f 72 64 65 72 20 74 6f  file in order to
00b0: 20 67 65 6e 65 72 61 74 65 20 74 68 65 20 6f 70   generate the op
00c0: 63 6f 64 65 73 20 6e 75 6d 62 65 72 73 0a 23 20  codes numbers.# 
00d0: 66 6f 72 20 61 6c 6c 20 6f 70 63 6f 64 65 73 2e  for all opcodes.
00e0: 20 20 0a 23 0a 23 20 54 68 65 20 6c 69 6e 65 73    .#.# The lines
00f0: 20 6f 66 20 74 68 65 20 76 64 62 65 2e 63 20 74   of the vdbe.c t
0100: 68 61 74 20 77 65 20 61 72 65 20 69 6e 74 65 72  hat we are inter
0110: 65 73 74 65 64 20 69 6e 20 61 72 65 20 6f 66 20  ested in are of 
0120: 74 68 65 20 66 6f 72 6d 3a 0a 23 0a 23 20 20 20  the form:.#.#   
0130: 20 20 20 20 63 61 73 65 20 4f 50 5f 61 61 61 61      case OP_aaaa
0140: 3a 20 20 20 20 20 20 2f 2a 20 73 61 6d 65 20 61  :      /* same a
0150: 73 20 54 4b 5f 62 62 62 62 62 20 2a 2f 0a 23 0a  s TK_bbbbb */.#.
0160: 23 20 54 68 65 20 54 4b 5f 20 63 6f 6d 6d 65 6e  # The TK_ commen
0170: 74 20 69 73 20 6f 70 74 69 6f 6e 61 6c 2e 20 20  t is optional.  
0180: 49 66 20 69 74 20 69 73 20 70 72 65 73 65 6e 74  If it is present
0190: 2c 20 74 68 65 6e 20 74 68 65 20 76 61 6c 75 65  , then the value
01a0: 20 61 73 73 69 67 6e 65 64 20 74 6f 0a 23 20 74   assigned to.# t
01b0: 68 65 20 4f 50 5f 20 69 73 20 74 68 65 20 73 61  he OP_ is the sa
01c0: 6d 65 20 61 73 20 74 68 65 20 54 4b 5f 20 76 61  me as the TK_ va
01d0: 6c 75 65 2e 20 20 49 66 20 6d 69 73 73 69 6e 67  lue.  If missing
01e0: 2c 20 74 68 65 20 4f 50 5f 20 76 61 6c 75 65 20  , the OP_ value 
01f0: 69 73 20 61 73 73 69 67 6e 65 64 0a 23 20 61 20  is assigned.# a 
0200: 73 6d 61 6c 6c 20 69 6e 74 65 67 65 72 20 74 68  small integer th
0210: 61 74 20 69 73 20 64 69 66 66 65 72 65 6e 74 20  at is different 
0220: 66 72 6f 6d 20 65 76 65 72 79 20 6f 74 68 65 72  from every other
0230: 20 4f 50 5f 20 76 61 6c 75 65 2e 0a 23 0a 23 20   OP_ value..#.# 
0240: 57 65 20 67 6f 20 74 6f 20 74 68 65 20 74 72 6f  We go to the tro
0250: 75 62 6c 65 20 6f 66 20 6d 61 6b 69 6e 67 20 73  uble of making s
0260: 6f 6d 65 20 4f 50 5f 20 76 61 6c 75 65 73 20 74  ome OP_ values t
0270: 68 65 20 73 61 6d 65 20 61 73 20 54 4b 5f 20 76  he same as TK_ v
0280: 61 6c 75 65 73 0a 23 20 61 73 20 61 6e 20 6f 70  alues.# as an op
0290: 74 69 6d 69 7a 61 74 69 6f 6e 2e 20 20 44 75 72  timization.  Dur
02a0: 69 6e 67 20 70 61 72 73 69 6e 67 2c 20 74 68 69  ing parsing, thi
02b0: 6e 67 73 20 6c 69 6b 65 20 65 78 70 72 65 73 73  ngs like express
02c0: 69 6f 6e 20 6f 70 65 72 61 74 6f 72 73 0a 23 20  ion operators.# 
02d0: 61 72 65 20 63 6f 64 65 64 20 77 69 74 68 20 54  are coded with T
02e0: 4b 5f 20 76 61 6c 75 65 73 20 73 75 63 68 20 61  K_ values such a
02f0: 73 20 54 4b 5f 41 44 44 2c 20 54 4b 5f 44 49 56  s TK_ADD, TK_DIV
0300: 49 44 45 2c 20 61 6e 64 20 73 6f 20 66 6f 72 74  IDE, and so fort
0310: 68 2e 20 20 4c 61 74 65 72 0a 23 20 64 75 72 69  h.  Later.# duri
0320: 6e 67 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  ng code generati
0330: 6f 6e 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 67  on, we need to g
0340: 65 6e 65 72 61 74 65 20 63 6f 72 72 65 73 70 6f  enerate correspo
0350: 6e 64 69 6e 67 20 6f 70 63 6f 64 65 73 20 6c 69  nding opcodes li
0360: 6b 65 0a 23 20 4f 50 5f 41 64 64 20 61 6e 64 20  ke.# OP_Add and 
0370: 4f 50 5f 44 69 76 69 64 65 2e 20 20 42 79 20 6d  OP_Divide.  By m
0380: 61 6b 69 6e 67 20 54 4b 5f 41 44 44 3d 3d 4f 50  aking TK_ADD==OP
0390: 5f 41 64 64 20 61 6e 64 20 54 4b 5f 44 49 56 49  _Add and TK_DIVI
03a0: 44 45 3d 3d 4f 50 5f 44 69 76 69 64 65 2c 0a 23  DE==OP_Divide,.#
03b0: 20 63 6f 64 65 20 74 6f 20 74 72 61 6e 73 6c 61   code to transla
03c0: 74 65 20 66 72 6f 6d 20 6f 6e 65 20 74 6f 20 74  te from one to t
03d0: 68 65 20 6f 74 68 65 72 20 69 73 20 61 76 6f 69  he other is avoi
03e0: 64 65 64 2e 20 20 54 68 69 73 20 6d 61 6b 65 73  ded.  This makes
03f0: 20 74 68 65 0a 23 20 63 6f 64 65 20 67 65 6e 65   the.# code gene
0400: 72 61 74 6f 72 20 72 75 6e 20 28 69 6e 66 69 6e  rator run (infin
0410: 69 74 65 73 69 6d 61 6c 6c 79 29 20 66 61 73 74  itesimally) fast
0420: 65 72 20 61 6e 64 20 6d 6f 72 65 20 69 6d 70 6f  er and more impo
0430: 72 74 61 6e 74 6c 79 20 69 74 20 6d 61 6b 65 73  rtantly it makes
0440: 0a 23 20 74 68 65 20 6c 69 62 72 61 72 79 20 66  .# the library f
0450: 6f 6f 74 70 72 69 6e 74 20 73 6d 61 6c 6c 65 72  ootprint smaller
0460: 2e 0a 23 0a 23 20 54 68 69 73 20 73 63 72 69 70  ..#.# This scrip
0470: 74 20 61 6c 73 6f 20 73 63 61 6e 73 20 66 6f 72  t also scans for
0480: 20 6c 69 6e 65 73 20 6f 66 20 74 68 65 20 66 6f   lines of the fo
0490: 72 6d 3a 0a 23 0a 23 20 20 20 20 20 20 20 63 61  rm:.#.#       ca
04a0: 73 65 20 4f 50 5f 61 61 61 61 3a 20 20 20 20 20  se OP_aaaa:     
04b0: 20 20 2f 2a 20 6e 6f 2d 70 75 73 68 20 2a 2f 0a    /* no-push */.
04c0: 23 0a 23 20 57 68 65 6e 20 74 68 65 20 6e 6f 2d  #.# When the no-
04d0: 70 75 73 68 20 63 6f 6d 6d 65 6e 74 20 69 73 20  push comment is 
04e0: 66 6f 75 6e 64 20 6f 6e 20 61 6e 20 6f 70 63 6f  found on an opco
04f0: 64 65 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61  de, it means tha
0500: 74 20 74 68 61 74 0a 23 20 6f 70 63 6f 64 65 20  t that.# opcode 
0510: 64 6f 65 73 20 6e 6f 74 20 6c 65 61 76 65 20 61  does not leave a
0520: 20 72 65 73 75 6c 74 20 6f 6e 20 74 68 65 20 73   result on the s
0530: 74 61 63 6b 2e 20 20 42 79 20 69 64 65 6e 74 69  tack.  By identi
0540: 66 79 69 6e 67 20 77 68 69 63 68 0a 23 20 6f 70  fying which.# op
0550: 63 6f 64 65 73 20 6c 65 61 76 65 20 72 65 73 75  codes leave resu
0560: 6c 74 73 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  lts on the stack
0570: 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
0580: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 61 0a 23  to determine a.#
0590: 20 6d 75 63 68 20 73 6d 61 6c 6c 65 72 20 75 70   much smaller up
05a0: 70 65 72 20 62 6f 75 6e 64 20 6f 6e 20 74 68 65  per bound on the
05b0: 20 73 69 7a 65 20 6f 66 20 74 68 65 20 73 74 61   size of the sta
05c0: 63 6b 2e 20 20 54 68 69 73 20 61 6c 6c 6f 77 73  ck.  This allows
05d0: 0a 23 20 61 20 73 6d 61 6c 6c 65 72 20 73 74 61  .# a smaller sta
05e0: 63 6b 20 74 6f 20 62 65 20 61 6c 6c 6f 63 61 74  ck to be allocat
05f0: 65 64 2c 20 77 68 69 63 68 20 69 73 20 69 6d 70  ed, which is imp
0600: 6f 72 74 61 6e 74 20 74 6f 20 65 6d 62 65 64 64  ortant to embedd
0610: 65 64 0a 23 20 73 79 73 74 65 6d 73 20 77 69 74  ed.# systems wit
0620: 68 20 6c 69 6d 69 74 65 64 20 6d 65 6d 6f 72 79  h limited memory
0630: 20 73 70 61 63 65 2e 20 20 54 68 69 73 20 73 63   space.  This sc
0640: 72 69 70 74 20 67 65 6e 65 72 61 74 65 73 20 61  ript generates a
0650: 20 73 65 72 69 65 73 0a 23 20 6f 66 20 22 4e 4f   series.# of "NO
0660: 50 55 53 48 5f 4d 41 53 4b 22 20 64 65 66 69 6e  PUSH_MASK" defin
0670: 65 73 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 20  es that contain 
0680: 62 69 74 6d 61 70 73 20 6f 66 20 6f 70 63 6f 64  bitmaps of opcod
0690: 65 73 20 74 68 61 74 20 6c 65 61 76 65 0a 23 20  es that leave.# 
06a0: 72 65 73 75 6c 74 73 20 6f 6e 20 74 68 65 20 73  results on the s
06b0: 74 61 63 6b 2e 20 20 54 68 65 20 4e 4f 50 55 53  tack.  The NOPUS
06c0: 48 5f 4d 41 53 4b 20 64 65 66 69 6e 65 73 20 61  H_MASK defines a
06d0: 72 65 20 75 73 65 64 20 69 6e 20 76 64 62 65 61  re used in vdbea
06e0: 75 78 2e 63 0a 23 20 74 6f 20 68 65 6c 70 20 64  ux.c.# to help d
06f0: 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 61 78  etermine the max
0700: 69 6d 75 6d 20 73 74 61 63 6b 20 73 69 7a 65 2e  imum stack size.
0710: 0a 23 0a 0a 0a 23 20 52 65 6d 65 6d 62 65 72 20  .#...# Remember 
0720: 74 68 65 20 54 4b 5f 20 76 61 6c 75 65 73 20 66  the TK_ values f
0730: 72 6f 6d 20 74 68 65 20 70 61 72 73 65 2e 68 20  rom the parse.h 
0740: 66 69 6c 65 0a 2f 5e 23 64 65 66 69 6e 65 20 54  file./^#define T
0750: 4b 5f 2f 20 7b 0a 20 20 74 6b 5b 24 32 5d 20 3d  K_/ {.  tk[$2] =
0760: 20 30 2b 24 33 0a 7d 0a 0a 23 20 53 63 61 6e 20   0+$3.}..# Scan 
0770: 66 6f 72 20 22 63 61 73 65 20 4f 50 5f 61 61 61  for "case OP_aaa
0780: 61 3a 22 20 6c 69 6e 65 73 20 69 6e 20 74 68 65  a:" lines in the
0790: 20 76 64 62 65 2e 63 20 66 69 6c 65 0a 2f 5e 63   vdbe.c file./^c
07a0: 61 73 65 20 4f 50 5f 2f 20 7b 0a 20 20 6e 61 6d  ase OP_/ {.  nam
07b0: 65 20 3d 20 24 32 0a 20 20 73 75 62 28 2f 3a 2f  e = $2.  sub(/:/
07c0: 2c 22 22 2c 6e 61 6d 65 29 0a 20 20 73 75 62 28  ,"",name).  sub(
07d0: 22 5c 72 22 2c 22 22 2c 6e 61 6d 65 29 0a 20 20  "\r","",name).  
07e0: 6f 70 5b 6e 61 6d 65 5d 20 3d 20 2d 31 0a 20 20  op[name] = -1.  
07f0: 66 6f 72 28 69 3d 33 3b 20 69 3c 4e 46 3b 20 69  for(i=3; i<NF; i
0800: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 24 69 3d 3d  ++){.    if($i==
0810: 22 73 61 6d 65 22 20 26 26 20 24 28 69 2b 31 29  "same" && $(i+1)
0820: 3d 3d 22 61 73 22 29 7b 0a 20 20 20 20 20 20 73  =="as"){.      s
0830: 79 6d 20 3d 20 24 28 69 2b 32 29 0a 20 20 20 20  ym = $(i+2).    
0840: 20 20 73 75 62 28 2f 2c 2f 2c 22 22 2c 73 79 6d    sub(/,/,"",sym
0850: 29 0a 20 20 20 20 20 20 6f 70 5b 6e 61 6d 65 5d  ).      op[name]
0860: 20 3d 20 74 6b 5b 73 79 6d 5d 0a 20 20 20 20 20   = tk[sym].     
0870: 20 75 73 65 64 5b 6f 70 5b 6e 61 6d 65 5d 5d 20   used[op[name]] 
0880: 3d 20 31 0a 20 20 20 20 20 20 73 61 6d 65 61 73  = 1.      sameas
0890: 5b 6f 70 5b 6e 61 6d 65 5d 5d 20 3d 20 73 79 6d  [op[name]] = sym
08a0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 24 69  .    }.    if($i
08b0: 3d 3d 22 6e 6f 2d 70 75 73 68 22 29 7b 0a 20 20  =="no-push"){.  
08c0: 20 20 20 20 6e 6f 70 75 73 68 5b 6e 61 6d 65 5d      nopush[name]
08d0: 20 3d 20 31 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d   = 1.    }.  }.}
08e0: 0a 0a 23 20 41 73 73 69 67 6e 20 6e 75 6d 62 65  ..# Assign numbe
08f0: 72 73 20 74 6f 20 61 6c 6c 20 6f 70 63 6f 64 65  rs to all opcode
0900: 73 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 65  s and output the
0910: 20 72 65 73 75 6c 74 2e 0a 45 4e 44 20 7b 0a 20   result..END {. 
0920: 20 63 6e 74 20 3d 20 30 0a 20 20 6d 61 78 20 3d   cnt = 0.  max =
0930: 20 30 0a 20 20 70 72 69 6e 74 20 22 2f 2a 20 41   0.  print "/* A
0940: 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 67 65 6e  utomatically gen
0950: 65 72 61 74 65 64 2e 20 20 44 6f 20 6e 6f 74 20  erated.  Do not 
0960: 65 64 69 74 20 2a 2f 22 0a 20 20 70 72 69 6e 74  edit */".  print
0970: 20 22 2f 2a 20 53 65 65 20 74 68 65 20 6d 6b 6f   "/* See the mko
0980: 70 63 6f 64 65 68 2e 61 77 6b 20 73 63 72 69 70  pcodeh.awk scrip
0990: 74 20 66 6f 72 20 64 65 74 61 69 6c 73 20 2a 2f  t for details */
09a0: 22 0a 20 20 66 6f 72 28 6e 61 6d 65 20 69 6e 20  ".  for(name in 
09b0: 6f 70 29 7b 0a 20 20 20 20 69 66 28 20 6f 70 5b  op){.    if( op[
09c0: 6e 61 6d 65 5d 3c 30 20 29 7b 0a 20 20 20 20 20  name]<0 ){.     
09d0: 20 63 6e 74 2b 2b 0a 20 20 20 20 20 20 77 68 69   cnt++.      whi
09e0: 6c 65 28 20 75 73 65 64 5b 63 6e 74 5d 20 29 20  le( used[cnt] ) 
09f0: 63 6e 74 2b 2b 0a 20 20 20 20 20 20 6f 70 5b 6e  cnt++.      op[n
0a00: 61 6d 65 5d 20 3d 20 63 6e 74 0a 20 20 20 20 7d  ame] = cnt.    }
0a10: 0a 20 20 20 20 75 73 65 64 5b 6f 70 5b 6e 61 6d  .    used[op[nam
0a20: 65 5d 5d 20 3d 20 31 3b 0a 20 20 20 20 69 66 28  e]] = 1;.    if(
0a30: 20 6f 70 5b 6e 61 6d 65 5d 3e 6d 61 78 20 29 20   op[name]>max ) 
0a40: 6d 61 78 20 3d 20 6f 70 5b 6e 61 6d 65 5d 0a 20  max = op[name]. 
0a50: 20 20 20 70 72 69 6e 74 66 20 22 23 64 65 66 69     printf "#defi
0a60: 6e 65 20 25 2d 32 35 73 20 25 31 35 64 22 2c 20  ne %-25s %15d", 
0a70: 6e 61 6d 65 2c 20 6f 70 5b 6e 61 6d 65 5d 0a 20  name, op[name]. 
0a80: 20 20 20 69 66 28 20 73 61 6d 65 61 73 5b 6f 70     if( sameas[op
0a90: 5b 6e 61 6d 65 5d 5d 20 29 20 7b 0a 20 20 20 20  [name]] ) {.    
0aa0: 20 20 70 72 69 6e 74 66 20 22 20 20 20 2f 2a 20    printf "   /* 
0ab0: 73 61 6d 65 20 61 73 20 25 2d 31 32 73 2a 2f 22  same as %-12s*/"
0ac0: 2c 20 73 61 6d 65 61 73 5b 6f 70 5b 6e 61 6d 65  , sameas[op[name
0ad0: 5d 5d 0a 20 20 20 20 7d 20 0a 20 20 20 20 70 72  ]].    } .    pr
0ae0: 69 6e 74 66 20 22 5c 6e 22 0a 0a 20 20 7d 0a 20  intf "\n"..  }. 
0af0: 20 73 65 65 6e 55 6e 75 73 65 64 20 3d 20 30 3b   seenUnused = 0;
0b00: 0a 20 20 66 6f 72 28 69 3d 31 3b 20 69 3c 6d 61  .  for(i=1; i<ma
0b10: 78 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28  x; i++){.    if(
0b20: 20 21 75 73 65 64 5b 69 5d 20 29 7b 0a 20 20 20   !used[i] ){.   
0b30: 20 20 20 69 66 28 20 21 73 65 65 6e 55 6e 75 73     if( !seenUnus
0b40: 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 70 72  ed ){.        pr
0b50: 69 6e 74 66 20 22 5c 6e 2f 2a 20 54 68 65 20 66  intf "\n/* The f
0b60: 6f 6c 6c 6f 77 69 6e 67 20 6f 70 63 6f 64 65 20  ollowing opcode 
0b70: 76 61 6c 75 65 73 20 61 72 65 20 6e 65 76 65 72  values are never
0b80: 20 75 73 65 64 20 2a 2f 5c 6e 22 0a 20 20 20 20   used */\n".    
0b90: 20 20 20 20 73 65 65 6e 55 6e 75 73 65 64 20 3d      seenUnused =
0ba0: 20 31 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   1.      }.     
0bb0: 20 70 72 69 6e 74 66 20 22 23 64 65 66 69 6e 65   printf "#define
0bc0: 20 25 2d 32 35 73 20 25 31 35 64 5c 6e 22 2c 20   %-25s %15d\n", 
0bd0: 73 70 72 69 6e 74 66 28 20 22 4f 50 5f 4e 6f 74  sprintf( "OP_Not
0be0: 55 73 65 64 5f 25 2d 33 64 22 2c 20 69 20 29 2c  Used_%-3d", i ),
0bf0: 20 69 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   i.    }.  }..  
0c00: 23 20 47 65 6e 65 72 61 74 65 20 74 68 65 20 31  # Generate the 1
0c10: 30 20 31 36 2d 62 69 74 20 62 69 74 6d 61 73 6b  0 16-bit bitmask
0c20: 73 20 75 73 65 64 20 62 79 20 66 75 6e 63 74 69  s used by functi
0c30: 6f 6e 20 6f 70 63 6f 64 65 55 73 65 73 53 74 61  on opcodeUsesSta
0c40: 63 6b 28 29 0a 20 20 23 20 69 6e 20 76 64 62 65  ck().  # in vdbe
0c50: 61 75 78 2e 63 2e 20 53 65 65 20 63 6f 6d 6d 65  aux.c. See comme
0c60: 6e 74 73 20 69 6e 20 74 68 61 74 20 66 75 6e 63  nts in that func
0c70: 74 69 6f 6e 20 66 6f 72 20 64 65 74 61 69 6c 73  tion for details
0c80: 2e 0a 20 20 23 20 0a 20 20 6e 6f 70 75 73 68 5b  ..  # .  nopush[
0c90: 30 5d 20 3d 20 30 20 20 20 20 20 20 20 20 20 20  0] = 0          
0ca0: 20 20 20 20 23 20 30 2e 2e 31 35 0a 20 20 6e 6f      # 0..15.  no
0cb0: 70 75 73 68 5b 31 5d 20 3d 20 30 20 20 20 20 20  push[1] = 0     
0cc0: 20 20 20 20 20 20 20 20 20 23 20 31 36 2e 2e 33           # 16..3
0cd0: 31 0a 20 20 6e 6f 70 75 73 68 5b 32 5d 20 3d 20  1.  nopush[2] = 
0ce0: 30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23  0              #
0cf0: 20 33 32 2e 2e 34 37 0a 20 20 6e 6f 70 75 73 68   32..47.  nopush
0d00: 5b 33 5d 20 3d 20 30 20 20 20 20 20 20 20 20 20  [3] = 0         
0d10: 20 20 20 20 20 23 20 34 38 2e 2e 36 33 0a 20 20       # 48..63.  
0d20: 6e 6f 70 75 73 68 5b 34 5d 20 3d 20 30 20 20 20  nopush[4] = 0   
0d30: 20 20 20 20 20 20 20 20 20 20 20 23 20 36 34 2e             # 64.
0d40: 2e 37 39 0a 20 20 6e 6f 70 75 73 68 5b 35 5d 20  .79.  nopush[5] 
0d50: 3d 20 30 20 20 20 20 20 20 20 20 20 20 20 20 20  = 0             
0d60: 20 23 20 38 30 2e 2e 39 35 0a 20 20 6e 6f 70 75   # 80..95.  nopu
0d70: 73 68 5b 36 5d 20 3d 20 30 20 20 20 20 20 20 20  sh[6] = 0       
0d80: 20 20 20 20 20 20 20 23 20 39 36 2e 2e 31 31 31         # 96..111
0d90: 0a 20 20 6e 6f 70 75 73 68 5b 37 5d 20 3d 20 30  .  nopush[7] = 0
0da0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
0db0: 31 31 32 2e 2e 31 32 37 0a 20 20 6e 6f 70 75 73  112..127.  nopus
0dc0: 68 5b 38 5d 20 3d 20 30 20 20 20 20 20 20 20 20  h[8] = 0        
0dd0: 20 20 20 20 20 20 23 20 31 32 38 2e 2e 31 34 33        # 128..143
0de0: 0a 20 20 6e 6f 70 75 73 68 5b 39 5d 20 3d 20 30  .  nopush[9] = 0
0df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 23 20                # 
0e00: 31 34 34 2e 2e 31 35 39 0a 20 20 66 6f 72 28 6e  144..159.  for(n
0e10: 61 6d 65 20 69 6e 20 6f 70 29 7b 0a 20 20 20 20  ame in op){.    
0e20: 69 66 28 20 6e 6f 70 75 73 68 5b 6e 61 6d 65 5d  if( nopush[name]
0e30: 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 6f 70   ){.      n = op
0e40: 5b 6e 61 6d 65 5d 0a 20 20 20 20 20 20 6a 20 3d  [name].      j =
0e50: 20 6e 25 31 36 0a 20 20 20 20 20 20 69 20 3d 20   n%16.      i = 
0e60: 28 28 6e 20 2d 20 6a 29 2f 31 36 29 0a 20 20 20  ((n - j)/16).   
0e70: 20 20 20 6e 6f 70 75 73 68 5b 69 5d 20 3d 20 6e     nopush[i] = n
0e80: 6f 70 75 73 68 5b 69 5d 20 2b 20 28 32 5e 6a 29  opush[i] + (2^j)
0e90: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 70 72 69  .    }.  }.  pri
0ea0: 6e 74 66 20 22 5c 6e 22 0a 20 20 70 72 69 6e 74  ntf "\n".  print
0eb0: 20 22 2f 2a 20 4f 70 63 6f 64 65 73 20 74 68 61   "/* Opcodes tha
0ec0: 74 20 61 72 65 20 67 75 61 72 61 6e 74 65 65 64  t are guaranteed
0ed0: 20 74 6f 20 6e 65 76 65 72 20 70 75 73 68 20 61   to never push a
0ee0: 20 76 61 6c 75 65 20 6f 6e 74 6f 20 74 68 65 20   value onto the 
0ef0: 73 74 61 63 6b 22 0a 20 20 70 72 69 6e 74 20 22  stack".  print "
0f00: 2a 2a 20 63 6f 6e 74 61 69 6e 20 61 20 31 20 74  ** contain a 1 t
0f10: 68 65 69 72 20 63 6f 72 72 65 73 70 6f 6e 64 69  heir correspondi
0f20: 6e 67 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74  ng position of t
0f30: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d 61 73  he following mas
0f40: 6b 22 0a 20 20 70 72 69 6e 74 20 22 2a 2a 20 73  k".  print "** s
0f50: 65 74 2e 20 20 53 65 65 20 74 68 65 20 6f 70 63  et.  See the opc
0f60: 6f 64 65 4e 6f 50 75 73 68 28 29 20 66 75 6e 63  odeNoPush() func
0f70: 74 69 6f 6e 20 69 6e 20 76 64 62 65 61 75 78 2e  tion in vdbeaux.
0f80: 63 20 20 2a 2f 22 0a 20 20 66 6f 72 28 69 3d 30  c  */".  for(i=0
0f90: 3b 20 69 3c 31 30 3b 20 69 2b 2b 29 7b 0a 20 20  ; i<10; i++){.  
0fa0: 20 20 70 72 69 6e 74 66 20 22 23 64 65 66 69 6e    printf "#defin
0fb0: 65 20 4e 4f 50 55 53 48 5f 4d 41 53 4b 5f 25 64  e NOPUSH_MASK_%d
0fc0: 20 30 78 25 30 34 78 5c 6e 22 2c 20 69 2c 20 6e   0x%04x\n", i, n
0fd0: 6f 70 75 73 68 5b 69 5d 0a 20 20 7d 0a 7d 0a     opush[i].  }.}.