ruby.c源码分析
代码编译不了,但生活还是要继续的。我今天就读ruby.c。我快速的浏览了一下文件。因为我执行时
./ruby -v
helloworld01
[hello] ruby - version 0.49 (18 Jul 94)
yang@DESKTOP-V9HS3B6:~/ruby049/ruby$
也就是说,-v参数是可以执行的。于是我去找了,并进行了修改。
static char*
proc_options(argcp, argvp)
int *argcp;
char ***argvp;
{
optind = 0;
while ((c = getopt_long(argc, argv, "+acde:F:i:I:lnpR:svxX:yNES",
long_options, &opt_index)) != EOF) {
switch (c) {
case 0: /* long options */
if (strcmp(long_options[opt_index].name, "version") == 0) {
version = TRUE;
show_version();
}
break;
case 'p':
}
这里,就是在处理选项。我在
case 'v'
那里进行修改。再编译。果然就能看到效果。
如果这样执行
./ruby -e 'print("ok")'
的处理逻辑在这里:
case 'e':
script_given++;
if (script == 0) script = "-e";
lex_setsrc("-e", optarg, strlen(optarg));
yyparse();
break;
可惜报错误。
另外,如果没有使用-e选项,需要从文件中读程序,处理如下:
if (script_given == 0) {
if (argc == optind) { /* no more args */
if (version == TRUE) exit(0);
script = "-";
load_stdin();
}
else {
script = argv[optind];
rb_load_file(argv[optind]);
optind++;
}
}
没有提供文件,就读标准输入,否则从文件中读。
再去读rb_load_file函数。
rb_load_file实际上也是调readin(fd,fname)
再看readin()
在readin()的最后,有:
start_read:
lex_setsrc(fname, p, pend - p);
yyparse();
这里,就是读进行源rb程序后,进行词法分析,语法分析。作者的程序结构和gawk1.01确实很像。
最后作者有如下主程序。
void
rb_main(argc, argv) /* real main() is in eval.c */
int argc;
char **argv;
{
char *script;
extern VALUE errat;
rb_call_inits();
rb_define_variable("$@", &errat, Qnil, Qnil);
errat = str_new2(argv[0]);
rb_define_variable("$VERBOSE", &verbose, Qnil, Qnil);
rb_define_variable("$DEBUG", &debug, Qnil, Qnil);
#ifdef USE_DLN
rb_dln_argv0 = argv[0];
#endif
script = proc_options(&argc, &argv);
if (do_check && nerrs == 0) {
printf("Syntax OK\n");
exit(0);
}
if (do_print) {
yyappend_print();
}
if (do_loop) {
yywhole_loop(do_line, do_split);
}
if (nerrs == 0) {
TopLevel(script, argc, argv);
}
exit(nerrs);
}
可以c语言的是main呀。那ruby0.49的main在哪里呢,我
grep 'main' *.c
发现很多文件中有main,当然,有些文件中的测试程序的。但真正的入口在哪儿呢?这是个问题。