xref: /openbsd/gnu/usr.bin/perl/regen/opcodes (revision 097a140d)
1# New ops always go at the end
2# The restriction on having custom as the last op has been removed
3
4# A recapitulation of the format of this file:
5# The file consists of five tab-separated columns: the name of the op, an
6# English description, the name of the "check" routine used to optimize this
7# operation, some flags, and a description of the operands.
8
9# The flags consist of options followed by a mandatory op class signifier
10
11# The classes are:
12# baseop      - 0            unop     - 1            binop      - 2
13# logop       - |            listop   - @            pmop       - /
14# padop/svop  - $            padop    - # (unused)   loop       - {
15# baseop/unop - %            loopexop - }            filestatop - -
16# pvop/svop   - "            cop      - ;            methop     - .
17# unop_aux    - +
18
19# Other options are:
20#   needs stack mark                    - m  (OA_MARK)
21#   needs constant folding              - f  (OA_FOLDCONST)
22#   produces a scalar                   - s  (OA_RETSCALAR)
23#   produces an integer                 - i  (unused)
24#   needs a target                      - t  (OA_TARGET)
25#   target can be in a pad              - T  (OA_TARGET|OA_TARGLEX)
26#   has a corresponding integer version - I  (OA_OTHERINT)
27#   make temp copy in list assignment   - d  (OA_DANGEROUS)
28#   uses $_ if no argument given        - u  (OA_DEFGV)
29
30# Values for the operands are:
31# scalar      - S            list     - L            array     - A
32# hash        - H            sub (CV) - C            file      - F
33# socket      - Fs           filetest - F-           filetest_access - F-+
34# num-compare - S<           dirhandle - DF          infix bitwise   - S|
35
36# reference - R
37# "?" denotes an optional operand.
38
39# Nothing.
40
41null		null operation		ck_null		0
42stub		stub			ck_null		0
43scalar		scalar			ck_fun		s%	S
44
45# Pushy stuff.
46
47pushmark	pushmark		ck_null		s0
48wantarray	wantarray		ck_null		is0
49
50const		constant item		ck_svconst	s$
51
52gvsv		scalar variable		ck_null		ds$
53gv		glob value		ck_null		ds$
54gelem		glob elem		ck_null		ds2	S S
55padsv		private variable	ck_null		ds0
56padav		private array		ck_null		d0
57padhv		private hash		ck_null		d0
58padany		private value		ck_null		d0
59
60# References and stuff.
61
62rv2gv		ref-to-glob cast	ck_rvconst	ds1
63rv2sv		scalar dereference	ck_rvconst	ds1
64av2arylen	array length		ck_null		is1
65rv2cv		subroutine dereference	ck_rvconst	d1
66anoncode	anonymous subroutine	ck_anoncode	s$
67prototype	subroutine prototype	ck_prototype	su%	S?
68refgen		reference constructor	ck_spair	m1	L
69srefgen		single ref constructor	ck_null		fs1	S
70ref		reference-type operator	ck_fun		stu%	S?
71bless		bless			ck_fun		s@	S S?
72
73# Pushy I/O.
74
75backtick	quoted execution (``, qx)	ck_backtick	tu%	S?
76# glob defaults its first arg to $_
77glob		glob			ck_glob		t@	S?
78readline	<HANDLE>		ck_readline	t%	F?
79rcatline	append I/O operator	ck_null		t$
80
81# Bindable operators.
82
83regcmaybe	regexp internal guard	ck_fun		s1	S
84regcreset	regexp internal reset	ck_fun		s1	S
85regcomp		regexp compilation	ck_null		s|	S
86match		pattern match (m//)	ck_match	/
87qr		pattern quote (qr//)	ck_match	s/
88subst		substitution (s///)	ck_match	is/	S
89substcont	substitution iterator	ck_null		is|
90trans		transliteration (tr///)	ck_match	is"	S
91# y///r
92transr		transliteration (tr///)	ck_match	is"	S
93
94# Lvalue operators.
95
96sassign		scalar assignment	ck_sassign	s2	S S
97aassign		list assignment		ck_null		t2	L L
98
99chop		chop			ck_spair	mts%	L
100schop		scalar chop		ck_null		stu%	S?
101chomp		chomp			ck_spair	mTs%	L
102schomp		scalar chomp		ck_null		sTu%	S?
103defined		defined operator	ck_defined	isu%	S?
104undef		undef operator		ck_fun		s%	R?
105study		study			ck_fun		su%	S?
106pos		match position		ck_fun		stu%	R?
107
108preinc		preincrement (++)		ck_lfun		dIs1	S
109i_preinc	integer preincrement (++)	ck_lfun		dis1	S
110predec		predecrement (--)		ck_lfun		dIs1	S
111i_predec	integer predecrement (--)	ck_lfun		dis1	S
112postinc		postincrement (++)		ck_lfun		Ist1	S
113i_postinc	integer postincrement (++)	ck_lfun		ist1	S
114postdec		postdecrement (--)		ck_lfun		Ist1	S
115i_postdec	integer postdecrement (--)	ck_lfun		ist1	S
116
117# Ordinary operators.
118
119pow		exponentiation (**)	ck_null		fsT2	S S
120
121multiply	multiplication (*)	ck_null		IfsT2	S S
122i_multiply	integer multiplication (*)	ck_null		ifsT2	S S
123divide		division (/)		ck_null		IfsT2	S S
124i_divide	integer division (/)	ck_null		ifsT2	S S
125modulo		modulus (%)		ck_null		IifsT2	S S
126i_modulo	integer modulus (%)	ck_null		ifsT2	S S
127repeat		repeat (x)		ck_repeat	fmt2	L S
128
129add		addition (+)		ck_null		IfsT2	S S
130i_add		integer addition (+)	ck_null		ifsT2	S S
131subtract	subtraction (-)		ck_null		IfsT2	S S
132i_subtract	integer subtraction (-)	ck_null		ifsT2	S S
133concat		concatenation (.) or string	ck_concat	fsT2	S S
134multiconcat	concatenation (.) or string	ck_null	sT+
135stringify	string			ck_stringify	fsT@	S
136
137left_shift	left bitshift (<<)	ck_bitop	fsT2	S S
138right_shift	right bitshift (>>)	ck_bitop	fsT2	S S
139
140lt		numeric lt (<)		ck_cmp		Iifs2	S S<
141i_lt		integer lt (<)		ck_cmp		ifs2	S S<
142gt		numeric gt (>)		ck_cmp		Iifs2	S S<
143i_gt		integer gt (>)		ck_cmp		ifs2	S S<
144le		numeric le (<=)		ck_cmp		Iifs2	S S<
145i_le		integer le (<=)		ck_cmp		ifs2	S S<
146ge		numeric ge (>=)		ck_cmp		Iifs2	S S<
147i_ge		integer ge (>=)		ck_cmp		ifs2	S S<
148eq		numeric eq (==)		ck_cmp		Iifs2	S S<
149i_eq		integer eq (==)		ck_cmp		ifs2	S S<
150ne		numeric ne (!=)		ck_cmp		Iifs2	S S<
151i_ne		integer ne (!=)		ck_cmp		ifs2	S S<
152ncmp		numeric comparison (<=>)	ck_null		Iifst2	S S<
153i_ncmp		integer comparison (<=>)	ck_null		ifst2	S S<
154
155slt		string lt		ck_null		ifs2	S S
156sgt		string gt		ck_null		ifs2	S S
157sle		string le		ck_null		ifs2	S S
158sge		string ge		ck_null		ifs2	S S
159seq		string eq		ck_null		ifs2	S S
160sne		string ne		ck_null		ifs2	S S
161scmp		string comparison (cmp)	ck_null		ifst2	S S
162
163bit_and		bitwise and (&)		ck_bitop	fst2	S S|
164bit_xor		bitwise xor (^)		ck_bitop	fst2	S S|
165bit_or		bitwise or (|)		ck_bitop	fst2	S S|
166nbit_and	numeric bitwise and (&)	ck_bitop	fsT2	S S|
167nbit_xor	numeric bitwise xor (^)	ck_bitop	fsT2	S S|
168nbit_or		numeric bitwise or (|)	ck_bitop	fsT2	S S|
169sbit_and	string bitwise and (&.)	ck_bitop	fst2	S S|
170sbit_xor	string bitwise xor (^.)	ck_bitop	fst2	S S|
171sbit_or		string bitwise or (|.)	ck_bitop	fst2	S S|
172
173negate		negation (-)		ck_null		Ifst1	S
174i_negate	integer negation (-)	ck_null		ifst1	S
175not		not			ck_null		ifs1	S
176complement	1's complement (~)	ck_bitop	fst1	S
177ncomplement	numeric 1's complement (~)	ck_bitop	fsT1	S
178scomplement	string 1's complement (~)	ck_null	fsT1	S
179
180smartmatch	smart match		ck_smartmatch	s2
181
182# High falutin' math.
183
184atan2		atan2			ck_fun		fsT@	S S
185sin		sin			ck_fun		fsTu%	S?
186cos		cos			ck_fun		fsTu%	S?
187rand		rand			ck_fun		sT%	S?
188srand		srand			ck_fun		sT%	S?
189exp		exp			ck_fun		fsTu%	S?
190log		log			ck_fun		fsTu%	S?
191sqrt		sqrt			ck_fun		fsTu%	S?
192
193# Lowbrow math.
194
195int		int			ck_fun		fsTu%	S?
196hex		hex			ck_fun		fsTu%	S?
197oct		oct			ck_fun		fsTu%	S?
198abs		abs			ck_fun		fsTu%	S?
199
200# String stuff.
201
202length		length			ck_length	ifsTu%	S?
203substr		substr			ck_substr	st@	S S S? S?
204vec		vec			ck_fun		ist@	S S S
205
206index		index			ck_index	isT@	S S S?
207rindex		rindex			ck_index	isT@	S S S?
208
209sprintf		sprintf			ck_lfun		fmst@	S L
210formline	formline		ck_fun		ms@	S L
211ord		ord			ck_fun		ifsTu%	S?
212chr		chr			ck_fun		fsTu%	S?
213crypt		crypt			ck_fun		fsT@	S S
214ucfirst		ucfirst			ck_fun		fstu%	S?
215lcfirst		lcfirst			ck_fun		fstu%	S?
216uc		uc			ck_fun		fstu%	S?
217lc		lc			ck_fun		fstu%	S?
218quotemeta	quotemeta		ck_fun		fstu%	S?
219
220# Arrays.
221
222rv2av		array dereference	ck_rvconst	dt1
223aelemfast	constant array element	ck_null		ds$	A S
224aelemfast_lex	constant lexical array element	ck_null		d0	A S
225aelem		array element		ck_null		s2	A S
226aslice		array slice		ck_null		m@	A L
227kvaslice	index/value array slice	ck_null		m@	A L
228
229aeach		each on array		ck_each		d%	A
230avalues		values on array		ck_each		dt%	A
231akeys		keys on array		ck_each		t%	A
232
233# Hashes.
234
235each		each			ck_each		d%	H
236values		values			ck_each		dt%	H
237keys		keys			ck_each		t%	H
238delete		delete			ck_delete	%	S
239exists		exists			ck_exists	is%	S
240rv2hv		hash dereference	ck_rvconst	dt1
241helem		hash element		ck_null		s2	H S
242hslice		hash slice		ck_null		m@	H L
243kvhslice	key/value hash slice	ck_null		m@	H L
244
245# mixed array and hash access
246
247multideref	array or hash lookup	ck_null		ds+
248
249# Explosives and implosives.
250
251unpack		unpack			ck_fun		u@	S S?
252pack		pack			ck_fun		fmst@	S L
253split		split			ck_split	t/	S S S
254join		join or string		ck_join		fmst@	S L
255
256# List operators.
257
258list		list			ck_null		m@	L
259lslice		list slice		ck_null		2	H L L
260anonlist	anonymous array ([])	ck_fun		ms@	L
261anonhash	anonymous hash ({})	ck_fun		ms@	L
262
263splice		splice			ck_fun		m@	A S? S? L
264push		push			ck_fun		imsT@	A L
265pop		pop			ck_shift	s%	A?
266shift		shift			ck_shift	s%	A?
267unshift		unshift			ck_fun		imsT@	A L
268sort		sort			ck_sort		m@	C? L
269reverse		reverse			ck_fun		mt@	L
270
271grepstart	grep			ck_grep		m@	C L
272grepwhile	grep iterator		ck_null		t|
273
274mapstart	map			ck_grep		m@	C L
275mapwhile	map iterator		ck_null		t|
276
277# Range stuff.
278
279range		flipflop		ck_null		|	S S
280flip		range (or flip)		ck_null		1	S S
281flop		range (or flop)		ck_null		1
282
283# Control.
284
285and		logical and (&&)		ck_null		|
286or		logical or (||)			ck_null		|
287xor		logical xor			ck_null		fs2	S S
288dor		defined or (//)			ck_null		|
289cond_expr	conditional expression		ck_null		|
290andassign	logical and assignment (&&=)	ck_null		s|
291orassign	logical or assignment (||=)	ck_null		s|
292dorassign	defined or assignment (//=)	ck_null		s|
293
294entersub	subroutine entry	ck_subr		dm1	L
295leavesub	subroutine exit		ck_null		1
296leavesublv	lvalue subroutine return	ck_null		1
297argcheck	check subroutine arguments	ck_null		+
298argelem		subroutine argument	ck_null		+
299argdefelem	subroutine argument default value	ck_null		|
300caller		caller			ck_fun		t%	S?
301warn		warn			ck_fun		imst@	L
302die		die			ck_fun		imst@	L
303reset		symbol reset		ck_fun		is%	S?
304
305lineseq		line sequence		ck_null		@
306nextstate	next statement		ck_null		s;
307dbstate		debug next statement	ck_null		s;
308unstack		iteration finalizer	ck_null		s0
309enter		block entry		ck_null		0
310leave		block exit		ck_null		@
311scope		block			ck_null		@
312enteriter	foreach loop entry	ck_null		d{
313iter		foreach loop iterator	ck_null		0
314enterloop	loop entry		ck_null		d{
315leaveloop	loop exit		ck_null		2
316return		return			ck_return	m@	L
317last		last			ck_null		s}
318next		next			ck_null		s}
319redo		redo			ck_null		s}
320dump		dump			ck_null		ds}
321goto		goto			ck_null		s}
322exit		exit			ck_fun		s%	S?
323method		method lookup		ck_method	d.
324method_named	method with known name	ck_null		d.
325method_super	super with known name	ck_null		d.
326method_redir	redirect method with known name	ck_null	d.
327method_redir_super	redirect super method with known name	ck_null	d.
328
329entergiven	given()			ck_null		d|
330leavegiven	leave given block	ck_null		1
331enterwhen	when()			ck_null		d|
332leavewhen	leave when block	ck_null		1
333break		break			ck_null		0
334continue	continue		ck_null		0
335
336# I/O.
337
338open		open			ck_open		ismt@	F S? L
339close		close			ck_fun		is%	F?
340pipe_op		pipe			ck_fun		is@	F F
341
342fileno		fileno			ck_fun		ist%	F
343umask		umask			ck_fun		ist%	S?
344binmode		binmode			ck_fun		s@	F S?
345
346tie		tie			ck_fun		idms@	R S L
347untie		untie			ck_fun		is%	R
348tied		tied			ck_fun		ds%	R
349dbmopen		dbmopen			ck_fun		is@	H S S
350dbmclose	dbmclose		ck_fun		is%	H
351
352sselect		select system call	ck_select	t@	S S S S
353select		select			ck_select	st@	F?
354
355getc		getc			ck_eof		st%	F?
356read		read			ck_fun		imst@	F R S S?
357enterwrite	write			ck_fun		is%	F?
358leavewrite	write exit		ck_null		1
359
360prtf		printf			ck_listiob	ims@	F? L
361print		print			ck_listiob	ims@	F? L
362say		say			ck_listiob	ims@	F? L
363
364sysopen		sysopen			ck_fun		s@	F S S S?
365sysseek		sysseek			ck_fun		s@	F S S
366sysread		sysread			ck_fun		imst@	F R S S?
367syswrite	syswrite		ck_fun		imst@	F S S? S?
368
369eof		eof			ck_eof		is%	F?
370tell		tell			ck_tell		st%	F?
371seek		seek			ck_tell		s@	F S S
372# truncate really behaves as if it had both "S S" and "F S"
373truncate	truncate		ck_trunc	is@	S S
374
375fcntl		fcntl			ck_fun		st@	F S S
376ioctl		ioctl			ck_fun		st@	F S S
377flock		flock			ck_fun		isT@	F S
378
379# Sockets.  OP_IS_SOCKET wants them consecutive (so moved 1st 2)
380
381send		send			ck_fun		imst@	Fs S S S?
382recv		recv			ck_fun		imst@	Fs R S S
383
384socket		socket			ck_fun		is@	Fs S S S
385sockpair	socketpair		ck_fun		is@	Fs Fs S S S
386
387bind		bind			ck_fun		is@	Fs S
388connect		connect			ck_fun		is@	Fs S
389listen		listen			ck_fun		is@	Fs S
390accept		accept			ck_fun		ist@	Fs Fs
391shutdown	shutdown		ck_fun		ist@	Fs S
392
393gsockopt	getsockopt		ck_fun		is@	Fs S S
394ssockopt	setsockopt		ck_fun		is@	Fs S S S
395
396getsockname	getsockname		ck_fun		is%	Fs
397getpeername	getpeername		ck_fun		is%	Fs
398
399# Stat calls.  OP_IS_FILETEST wants them consecutive.
400# Also needs to match OP_IS_STAT() in op.h
401
402lstat		lstat			ck_ftst		u-	F?
403stat		stat			ck_ftst		u-	F?
404ftrread		-R			ck_ftst		isu-	F-+
405ftrwrite	-W			ck_ftst		isu-	F-+
406ftrexec		-X			ck_ftst		isu-	F-+
407fteread		-r			ck_ftst		isu-	F-+
408ftewrite	-w			ck_ftst		isu-	F-+
409fteexec		-x			ck_ftst		isu-	F-+
410ftis		-e			ck_ftst		isu-	F-
411ftsize		-s			ck_ftst		istu-	F-
412ftmtime		-M			ck_ftst		stu-	F-
413ftatime		-A			ck_ftst		stu-	F-
414ftctime		-C			ck_ftst		stu-	F-
415ftrowned	-O			ck_ftst		isu-	F-
416fteowned	-o			ck_ftst		isu-	F-
417ftzero		-z			ck_ftst		isu-	F-
418ftsock		-S			ck_ftst		isu-	F-
419ftchr		-c			ck_ftst		isu-	F-
420ftblk		-b			ck_ftst		isu-	F-
421ftfile		-f			ck_ftst		isu-	F-
422ftdir		-d			ck_ftst		isu-	F-
423ftpipe		-p			ck_ftst		isu-	F-
424ftsuid		-u			ck_ftst		isu-	F-
425ftsgid		-g			ck_ftst		isu-	F-
426ftsvtx		-k			ck_ftst		isu-	F-
427ftlink		-l			ck_ftst		isu-	F-
428fttty		-t			ck_ftst		is-	F-
429fttext		-T			ck_ftst		isu-	F-
430ftbinary	-B			ck_ftst		isu-	F-
431
432# File calls.
433
434# chdir really behaves as if it had both "S?" and "F?"
435chdir		chdir			ck_trunc	isT%	S?
436chown		chown			ck_fun		imsT@	L
437chroot		chroot			ck_fun		isTu%	S?
438unlink		unlink			ck_fun		imsTu@	L
439chmod		chmod			ck_fun		imsT@	L
440utime		utime			ck_fun		imsT@	L
441rename		rename			ck_fun		isT@	S S
442link		link			ck_fun		isT@	S S
443symlink		symlink			ck_fun		isT@	S S
444readlink	readlink		ck_fun		stu%	S?
445mkdir		mkdir			ck_fun		isTu@	S? S?
446rmdir		rmdir			ck_fun		isTu%	S?
447
448# Directory calls.
449
450open_dir	opendir			ck_fun		is@	F S
451readdir		readdir			ck_fun		%	DF
452telldir		telldir			ck_fun		st%	DF
453seekdir		seekdir			ck_fun		s@	DF S
454rewinddir	rewinddir		ck_fun		s%	DF
455closedir	closedir		ck_fun		is%	DF
456
457# Process control.
458
459fork		fork			ck_null		ist0
460wait		wait			ck_null		isT0
461waitpid		waitpid			ck_fun		isT@	S S
462system		system			ck_exec		imsT@	S? L
463exec		exec			ck_exec		imsT@	S? L
464kill		kill			ck_fun		imsT@	L
465getppid		getppid			ck_null		isT0
466getpgrp		getpgrp			ck_fun		isT%	S?
467setpgrp		setpgrp			ck_fun		isT@	S? S?
468getpriority	getpriority		ck_fun		isT@	S S
469setpriority	setpriority		ck_fun		isT@	S S S
470
471# Time calls.
472
473time		time			ck_null		isT0
474tms		times			ck_null		0
475localtime	localtime		ck_fun		t%	S?
476gmtime		gmtime			ck_fun		t%	S?
477alarm		alarm			ck_fun		istu%	S?
478sleep		sleep			ck_fun		isT%	S?
479
480# Shared memory.
481
482shmget		shmget			ck_fun		imst@	S S S
483shmctl		shmctl			ck_fun		imst@	S S S
484shmread		shmread			ck_fun		imst@	S S S S
485shmwrite	shmwrite		ck_fun		imst@	S S S S
486
487# Message passing.
488
489msgget		msgget			ck_fun		imst@	S S
490msgctl		msgctl			ck_fun		imst@	S S S
491msgsnd		msgsnd			ck_fun		imst@	S S S
492msgrcv		msgrcv			ck_fun		imst@	S S S S S
493
494# Semaphores.
495
496semop		semop			ck_fun		imst@	S S
497semget		semget			ck_fun		imst@	S S S
498semctl		semctl			ck_fun		imst@	S S S S
499
500# Eval.
501
502require		require			ck_require	dsu%	S?
503dofile		do "file"		ck_fun		d1	S
504hintseval	eval hints		ck_svconst	s$
505entereval	eval "string"		ck_eval		du%	S?
506leaveeval	eval "string" exit	ck_null		1	S
507entertry	eval {block}		ck_eval		d|
508leavetry	eval {block} exit	ck_null		@
509
510# Get system info.
511
512ghbyname	gethostbyname		ck_fun		%	S
513ghbyaddr	gethostbyaddr		ck_fun		@	S S
514ghostent	gethostent		ck_null		0
515gnbyname	getnetbyname		ck_fun		%	S
516gnbyaddr	getnetbyaddr		ck_fun		@	S S
517gnetent		getnetent		ck_null		0
518gpbyname	getprotobyname		ck_fun		%	S
519gpbynumber	getprotobynumber	ck_fun		@	S
520gprotoent	getprotoent		ck_null		0
521gsbyname	getservbyname		ck_fun		@	S S
522gsbyport	getservbyport		ck_fun		@	S S
523gservent	getservent		ck_null		0
524shostent	sethostent		ck_fun		is%	S
525snetent		setnetent		ck_fun		is%	S
526sprotoent	setprotoent		ck_fun		is%	S
527sservent	setservent		ck_fun		is%	S
528ehostent	endhostent		ck_null		is0
529enetent		endnetent		ck_null		is0
530eprotoent	endprotoent		ck_null		is0
531eservent	endservent		ck_null		is0
532gpwnam		getpwnam		ck_fun		%	S
533gpwuid		getpwuid		ck_fun		%	S
534gpwent		getpwent		ck_null		0
535spwent		setpwent		ck_null		is0
536epwent		endpwent		ck_null		is0
537ggrnam		getgrnam		ck_fun		%	S
538ggrgid		getgrgid		ck_fun		%	S
539ggrent		getgrent		ck_null		0
540sgrent		setgrent		ck_null		is0
541egrent		endgrent		ck_null		is0
542getlogin	getlogin		ck_null		st0
543
544# Miscellaneous.
545
546syscall		syscall			ck_fun		imst@	S L
547
548# For multi-threading
549lock		lock			ck_rfun		s%	R
550
551# For state support
552
553once		once			ck_null		|
554
555custom		unknown custom operator		ck_null		0
556
557# For CORE:: subs
558coreargs	CORE:: subroutine	ck_null		$
559avhvswitch	Array/hash switch	ck_null		t1
560
561runcv		__SUB__			ck_null		s0
562
563# fc and \F
564fc		fc			ck_fun		fstu%	S?
565
566padcv		private subroutine	ck_null		d0
567introcv		private subroutine	ck_null		d0
568clonecv		private subroutine	ck_null		d0
569padrange	list of private variables	ck_null		d0
570refassign	lvalue ref assignment	ck_refassign	ds2
571lvref		lvalue ref assignment	ck_null		d%
572lvrefslice	lvalue ref assignment	ck_null		d@
573lvavref		lvalue array reference	ck_null		d%
574anonconst	anonymous constant	ck_null		ds1
575
576isa		derived class test	ck_isa		s2
577
578cmpchain_and	comparison chaining	ck_null		|
579cmpchain_dup	comparand shuffling	ck_null		1
580