This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
fix a few places that said 'int', but meant 'STRLEN'
[perl5.git] / embed.pl
... / ...
CommitLineData
1#!/usr/bin/perl -w
2
3require 5.003;
4
5# XXX others that may need adding
6# warnhook
7# hints
8# copline
9my @extvars = qw(sv_undef sv_yes sv_no na dowarn
10 curcop compiling
11 tainting tainted stack_base stack_sp sv_arenaroot
12 no_modify
13 curstash DBsub DBsingle debstash
14 rsfp
15 stdingv
16 defgv
17 errgv
18 rsfp_filters
19 perldb
20 diehook
21 dirty
22 perl_destruct_level
23 );
24
25sub readsyms (\%$) {
26 my ($syms, $file) = @_;
27 local (*FILE, $_);
28 open(FILE, "< $file")
29 or die "embed.pl: Can't open $file: $!\n";
30 while (<FILE>) {
31 s/[ \t]*#.*//; # Delete comments.
32 if (/^\s*(\S+)\s*$/) {
33 my $sym = $1;
34 warn "duplicate symbol $sym while processing $file\n"
35 if exists $$syms{$sym};
36 $$syms{$sym} = 1;
37 }
38 }
39 close(FILE);
40}
41
42readsyms %global, 'global.sym';
43readsyms %global, 'pp.sym';
44
45sub readvars(\%$$@) {
46 my ($syms, $file,$pre,$keep_pre) = @_;
47 local (*FILE, $_);
48 open(FILE, "< $file")
49 or die "embed.pl: Can't open $file: $!\n";
50 while (<FILE>) {
51 s/[ \t]*#.*//; # Delete comments.
52 if (/PERLVARI?C?\($pre(\w+)/) {
53 my $sym = $1;
54 $sym = $pre . $sym if $keep_pre;
55 warn "duplicate symbol $sym while processing $file\n"
56 if exists $$syms{$sym};
57 $$syms{$sym} = 1;
58 }
59 }
60 close(FILE);
61}
62
63my %intrp;
64my %thread;
65
66readvars %intrp, 'intrpvar.h','I';
67readvars %thread, 'thrdvar.h','T';
68readvars %globvar, 'perlvars.h','G';
69readvars %objvar, 'intrpvar.h','pi', 1;
70
71foreach my $sym (sort keys %intrp)
72 {
73 if (exists $global{$sym})
74 {
75 delete $global{$sym};
76 warn "$sym in {global,pp}.sym as well as intrpvar.h\n";
77 }
78 }
79
80foreach my $sym (sort keys %globvar)
81 {
82 if (exists $global{$sym})
83 {
84 delete $global{$sym};
85 warn "$sym in {global,pp}.sym as well as perlvars.h\n";
86 }
87 }
88
89foreach my $sym (sort keys %thread)
90 {
91 warn "$sym in intrpvar.h as well as thrdvar.h\n" if exists $intrp{$sym};
92 if (exists $global{$sym})
93 {
94 delete $global{$sym};
95 warn "$sym in {global,pp}.sym as well as thrdvar.h\n";
96 }
97 }
98
99sub undefine ($) {
100 my ($sym) = @_;
101 "#undef $sym\n";
102}
103
104sub hide ($$) {
105 my ($from, $to) = @_;
106 my $t = int(length($from) / 8);
107 "#define $from" . "\t" x ($t < 3 ? 3 - $t : 1) . "$to\n";
108}
109
110sub embed ($) {
111 my ($sym) = @_;
112 hide($sym, "Perl_$sym");
113}
114
115sub embedobj ($) {
116 my ($sym) = @_;
117 hide($sym, $sym =~ /^perl_/i ? "CPerlObj::$sym" : "CPerlObj::Perl_$sym");
118}
119
120sub objxsub_func ($) {
121 my ($sym) = @_;
122 undefine($sym) . hide($sym, $sym =~ /^perl_/i
123 ? "pPerl->$sym"
124 : "pPerl->Perl_$sym");
125}
126
127sub objxsub_var ($) {
128 my ($sym) = @_;
129 undefine("PL_$sym") . hide("PL_$sym", "pPerl->PL_$sym");
130}
131
132sub embedvar ($) {
133 my ($sym) = @_;
134# hide($sym, "Perl_$sym");
135 return '';
136}
137
138sub multon ($$$) {
139 my ($sym,$pre,$ptr) = @_;
140 hide("PL_$sym", "($ptr$pre$sym)");
141}
142sub multoff ($$) {
143 my ($sym,$pre) = @_;
144 return hide("PL_$pre$sym", "PL_$sym");
145}
146
147unlink 'embed.h';
148open(EM, '> embed.h')
149 or die "Can't create embed.h: $!\n";
150
151print EM <<'END';
152/* !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
153 This file is built by embed.pl from global.sym, pp.sym, intrpvar.h,
154 perlvars.h and thrdvar.h. Any changes made here will be lost!
155*/
156
157/* (Doing namespace management portably in C is really gross.) */
158
159/* NO_EMBED is no longer supported. i.e. EMBED is always active. */
160
161/* Hide global symbols */
162
163#if !defined(PERL_OBJECT)
164
165END
166
167for $sym (sort keys %global) {
168 print EM embed($sym);
169}
170
171print EM <<'END';
172
173#else /* PERL_OBJECT */
174
175END
176
177# XXX these should be in a *.sym file
178my @staticfuncs = qw(
179 perl_init_i18nl10n
180 perl_init_i18nl14n
181 perl_new_collate
182 perl_new_ctype
183 perl_new_numeric
184 perl_set_numeric_local
185 perl_set_numeric_standard
186 perl_construct
187 perl_destruct
188 perl_atexit
189 perl_free
190 perl_parse
191 perl_run
192 perl_get_sv
193 perl_get_av
194 perl_get_hv
195 perl_get_cv
196 perl_call_argv
197 perl_call_pv
198 perl_call_method
199 perl_call_sv
200 perl_eval_pv
201 perl_eval_sv
202 perl_require_pv
203
204 hsplit
205 hfreeentries
206 more_he
207 new_he
208 del_he
209 save_hek
210 mess_alloc
211 gv_init_sv
212 save_scalar_at
213 asIV
214 asUV
215 more_sv
216 more_xiv
217 more_xnv
218 more_xpv
219 more_xrv
220 new_xiv
221 new_xnv
222 new_xpv
223 new_xrv
224 del_xiv
225 del_xnv
226 del_xpv
227 del_xrv
228 sv_mortalgrow
229 sv_unglob
230 sv_check_thinkfirst
231 avhv_index_sv
232 do_report_used
233 do_clean_objs
234 do_clean_named_objs
235 do_clean_all
236 not_a_number
237 my_safemalloc
238 visit
239 qsortsv
240 sortcv
241 save_magic
242 magic_methpack
243 magic_methcall
244 magic_methcall
245 doform
246 doencodes
247 refto
248 seed
249 docatch
250 dofindlabel
251 doparseform
252 dopoptoeval
253 dopoptolabel
254 dopoptoloop
255 dopoptosub
256 dopoptosub_at
257 save_lines
258 doeval
259 sv_ncmp
260 sv_i_ncmp
261 amagic_ncmp
262 amagic_i_ncmp
263 amagic_cmp
264 amagic_cmp_locale
265 mul128
266 is_an_int
267 div128
268 runops_standard
269 runops_debug
270 check_uni
271 force_next
272 force_version
273 force_word
274 tokeq
275 scan_const
276 scan_formline
277 scan_heredoc
278 scan_ident
279 scan_inputsymbol
280 scan_pat
281 scan_str
282 scan_subst
283 scan_trans
284 scan_word
285 skipspace
286 checkcomma
287 force_ident
288 incline
289 intuit_method
290 intuit_more
291 lop
292 missingterm
293 no_op
294 set_csh
295 sublex_done
296 sublex_push
297 sublex_start
298 uni
299 filter_gets
300 new_constant
301 ao
302 depcom
303 win32_textfilter
304 incl_perldb
305 isa_lookup
306 get_db_sub
307 list_assignment
308 bad_type
309 modkids
310 no_fh_allowed
311 scalarboolean
312 too_few_arguments
313 too_many_arguments
314 null
315 pad_findlex
316 newDEFSVOP
317 gv_ename
318 cv_clone2
319 find_beginning
320 forbid_setid
321 incpush
322 init_interp
323 init_ids
324 init_debugger
325 init_lexer
326 init_main_stash
327 init_perllib
328 init_postdump_symbols
329 init_predump_symbols
330 my_exit_jump
331 nuke_stacks
332 open_script
333 usage
334 validate_suid
335 emulate_eaccess
336 reg
337 reganode
338 regatom
339 regbranch
340 regc
341 reguni
342 regclass
343 regclassutf8
344 regcurly
345 reg_node
346 regpiece
347 reginsert
348 regoptail
349 regset
350 regtail
351 regwhite
352 nextchar
353 dumpuntil
354 scan_commit
355 study_chunk
356 add_data
357 re_croak2
358 regpposixcc
359 clear_re
360 regmatch
361 regrepeat
362 regrepeat_hard
363 regtry
364 reginclass
365 reginclassutf8
366 regcppush
367 regcppop
368 regcp_set_to
369 cache_re
370 restore_pos
371 reghop
372 reghopmaybe
373 dump
374 do_aspawn
375 debprof
376 bset_obj_store
377 new_logop
378 simplify_sort
379 is_handle_constructor
380 do_trans_CC_simple
381 do_trans_CC_count
382 do_trans_CC_complex
383 do_trans_UU_simple
384 do_trans_UU_count
385 do_trans_UU_complex
386 do_trans_UC_simple
387 do_trans_CU_simple
388 do_trans_UC_trivial
389 do_trans_CU_trivial
390 unwind_handler_stack
391 restore_magic
392 restore_rsfp
393 restore_expect
394 restore_lex_expect
395 yydestruct
396 del_sv
397 fprintf
398);
399
400for $sym (sort(keys(%global),@staticfuncs)) {
401 print EM embedobj($sym);
402}
403
404print EM <<'END';
405
406#endif /* PERL_OBJECT */
407
408/* compatibility stubs */
409
410#define sv_setptrobj(rv,ptr,name) sv_setref_iv(rv,name,(IV)ptr)
411#define sv_setptrref(rv,ptr) sv_setref_iv(rv,Nullch,(IV)ptr)
412
413END
414
415close(EM);
416
417unlink 'embedvar.h';
418open(EM, '> embedvar.h')
419 or die "Can't create embedvar.h: $!\n";
420
421print EM <<'END';
422/* !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
423 This file is built by embed.pl from global.sym, pp.sym, intrpvar.h,
424 perlvars.h and thrdvar.h. Any changes made here will be lost!
425*/
426
427/* (Doing namespace management portably in C is really gross.) */
428
429/* Put interpreter-specific symbols into a struct? */
430
431#ifdef MULTIPLICITY
432
433#ifndef USE_THREADS
434/* If we do not have threads then per-thread vars are per-interpreter */
435
436END
437
438for $sym (sort keys %thread) {
439 print EM multon($sym,'T','PL_curinterp->');
440}
441
442print EM <<'END';
443
444#endif /* !USE_THREADS */
445
446/* These are always per-interpreter if there is more than one */
447
448END
449
450for $sym (sort keys %intrp) {
451 print EM multon($sym,'I','PL_curinterp->');
452}
453
454print EM <<'END';
455
456#else /* !MULTIPLICITY */
457
458END
459
460for $sym (sort keys %intrp) {
461 print EM multoff($sym,'I');
462}
463
464print EM <<'END';
465
466#ifndef USE_THREADS
467
468END
469
470for $sym (sort keys %thread) {
471 print EM multoff($sym,'T');
472}
473
474print EM <<'END';
475
476#endif /* USE_THREADS */
477
478/* Hide what would have been interpreter-specific symbols? */
479
480END
481
482for $sym (sort keys %intrp) {
483 print EM embedvar($sym);
484}
485
486print EM <<'END';
487
488#ifndef USE_THREADS
489
490END
491
492for $sym (sort keys %thread) {
493 print EM embedvar($sym);
494}
495
496print EM <<'END';
497
498#endif /* USE_THREADS */
499#endif /* MULTIPLICITY */
500
501/* Now same trickey for per-thread variables */
502
503#ifdef USE_THREADS
504
505END
506
507for $sym (sort keys %thread) {
508 print EM multon($sym,'T','thr->');
509}
510
511print EM <<'END';
512
513#endif /* USE_THREADS */
514
515#ifdef PERL_GLOBAL_STRUCT
516
517END
518
519for $sym (sort keys %globvar) {
520 print EM multon($sym,'G','PL_Vars.');
521}
522
523print EM <<'END';
524
525#else /* !PERL_GLOBAL_STRUCT */
526
527END
528
529for $sym (sort keys %globvar) {
530 print EM multoff($sym,'G');
531}
532
533print EM <<'END';
534
535END
536
537for $sym (sort keys %globvar) {
538 print EM embedvar($sym);
539}
540
541print EM <<'END';
542
543#endif /* PERL_GLOBAL_STRUCT */
544
545END
546
547print EM <<'END';
548
549#ifdef PERL_POLLUTE /* disabled by default in 5.006 */
550
551END
552
553for $sym (sort @extvars) {
554 print EM hide($sym,"PL_$sym");
555}
556
557print EM <<'END';
558
559#endif /* PERL_POLLUTE */
560END
561
562
563close(EM);
564
565unlink 'objXSUB.h';
566open(OBX, '> objXSUB.h')
567 or die "Can't create objXSUB.h: $!\n";
568
569print OBX <<'EOT';
570/* !!!!!!! DO NOT EDIT THIS FILE !!!!!!!
571 This file is built by embed.pl from global.sym, pp.sym, intrpvar.h,
572 perlvars.h and thrdvar.h. Any changes made here will be lost!
573*/
574
575#ifndef __objXSUB_h__
576#define __objXSUB_h__
577
578/* Variables */
579
580EOT
581
582foreach my $sym (sort(keys(%intrp),
583 keys(%thread),
584 keys(%globvar),
585 keys(%objvar)))
586{
587 print OBX objxsub_var($sym);
588}
589
590print OBX <<'EOT';
591
592/* Functions */
593
594EOT
595
596
597for $sym (sort(keys(%global),@staticfuncs)) {
598 print OBX objxsub_func($sym);
599}
600
601
602print OBX <<'EOT';
603
604#endif /* __objXSUB_h__ */
605EOT
606
607close(OBX);