Hex Artifact Content
Not logged in

Artifact ee5de13f8bb52b943d8c2949742caf416ea08080:


0000: 2f 2a 20 0a 20 2a 20 4a 61 76 61 44 65 66 69 6e  /* . * JavaDefin
0010: 65 43 6c 61 73 73 43 6d 64 2e 6a 61 76 61 20 2d  eClassCmd.java -
0020: 2d 0a 20 2a 0a 20 2a 09 20 54 68 69 73 20 63 6c  -. *. *. This cl
0030: 61 73 73 20 69 6d 70 6c 65 6d 65 6e 74 73 20 74  ass implements t
0040: 68 65 20 62 75 69 6c 74 2d 69 6e 20 22 6a 61 76  he built-in "jav
0050: 61 3a 3a 64 65 66 69 6e 65 63 6c 61 73 73 22 20  a::defineclass" 
0060: 63 6f 6d 6d 61 6e 64 2e 0a 20 2a 0a 20 2a 20 43  command.. *. * C
0070: 6f 70 79 72 69 67 68 74 20 28 63 29 20 31 39 39  opyright (c) 199
0080: 37 20 62 79 20 53 75 6e 20 4d 69 63 72 6f 73 79  7 by Sun Microsy
0090: 73 74 65 6d 73 2c 20 49 6e 63 2e 0a 20 2a 0a 20  stems, Inc.. *. 
00a0: 2a 20 53 65 65 20 74 68 65 20 66 69 6c 65 20 22  * See the file "
00b0: 6c 69 63 65 6e 73 65 2e 74 65 72 6d 73 22 20 66  license.terms" f
00c0: 6f 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f  or information o
00d0: 6e 20 75 73 61 67 65 20 61 6e 64 20 72 65 64 69  n usage and redi
00e0: 73 74 72 69 62 75 74 69 6f 6e 0a 20 2a 20 6f 66  stribution. * of
00f0: 20 74 68 69 73 20 66 69 6c 65 2c 20 61 6e 64 20   this file, and 
0100: 66 6f 72 20 61 20 44 49 53 43 4c 41 49 4d 45 52  for a DISCLAIMER
0110: 20 4f 46 20 41 4c 4c 20 57 41 52 52 41 4e 54 49   OF ALL WARRANTI
0120: 45 53 2e 0a 20 2a 0a 20 2a 20 52 43 53 3a 20 40  ES.. *. * RCS: @
0130: 28 23 29 20 24 49 64 3a 20 4a 61 76 61 44 65 66  (#) $Id: JavaDef
0140: 69 6e 65 43 6c 61 73 73 43 6d 64 2e 6a 61 76 61  ineClassCmd.java
0150: 2c 76 20 31 2e 35 20 32 30 30 36 2f 30 32 2f 30  ,v 1.5 2006/02/0
0160: 38 20 32 33 3a 35 33 3a 34 37 20 6d 64 65 6a 6f  8 23:53:47 mdejo
0170: 6e 67 20 45 78 70 20 24 0a 20 2a 2f 0a 0a 70 61  ng Exp $. */..pa
0180: 63 6b 61 67 65 20 74 63 6c 2e 6c 61 6e 67 3b 0a  ckage tcl.lang;.
0190: 0a 63 6c 61 73 73 20 4a 61 76 61 44 65 66 69 6e  .class JavaDefin
01a0: 65 43 6c 61 73 73 43 6d 64 20 69 6d 70 6c 65 6d  eClassCmd implem
01b0: 65 6e 74 73 20 43 6f 6d 6d 61 6e 64 20 7b 0a 0c  ents Command {..
01c0: 0a 2f 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ./*. *----------
01d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
01e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
01f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 0a  ------------. *.
0210: 20 2a 20 63 6d 64 50 72 6f 63 20 2d 2d 0a 20 2a   * cmdProc --. *
0220: 0a 20 2a 09 54 68 69 73 20 70 72 6f 63 65 64 75  . *.This procedu
0230: 72 65 20 69 73 20 69 6e 76 6f 6b 65 64 20 74 6f  re is invoked to
0240: 20 70 72 6f 63 65 73 73 20 74 68 65 20 22 6a 61   process the "ja
0250: 76 61 3a 3a 64 65 66 69 6e 65 63 6c 61 73 73 22  va::defineclass"
0260: 20 0a 20 2a 09 54 63 6c 20 63 6f 6d 61 6d 6e 64   . *.Tcl comamnd
0270: 2e 20 20 53 65 65 20 74 68 65 20 75 73 65 72 20  .  See the user 
0280: 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f  documentation fo
0290: 72 20 64 65 74 61 69 6c 73 20 6f 6e 20 77 68 61  r details on wha
02a0: 74 0a 20 2a 09 69 74 20 64 6f 65 73 2e 0a 20 2a  t. *.it does.. *
02b0: 0a 20 2a 20 52 65 73 75 6c 74 73 3a 0a 20 2a 09  . * Results:. *.
02c0: 4e 6f 6e 65 2e 0a 20 2a 0a 20 2a 20 53 69 64 65  None.. *. * Side
02d0: 20 65 66 66 65 63 74 73 3a 0a 20 2a 09 41 20 73   effects:. *.A s
02e0: 74 61 6e 64 61 72 64 20 54 63 6c 20 72 65 73 75  tandard Tcl resu
02f0: 6c 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20  lt is stored in 
0300: 74 68 65 20 69 6e 74 65 72 70 72 65 74 65 72 2e  the interpreter.
0310: 0a 20 2a 0a 20 2a 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  . *. *----------
0320: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0330: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0340: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0350: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 2a 2f  ------------. */
0360: 0a 0a 70 75 62 6c 69 63 20 76 6f 69 64 0a 63 6d  ..public void.cm
0370: 64 50 72 6f 63 28 0a 20 20 20 20 49 6e 74 65 72  dProc(.    Inter
0380: 70 20 69 6e 74 65 72 70 2c 09 09 09 2f 2f 20 43  p interp,...// C
0390: 75 72 72 65 6e 74 20 69 6e 74 65 72 70 72 65 74  urrent interpret
03a0: 65 72 2e 0a 20 20 20 20 54 63 6c 4f 62 6a 65 63  er..    TclObjec
03b0: 74 20 61 72 67 76 5b 5d 29 09 09 09 2f 2f 20 41  t argv[])...// A
03c0: 72 67 75 6d 65 6e 74 20 6c 69 73 74 2e 0a 74 68  rgument list..th
03d0: 72 6f 77 73 0a 20 20 20 20 54 63 6c 45 78 63 65  rows.    TclExce
03e0: 70 74 69 6f 6e 09 09 09 2f 2f 20 41 20 73 74 61  ption...// A sta
03f0: 6e 64 61 72 64 20 54 63 6c 20 65 78 63 65 70 74  ndard Tcl except
0400: 69 6f 6e 2e 0a 7b 0a 20 20 20 20 62 79 74 65 5b  ion..{.    byte[
0410: 5d 20 63 6c 61 73 73 44 61 74 61 20 3d 20 6e 75  ] classData = nu
0420: 6c 6c 3b 0a 20 20 20 20 43 6c 61 73 73 20 20 72  ll;.    Class  r
0430: 65 73 75 6c 74 3b 0a 0a 20 20 20 20 69 66 20 28  esult;..    if (
0440: 61 72 67 76 2e 6c 65 6e 67 74 68 20 21 3d 20 32  argv.length != 2
0450: 29 20 7b 0a 09 74 68 72 6f 77 20 6e 65 77 20 54  ) {..throw new T
0460: 63 6c 4e 75 6d 41 72 67 73 45 78 63 65 70 74 69  clNumArgsExcepti
0470: 6f 6e 28 69 6e 74 65 72 70 2c 20 31 2c 20 61 72  on(interp, 1, ar
0480: 67 76 2c 0a 09 09 22 63 6c 61 73 73 62 79 74 65  gv,..."classbyte
0490: 73 22 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  s");.    }..    
04a0: 54 63 6c 4f 62 6a 65 63 74 20 63 6c 61 73 73 42  TclObject classB
04b0: 79 74 65 73 4f 62 6a 20 3d 20 61 72 67 76 5b 31  ytesObj = argv[1
04c0: 5d 3b 0a 0a 20 20 20 20 2f 2f 20 49 66 20 74 68  ];..    // If th
04d0: 65 20 63 6c 61 73 73 62 79 74 65 73 20 61 72 67  e classbytes arg
04e0: 75 6d 65 6e 74 20 69 73 20 61 20 52 65 66 6c 65  ument is a Refle
04f0: 63 74 4f 62 6a 65 63 74 0a 20 20 20 20 2f 2f 20  ctObject.    // 
0500: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 61 20  that contains a 
0510: 62 79 74 65 5b 5d 20 74 68 65 6e 20 75 6e 77 72  byte[] then unwr
0520: 61 70 20 69 74 20 61 6e 64 0a 20 20 20 20 2f 2f  ap it and.    //
0530: 20 75 73 65 20 74 68 65 20 62 79 74 65 73 20 64   use the bytes d
0540: 69 72 65 63 74 6c 79 2e 20 43 72 65 61 74 69 6e  irectly. Creatin
0550: 67 20 61 20 54 63 6c 42 79 74 65 41 72 72 61 79  g a TclByteArray
0560: 0a 20 20 20 20 2f 2f 20 61 63 74 75 61 6c 6c 79  .    // actually
0570: 20 63 72 65 61 74 65 73 20 61 20 63 6f 70 79 20   creates a copy 
0580: 6f 66 20 74 68 65 20 70 61 73 73 65 64 20 69 6e  of the passed in
0590: 20 61 72 72 61 79 2c 0a 20 20 20 20 2f 2f 20 73   array,.    // s
05a0: 6f 20 70 61 73 73 69 6e 67 20 74 68 65 20 62 79  o passing the by
05b0: 74 65 5b 5d 20 64 69 72 65 63 74 6c 79 20 69 73  te[] directly is
05c0: 20 66 61 73 74 65 72 2e 0a 0a 20 20 20 20 69 66   faster...    if
05d0: 20 28 63 6c 61 73 73 42 79 74 65 73 4f 62 6a 2e   (classBytesObj.
05e0: 67 65 74 49 6e 74 65 72 6e 61 6c 52 65 70 28 29  getInternalRep()
05f0: 20 69 6e 73 74 61 6e 63 65 6f 66 20 52 65 66 6c   instanceof Refl
0600: 65 63 74 4f 62 6a 65 63 74 29 20 7b 0a 20 20 20  ectObject) {.   
0610: 20 20 20 20 20 4f 62 6a 65 63 74 20 6f 62 6a 20       Object obj 
0620: 3d 20 52 65 66 6c 65 63 74 4f 62 6a 65 63 74 2e  = ReflectObject.
0630: 67 65 74 28 69 6e 74 65 72 70 2c 20 63 6c 61 73  get(interp, clas
0640: 73 42 79 74 65 73 4f 62 6a 29 3b 0a 20 20 20 20  sBytesObj);.    
0650: 20 20 20 20 69 66 20 28 6f 62 6a 20 69 6e 73 74      if (obj inst
0660: 61 6e 63 65 6f 66 20 62 79 74 65 5b 5d 29 20 7b  anceof byte[]) {
0670: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6c 61  .            cla
0680: 73 73 44 61 74 61 20 3d 20 28 62 79 74 65 5b 5d  ssData = (byte[]
0690: 29 20 6f 62 6a 3b 0a 20 20 20 20 20 20 20 20 7d  ) obj;.        }
06a0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 20 28  .    }..    if (
06b0: 63 6c 61 73 73 44 61 74 61 20 3d 3d 20 6e 75 6c  classData == nul
06c0: 6c 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2f 20  l) {.        // 
06d0: 46 49 58 4d 45 3a 20 49 74 20 77 6f 75 6c 64 20  FIXME: It would 
06e0: 62 65 20 62 65 74 74 65 72 20 69 66 20 74 68 65  be better if the
06f0: 20 54 63 6c 42 79 74 65 41 72 72 61 79 20 63 6c   TclByteArray cl
0700: 61 73 73 0a 20 20 20 20 20 20 20 20 2f 2f 20 77  ass.        // w
0710: 61 73 20 61 76 61 69 6c 61 62 6c 65 20 69 6e 20  as available in 
0720: 62 6f 74 68 20 54 63 6c 20 42 6c 65 6e 64 20 61  both Tcl Blend a
0730: 6e 64 20 4a 61 63 6c 20 73 6f 20 74 68 61 74 20  nd Jacl so that 
0740: 77 65 0a 20 20 20 20 20 20 20 20 2f 2f 20 63 6f  we.        // co
0750: 75 6c 64 20 71 75 65 72 79 20 62 79 74 65 73 20  uld query bytes 
0760: 64 69 72 65 63 74 6c 79 20 69 6e 73 74 65 61 64  directly instead
0770: 20 6f 66 20 63 6f 6e 76 65 72 74 69 6e 67 20 74   of converting t
0780: 6f 0a 20 20 20 20 20 20 20 20 2f 2f 20 61 20 73  o.        // a s
0790: 74 72 69 6e 67 20 61 6e 64 20 74 68 65 6e 20 63  tring and then c
07a0: 6f 6e 76 65 72 74 69 6e 67 20 62 61 63 6b 20 74  onverting back t
07b0: 6f 20 62 79 74 65 73 2e 0a 0a 20 20 20 20 20 20  o bytes...      
07c0: 20 20 53 74 72 69 6e 67 20 73 74 72 20 3d 20 63    String str = c
07d0: 6c 61 73 73 42 79 74 65 73 4f 62 6a 2e 74 6f 53  lassBytesObj.toS
07e0: 74 72 69 6e 67 28 29 3b 0a 20 20 20 20 20 20 20  tring();.       
07f0: 20 66 69 6e 61 6c 20 69 6e 74 20 73 74 72 5f 6c   final int str_l
0800: 65 6e 67 74 68 20 3d 20 73 74 72 2e 6c 65 6e 67  ength = str.leng
0810: 74 68 28 29 3b 0a 20 20 20 20 20 20 20 20 63 6c  th();.        cl
0820: 61 73 73 44 61 74 61 20 3d 20 6e 65 77 20 62 79  assData = new by
0830: 74 65 5b 73 74 72 5f 6c 65 6e 67 74 68 5d 3b 0a  te[str_length];.
0840: 20 20 20 20 20 20 20 20 66 6f 72 20 28 69 6e 74          for (int
0850: 20 69 3d 30 3b 20 69 20 3c 20 73 74 72 5f 6c 65   i=0; i < str_le
0860: 6e 67 74 68 3b 20 69 2b 2b 29 20 7b 0a 20 20 20  ngth; i++) {.   
0870: 20 20 20 20 20 20 20 20 20 63 6c 61 73 73 44 61           classDa
0880: 74 61 5b 69 5d 20 3d 20 28 62 79 74 65 29 20 73  ta[i] = (byte) s
0890: 74 72 2e 63 68 61 72 41 74 28 69 29 3b 0a 20 20  tr.charAt(i);.  
08a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
08b0: 20 20 20 2f 2f 20 55 73 65 20 54 63 6c 43 6c 61     // Use TclCla
08c0: 73 73 4c 6f 61 64 65 72 20 64 65 66 69 6e 65 64  ssLoader defined
08d0: 20 6f 6e 20 61 20 70 65 72 2d 69 6e 74 65 72 70   on a per-interp
08e0: 20 62 61 73 69 73 0a 20 20 20 20 54 63 6c 43 6c   basis.    TclCl
08f0: 61 73 73 4c 6f 61 64 65 72 20 74 63 6c 43 6c 61  assLoader tclCla
0900: 73 73 4c 6f 61 64 65 72 20 3d 20 28 54 63 6c 43  ssLoader = (TclC
0910: 6c 61 73 73 4c 6f 61 64 65 72 29 20 69 6e 74 65  lassLoader) inte
0920: 72 70 2e 67 65 74 43 6c 61 73 73 4c 6f 61 64 65  rp.getClassLoade
0930: 72 28 29 3b 0a 0a 20 20 20 20 72 65 73 75 6c 74  r();..    result
0940: 20 3d 20 74 63 6c 43 6c 61 73 73 4c 6f 61 64 65   = tclClassLoade
0950: 72 2e 64 65 66 69 6e 65 43 6c 61 73 73 28 6e 75  r.defineClass(nu
0960: 6c 6c 2c 20 63 6c 61 73 73 44 61 74 61 29 3b 0a  ll, classData);.
0970: 0a 20 20 20 20 69 6e 74 65 72 70 2e 73 65 74 52  .    interp.setR
0980: 65 73 75 6c 74 28 52 65 66 6c 65 63 74 4f 62 6a  esult(ReflectObj
0990: 65 63 74 2e 6e 65 77 49 6e 73 74 61 6e 63 65 28  ect.newInstance(
09a0: 69 6e 74 65 72 70 2c 0a 20 20 20 20 20 20 20 20  interp,.        
09b0: 20 20 20 20 43 6c 61 73 73 2e 63 6c 61 73 73 2c      Class.class,
09c0: 20 72 65 73 75 6c 74 29 29 3b 0a 7d 0a 0a 7d 20   result));.}..} 
09d0: 2f 2f 20 65 6e 64 20 4a 61 76 61 4e 65 77 43 6d  // end JavaNewCm
09e0: 64 0a 0a                                         d..