rabbit-slide-S_H_-graduating-ruby-literal-object-generation-from-parsey 1.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.rabbit +2 -0
- data/README.md +24 -0
- data/Rakefile +17 -0
- data/config.yaml +24 -0
- data/graduating-ruby-literal-object-generation-from-parsey.md +169 -0
- data/img/pr.png +0 -0
- data/pdf/graduating-ruby-literal-object-generation-from-parsey-slide.pdf +0 -0
- metadata +63 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: ac229630399c80d3bc33c2e27eef2c23d630aa2acb18693f258d44376fa65002
|
4
|
+
data.tar.gz: df75e956b8f70cd2efbcfd2727968e54c3e7ba86dc5a959ff610a36cf9c810dd
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 746c8612f0b10d2dadbf256aa7bbc385943a96fd24601f64b9ddd7202eb391c5d488f978c0f727b6086b6f1116062b85005ca1fbe13e6b3550e8e36f315a12bb
|
7
|
+
data.tar.gz: 1b79dbd7c51d5fe9fd7e54d1ffaad5041281a89ce93b1ca09d1e57fea3809e752ac0776f9d2d7664fff118dcbbacd3ffa194052372e7d5f4bdbcd5bd13afa860
|
data/.rabbit
ADDED
data/README.md
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
# Rubyのリテラルオブジェクト生成をparse.yから卒業させる
|
2
|
+
|
3
|
+
Fukuoka.rb #333 Ninja Talk 大会で話した「Rubyのリテラルオブジェクト生成をparse.yから卒業させる」のスライドです。
|
4
|
+
|
5
|
+
## For author
|
6
|
+
|
7
|
+
### Show
|
8
|
+
|
9
|
+
rake
|
10
|
+
|
11
|
+
### Publish
|
12
|
+
|
13
|
+
rake publish
|
14
|
+
|
15
|
+
## For viewers
|
16
|
+
|
17
|
+
### Install
|
18
|
+
|
19
|
+
gem install rabbit-slide-S_H_-wip-graduating-ruby-literal-object-generation-from-parsey
|
20
|
+
|
21
|
+
### Show
|
22
|
+
|
23
|
+
rabbit rabbit-slide-S_H_-wip-graduating-ruby-literal-object-generation-from-parsey.gem
|
24
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
require "rabbit/task/slide"
|
2
|
+
|
3
|
+
# Edit ./config.yaml to customize meta data
|
4
|
+
|
5
|
+
spec = nil
|
6
|
+
Rabbit::Task::Slide.new do |task|
|
7
|
+
spec = task.spec
|
8
|
+
# spec.files += Dir.glob("doc/**/*.*")
|
9
|
+
# spec.files -= Dir.glob("private/**/*.*")
|
10
|
+
# spec.add_runtime_dependency("rabbit-theme-YOUR-THEME")
|
11
|
+
end
|
12
|
+
|
13
|
+
desc "Tag #{spec.version}"
|
14
|
+
task :tag do
|
15
|
+
sh("git", "tag", "-a", spec.version.to_s, "-m", "Publish #{spec.version}")
|
16
|
+
sh("git", "push", "--tags")
|
17
|
+
end
|
data/config.yaml
ADDED
@@ -0,0 +1,24 @@
|
|
1
|
+
---
|
2
|
+
id: graduating-ruby-literal-object-generation-from-parsey
|
3
|
+
base_name: slide
|
4
|
+
tags:
|
5
|
+
- rabbit
|
6
|
+
presentation_date:
|
7
|
+
presentation_start_time:
|
8
|
+
presentation_end_time:
|
9
|
+
version: 1.0.2
|
10
|
+
licenses: []
|
11
|
+
slideshare_id:
|
12
|
+
speaker_deck_id:
|
13
|
+
vimeo_id:
|
14
|
+
youtube_id:
|
15
|
+
width: 1600
|
16
|
+
height: 900
|
17
|
+
source_code_uri:
|
18
|
+
author:
|
19
|
+
markup_language: :markdown
|
20
|
+
name: S.H.
|
21
|
+
email: gamelinks007@gmail.com
|
22
|
+
rubygems_user: S_H_
|
23
|
+
slideshare_user:
|
24
|
+
speaker_deck_user:
|
@@ -0,0 +1,169 @@
|
|
1
|
+
# Rubyのリテラルオブジェクト生成をparse.yから卒業させる
|
2
|
+
|
3
|
+
author
|
4
|
+
: S.H.
|
5
|
+
theme
|
6
|
+
: lightning-simple
|
7
|
+
content_source
|
8
|
+
: Fukuoka.rb #333 Ninja Talk 大会
|
9
|
+
|
10
|
+
# 自己紹介
|
11
|
+
|
12
|
+
* S.H.
|
13
|
+
* 永和システムマネジメント
|
14
|
+
アジャイル事業部所属 & 構文解析研究部員
|
15
|
+
* Hamada.rb
|
16
|
+
* 時々Rubyにパッチを投げてます
|
17
|
+
|
18
|
+
# 話すこと
|
19
|
+
|
20
|
+
* リテラルオブジェクトの生成をparse.y以外でしたい背景
|
21
|
+
* リテラルオブジェクトの生成をparse.y以外でさせる方法
|
22
|
+
* 今後の対応
|
23
|
+
|
24
|
+
# 背景(1)
|
25
|
+
|
26
|
+
* Numeric などのリテラルが parse.y で Ruby のオブジェクトとして生成されている
|
27
|
+
* Ruby のオブジェクトを作っているので GC から離せない
|
28
|
+
* parse.y を Universal Parser として扱うためには C API を自前で用意する必要がある
|
29
|
+
|
30
|
+
# 背景(2)
|
31
|
+
|
32
|
+
* リテラルの生成を別の場所へ移行できれば
|
33
|
+
* GC との切り離しができる
|
34
|
+
* Universal Parser の C API への依存を減らすことができる
|
35
|
+
|
36
|
+
# 背景(3)
|
37
|
+
|
38
|
+
* より詳しい話は [Ruby Parser開発日誌 (10) - parse.y リファクタリングチャレンジ はじめました](https://yui-knk.hatenablog.com/entry/2023/06/18/162100)
|
39
|
+
|
40
|
+
# 対応方法(ex: Numeric)
|
41
|
+
|
42
|
+
* `rubyparser.h`にリテラルの生成に必要な構造体を追加
|
43
|
+
* `compile.c`で、その構造体を使ってリテラルを生成する
|
44
|
+
* `parse.y`で構造体を使って値をセットする
|
45
|
+
|
46
|
+
# `rubyparser.h`に構造体を追加
|
47
|
+
|
48
|
+
```c
|
49
|
+
enum rb_literal_type {
|
50
|
+
integer_literal,
|
51
|
+
float_literal,
|
52
|
+
rational_literal
|
53
|
+
};
|
54
|
+
```
|
55
|
+
|
56
|
+
# `rubyparser.h`に構造体を追加
|
57
|
+
|
58
|
+
```c
|
59
|
+
typedef struct rb_numeric_literal_info {
|
60
|
+
int tminus;
|
61
|
+
int base;
|
62
|
+
int seen_point;
|
63
|
+
int is_imaginary;
|
64
|
+
} rb_numeric_literal_info_t;
|
65
|
+
```
|
66
|
+
|
67
|
+
# `rubyparser.h`に構造体を追加
|
68
|
+
|
69
|
+
```c
|
70
|
+
typedef struct rb_literal_struct {
|
71
|
+
char *val;
|
72
|
+
enum rb_literal_type type;
|
73
|
+
rb_numeric_literal_info_t numeric_literal_info;
|
74
|
+
} rb_literal_t;
|
75
|
+
```
|
76
|
+
|
77
|
+
# `rubyparser.h`に構造体を追加
|
78
|
+
|
79
|
+
```c
|
80
|
+
typedef struct RNode_LIT {
|
81
|
+
NODE node;
|
82
|
+
VALUE nd_lit;
|
83
|
+
VALUE not_used;
|
84
|
+
VALUE not_used2;
|
85
|
+
rb_literal_t *literal;
|
86
|
+
} rb_node_lit_t;
|
87
|
+
```
|
88
|
+
|
89
|
+
# `compile.c`でリテラルを生成
|
90
|
+
|
91
|
+
```c
|
92
|
+
VALUE
|
93
|
+
rb_compile_numeric_literal(rb_literal_t *literal)
|
94
|
+
{
|
95
|
+
if (literal->type == integer_literal) {
|
96
|
+
return rb_compile_integer_literal(literal);
|
97
|
+
} else if (literal->type == float_literal) {
|
98
|
+
return rb_compile_float_literal(literal);
|
99
|
+
} else if (literal->type == rational_literal) {
|
100
|
+
return rb_compile_rational_literal(literal);
|
101
|
+
}
|
102
|
+
return 0;
|
103
|
+
}
|
104
|
+
```
|
105
|
+
|
106
|
+
# `compile.c`でリテラルを生成
|
107
|
+
|
108
|
+
```c
|
109
|
+
static VALUE
|
110
|
+
rb_compile_integer_literal(rb_literal_t *literal)
|
111
|
+
{
|
112
|
+
VALUE lit = rb_cstr_to_inum(literal->val, literal->numeric_literal_info.base, FALSE);
|
113
|
+
return compile_numeric_literal(literal, lit);
|
114
|
+
}
|
115
|
+
```
|
116
|
+
|
117
|
+
# `compile.c`でリテラルを生成
|
118
|
+
|
119
|
+
```c
|
120
|
+
static VALUE
|
121
|
+
compile_numeric_literal(rb_literal_t *literal, VALUE val)
|
122
|
+
{
|
123
|
+
if (literal->numeric_literal_info.tminus) {
|
124
|
+
val = compile_negative_numeric(val);
|
125
|
+
}
|
126
|
+
if (literal->numeric_literal_info.is_imaginary) {
|
127
|
+
val = rb_complex_raw(INT2FIX(0), val);
|
128
|
+
}
|
129
|
+
return val;
|
130
|
+
}
|
131
|
+
```
|
132
|
+
|
133
|
+
|
134
|
+
# `parse.y`で構造体に値をセット
|
135
|
+
|
136
|
+
```c
|
137
|
+
static enum yytokentype
|
138
|
+
set_number_literal(struct parser_params *p, enum yytokentype type, int suffix, int base, int seen_point)
|
139
|
+
{
|
140
|
+
/* ... */
|
141
|
+
rb_literal_t *literal = malloc(sizeof(rb_literal_t));
|
142
|
+
literal->val = strdup(tok(p));
|
143
|
+
literal->numeric_literal_info.tminus = FALSE;
|
144
|
+
literal->numeric_literal_info.base = base;
|
145
|
+
literal->numeric_literal_info.seen_point = seen_point;
|
146
|
+
literal->numeric_literal_info.is_imaginary = FALSE;
|
147
|
+
literal->numeric_literal_info.is_tokenline = FALSE;
|
148
|
+
/* ... */
|
149
|
+
}
|
150
|
+
```
|
151
|
+
|
152
|
+
# できたもの
|
153
|
+
|
154
|
+
* [[WIP] Introduce rb_literal_t struct for purge literal generation in parse.y](https://github.com/S-H-GAMELINKS/ruby/pull/33)
|
155
|
+
|
156
|
+
![PR](./img/pr.png)
|
157
|
+
|
158
|
+
# 対応状況
|
159
|
+
|
160
|
+
* Numeric(Fixnum, Bignum, Float, Rational, Complex) は対応完了
|
161
|
+
* Symbol は一部対応
|
162
|
+
* そのほか細々としたものにも対応中
|
163
|
+
|
164
|
+
# 今後の対応
|
165
|
+
|
166
|
+
* Ractor 周りでのリテラルオブジェクトの処理
|
167
|
+
* NODE_STR などから NODE_LIT へ変換している箇所の対応がまだ
|
168
|
+
* とりあえず動くレベルなのでコードの整理をしたい
|
169
|
+
|
data/img/pr.png
ADDED
Binary file
|
Binary file
|
metadata
ADDED
@@ -0,0 +1,63 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: rabbit-slide-S_H_-graduating-ruby-literal-object-generation-from-parsey
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 1.0.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- S.H.
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2023-11-29 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rabbit
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: 2.0.2
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: 2.0.2
|
27
|
+
description: 'Fukuoka.rb #333 Ninja Talk 大会で話した「Rubyのリテラルオブジェクト生成をparse.yから卒業させる」のスライドです。'
|
28
|
+
email:
|
29
|
+
- gamelinks007@gmail.com
|
30
|
+
executables: []
|
31
|
+
extensions: []
|
32
|
+
extra_rdoc_files: []
|
33
|
+
files:
|
34
|
+
- ".rabbit"
|
35
|
+
- README.md
|
36
|
+
- Rakefile
|
37
|
+
- config.yaml
|
38
|
+
- graduating-ruby-literal-object-generation-from-parsey.md
|
39
|
+
- img/pr.png
|
40
|
+
- pdf/graduating-ruby-literal-object-generation-from-parsey-slide.pdf
|
41
|
+
homepage: https://slide.rabbit-shocker.org/authors/S_H_/graduating-ruby-literal-object-generation-from-parsey/
|
42
|
+
licenses: []
|
43
|
+
metadata: {}
|
44
|
+
post_install_message:
|
45
|
+
rdoc_options: []
|
46
|
+
require_paths:
|
47
|
+
- lib
|
48
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
49
|
+
requirements:
|
50
|
+
- - ">="
|
51
|
+
- !ruby/object:Gem::Version
|
52
|
+
version: '0'
|
53
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
54
|
+
requirements:
|
55
|
+
- - ">="
|
56
|
+
- !ruby/object:Gem::Version
|
57
|
+
version: '0'
|
58
|
+
requirements: []
|
59
|
+
rubygems_version: 3.5.0.dev
|
60
|
+
signing_key:
|
61
|
+
specification_version: 4
|
62
|
+
summary: Rubyのリテラルオブジェクト生成をparse.yから卒業させる
|
63
|
+
test_files: []
|