Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
M
mruby
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
Libraries
mruby
Commits
61f49690
Commit
61f49690
authored
Nov 15, 2018
by
Yukihiro "Matz" Matsumoto
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Remove `filename`&`lines` from `mrb_irep` struct.
This patch slightly reduce memory consumption (2% for my test).
parent
1bea1e20
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
30 additions
and
188 deletions
+30
-188
include/mruby/debug.h
include/mruby/debug.h
+3
-2
include/mruby/irep.h
include/mruby/irep.h
+0
-3
mrbgems/mruby-compiler/core/codegen.c
mrbgems/mruby-compiler/core/codegen.c
+8
-30
src/debug.c
src/debug.c
+15
-17
src/dump.c
src/dump.c
+3
-122
src/load.c
src/load.c
+1
-9
src/state.c
src/state.c
+0
-5
No files found.
include/mruby/debug.h
View file @
61f49690
...
...
@@ -55,10 +55,11 @@ MRB_API const char *mrb_debug_get_filename(mrb_irep *irep, ptrdiff_t pc);
*/
MRB_API
int32_t
mrb_debug_get_line
(
mrb_irep
*
irep
,
ptrdiff_t
pc
);
MRB_API
mrb_irep_debug_info
*
mrb_debug_info_alloc
(
mrb_state
*
mrb
,
mrb_irep
*
irep
);
MRB_API
mrb_irep_debug_info_file
*
mrb_debug_info_append_file
(
mrb_state
*
mrb
,
mrb_irep
*
irep
,
mrb_state
*
mrb
,
mrb_irep_debug_info
*
info
,
const
char
*
filename
,
uint16_t
*
lines
,
uint32_t
start_pos
,
uint32_t
end_pos
);
MRB_API
mrb_irep_debug_info
*
mrb_debug_info_alloc
(
mrb_state
*
mrb
,
mrb_irep
*
irep
);
MRB_API
void
mrb_debug_info_free
(
mrb_state
*
mrb
,
mrb_irep_debug_info
*
d
);
MRB_END_DECL
...
...
include/mruby/irep.h
View file @
61f49690
...
...
@@ -39,9 +39,6 @@ typedef struct mrb_irep {
struct
mrb_locals
*
lv
;
/* debug info */
mrb_bool
own_filename
;
const
char
*
filename
;
uint16_t
*
lines
;
struct
mrb_irep_debug_info
*
debug_info
;
uint16_t
ilen
,
plen
,
slen
,
rlen
;
...
...
mrbgems/mruby-compiler/core/codegen.c
View file @
61f49690
...
...
@@ -124,15 +124,6 @@ codegen_palloc(codegen_scope *s, size_t len)
return
p
;
}
static
void
*
codegen_malloc
(
codegen_scope
*
s
,
size_t
len
)
{
void
*
p
=
mrb_malloc_simple
(
s
->
mrb
,
len
);
if
(
!
p
)
codegen_error
(
s
,
"mrb_malloc"
);
return
p
;
}
static
void
*
codegen_realloc
(
codegen_scope
*
s
,
void
*
p
,
size_t
len
)
{
...
...
@@ -162,7 +153,6 @@ emit_B(codegen_scope *s, uint32_t pc, uint8_t i)
s
->
iseq
=
(
mrb_code
*
)
codegen_realloc
(
s
,
s
->
iseq
,
sizeof
(
mrb_code
)
*
s
->
icapa
);
if
(
s
->
lines
)
{
s
->
lines
=
(
uint16_t
*
)
codegen_realloc
(
s
,
s
->
lines
,
sizeof
(
uint16_t
)
*
s
->
icapa
);
s
->
irep
->
lines
=
s
->
lines
;
}
}
if
(
s
->
lines
)
{
...
...
@@ -1371,8 +1361,10 @@ codegen(codegen_scope *s, node *tree, int val)
codegen_error
(
s
,
"too complex expression"
);
}
if
(
s
->
irep
&&
s
->
filename_index
!=
tree
->
filename_index
)
{
s
->
irep
->
filename
=
mrb_parser_get_filename
(
s
->
parser
,
s
->
filename_index
);
mrb_debug_info_append_file
(
s
->
mrb
,
s
->
irep
,
s
->
debug_start_pos
,
s
->
pc
);
const
char
*
filename
=
mrb_parser_get_filename
(
s
->
parser
,
s
->
filename_index
);
mrb_debug_info_append_file
(
s
->
mrb
,
s
->
irep
->
debug_info
,
filename
,
s
->
lines
,
s
->
debug_start_pos
,
s
->
pc
);
s
->
debug_start_pos
=
s
->
pc
;
s
->
filename_index
=
tree
->
filename_index
;
s
->
filename
=
mrb_parser_get_filename
(
s
->
parser
,
tree
->
filename_index
);
...
...
@@ -2965,8 +2957,6 @@ scope_new(mrb_state *mrb, codegen_scope *prev, node *lv)
p
->
debug_start_pos
=
0
;
if
(
p
->
filename
)
{
mrb_debug_info_alloc
(
mrb
,
p
->
irep
);
p
->
irep
->
filename
=
p
->
filename
;
p
->
irep
->
lines
=
p
->
lines
;
}
else
{
p
->
irep
->
debug_info
=
NULL
;
...
...
@@ -2984,34 +2974,22 @@ scope_finish(codegen_scope *s)
{
mrb_state
*
mrb
=
s
->
mrb
;
mrb_irep
*
irep
=
s
->
irep
;
size_t
fname_len
;
char
*
fname
;
irep
->
flags
=
0
;
if
(
s
->
iseq
)
{
irep
->
iseq
=
(
mrb_code
*
)
codegen_realloc
(
s
,
s
->
iseq
,
sizeof
(
mrb_code
)
*
s
->
pc
);
irep
->
ilen
=
s
->
pc
;
if
(
s
->
lines
)
{
irep
->
lines
=
(
uint16_t
*
)
codegen_realloc
(
s
,
s
->
lines
,
sizeof
(
uint16_t
)
*
s
->
pc
);
}
else
{
irep
->
lines
=
0
;
}
}
irep
->
pool
=
(
mrb_value
*
)
codegen_realloc
(
s
,
irep
->
pool
,
sizeof
(
mrb_value
)
*
irep
->
plen
);
irep
->
syms
=
(
mrb_sym
*
)
codegen_realloc
(
s
,
irep
->
syms
,
sizeof
(
mrb_sym
)
*
irep
->
slen
);
irep
->
reps
=
(
mrb_irep
**
)
codegen_realloc
(
s
,
irep
->
reps
,
sizeof
(
mrb_irep
*
)
*
irep
->
rlen
);
if
(
s
->
filename
)
{
irep
->
filename
=
mrb_parser_get_filename
(
s
->
parser
,
s
->
filename_index
);
mrb_debug_info_append_file
(
mrb
,
irep
,
s
->
debug_start_pos
,
s
->
pc
);
const
char
*
filename
=
mrb_parser_get_filename
(
s
->
parser
,
s
->
filename_index
);
fname_len
=
strlen
(
s
->
filename
);
fname
=
(
char
*
)
codegen_malloc
(
s
,
fname_len
+
1
);
memcpy
(
fname
,
s
->
filename
,
fname_len
);
fname
[
fname_len
]
=
'\0'
;
irep
->
filename
=
fname
;
irep
->
own_filename
=
TRUE
;
mrb_debug_info_append_file
(
s
->
mrb
,
s
->
irep
->
debug_info
,
filename
,
s
->
lines
,
s
->
debug_start_pos
,
s
->
pc
);
}
mrb_free
(
s
->
mrb
,
s
->
lines
);
irep
->
nlocals
=
s
->
nlocals
;
irep
->
nregs
=
s
->
nregs
;
...
...
src/debug.c
View file @
61f49690
...
...
@@ -55,7 +55,7 @@ mrb_debug_get_filename(mrb_irep *irep, ptrdiff_t pc)
{
if
(
irep
&&
pc
>=
0
&&
pc
<
irep
->
ilen
)
{
mrb_irep_debug_info_file
*
f
=
NULL
;
if
(
!
irep
->
debug_info
)
{
return
irep
->
filename
;
}
if
(
!
irep
->
debug_info
)
return
NULL
;
else
if
((
f
=
get_file
(
irep
->
debug_info
,
(
uint32_t
)
pc
)))
{
return
f
->
filename
;
}
...
...
@@ -69,7 +69,7 @@ mrb_debug_get_line(mrb_irep *irep, ptrdiff_t pc)
if
(
irep
&&
pc
>=
0
&&
pc
<
irep
->
ilen
)
{
mrb_irep_debug_info_file
*
f
=
NULL
;
if
(
!
irep
->
debug_info
)
{
return
irep
->
lines
?
irep
->
lines
[
pc
]
:
-
1
;
return
-
1
;
}
else
if
((
f
=
get_file
(
irep
->
debug_info
,
(
uint32_t
)
pc
)))
{
switch
(
f
->
line_type
)
{
...
...
@@ -122,24 +122,22 @@ mrb_debug_info_alloc(mrb_state *mrb, mrb_irep *irep)
}
MRB_API
mrb_irep_debug_info_file
*
mrb_debug_info_append_file
(
mrb_state
*
mrb
,
mrb_irep
*
irep
,
mrb_debug_info_append_file
(
mrb_state
*
mrb
,
mrb_irep_debug_info
*
info
,
const
char
*
filename
,
uint16_t
*
lines
,
uint32_t
start_pos
,
uint32_t
end_pos
)
{
mrb_irep_debug_info
*
info
;
mrb_irep_debug_info_file
*
ret
;
uint32_t
file_pc_count
;
size_t
fn_len
;
mrb_int
len
;
uint32_t
i
;
if
(
!
i
rep
->
debug_i
nfo
)
{
return
NULL
;
}
if
(
!
info
)
{
return
NULL
;
}
mrb_assert
(
irep
->
filename
);
mrb_assert
(
irep
->
lines
);
mrb_assert
(
filename
);
mrb_assert
(
lines
);
info
=
irep
->
debug_info
;
if
(
info
->
flen
>
0
&&
strcmp
(
irep
->
filename
,
info
->
files
[
info
->
flen
-
1
]
->
filename
)
==
0
)
{
if
(
info
->
flen
>
0
&&
strcmp
(
filename
,
info
->
files
[
info
->
flen
-
1
]
->
filename
)
==
0
)
{
return
NULL
;
}
...
...
@@ -156,12 +154,12 @@ mrb_debug_info_append_file(mrb_state *mrb, mrb_irep *irep,
ret
->
start_pos
=
start_pos
;
info
->
pc_count
=
end_pos
;
fn_len
=
strlen
(
irep
->
filename
);
ret
->
filename_sym
=
mrb_intern
(
mrb
,
irep
->
filename
,
fn_len
);
fn_len
=
strlen
(
filename
);
ret
->
filename_sym
=
mrb_intern
(
mrb
,
filename
,
fn_len
);
len
=
0
;
ret
->
filename
=
mrb_sym2name_len
(
mrb
,
ret
->
filename_sym
,
&
len
);
ret
->
line_type
=
select_line_type
(
irep
->
lines
+
start_pos
,
end_pos
-
start_pos
);
ret
->
line_type
=
select_line_type
(
lines
+
start_pos
,
end_pos
-
start_pos
);
ret
->
lines
.
ptr
=
NULL
;
switch
(
ret
->
line_type
)
{
...
...
@@ -169,7 +167,7 @@ mrb_debug_info_append_file(mrb_state *mrb, mrb_irep *irep,
ret
->
line_entry_count
=
file_pc_count
;
ret
->
lines
.
ary
=
(
uint16_t
*
)
mrb_malloc
(
mrb
,
sizeof
(
uint16_t
)
*
file_pc_count
);
for
(
i
=
0
;
i
<
file_pc_count
;
++
i
)
{
ret
->
lines
.
ary
[
i
]
=
irep
->
lines
[
start_pos
+
i
];
ret
->
lines
.
ary
[
i
]
=
lines
[
start_pos
+
i
];
}
break
;
...
...
@@ -179,18 +177,18 @@ mrb_debug_info_append_file(mrb_state *mrb, mrb_irep *irep,
ret
->
lines
.
flat_map
=
(
mrb_irep_debug_info_line
*
)
mrb_malloc
(
mrb
,
sizeof
(
mrb_irep_debug_info_line
)
*
1
);
ret
->
line_entry_count
=
0
;
for
(
i
=
0
;
i
<
file_pc_count
;
++
i
)
{
if
(
irep
->
lines
[
start_pos
+
i
]
==
prev_line
)
{
continue
;
}
if
(
lines
[
start_pos
+
i
]
==
prev_line
)
{
continue
;
}
ret
->
lines
.
flat_map
=
(
mrb_irep_debug_info_line
*
)
mrb_realloc
(
mrb
,
ret
->
lines
.
flat_map
,
sizeof
(
mrb_irep_debug_info_line
)
*
(
ret
->
line_entry_count
+
1
));
m
.
start_pos
=
start_pos
+
i
;
m
.
line
=
irep
->
lines
[
start_pos
+
i
];
m
.
line
=
lines
[
start_pos
+
i
];
ret
->
lines
.
flat_map
[
ret
->
line_entry_count
]
=
m
;
/* update */
++
ret
->
line_entry_count
;
prev_line
=
irep
->
lines
[
start_pos
+
i
];
prev_line
=
lines
[
start_pos
+
i
];
}
}
break
;
...
...
src/dump.c
View file @
61f49690
...
...
@@ -353,118 +353,6 @@ write_section_irep(mrb_state *mrb, mrb_irep *irep, uint8_t *bin, size_t *len_p,
return
MRB_DUMP_OK
;
}
static
int
write_section_lineno_header
(
mrb_state
*
mrb
,
size_t
section_size
,
uint8_t
*
bin
)
{
struct
rite_section_lineno_header
*
header
=
(
struct
rite_section_lineno_header
*
)
bin
;
memcpy
(
header
->
section_ident
,
RITE_SECTION_LINENO_IDENT
,
sizeof
(
header
->
section_ident
));
uint32_to_bin
((
uint32_t
)
section_size
,
header
->
section_size
);
return
MRB_DUMP_OK
;
}
static
size_t
get_lineno_record_size
(
mrb_state
*
mrb
,
mrb_irep
*
irep
)
{
size_t
size
=
0
;
size
+=
sizeof
(
uint32_t
);
/* record size */
size
+=
sizeof
(
uint16_t
);
/* filename size */
if
(
irep
->
filename
)
{
size
+=
strlen
(
irep
->
filename
);
/* filename */
}
size
+=
sizeof
(
uint32_t
);
/* niseq */
if
(
irep
->
lines
)
{
size
+=
sizeof
(
uint16_t
)
*
irep
->
ilen
;
/* lineno */
}
return
size
;
}
static
size_t
write_lineno_record_1
(
mrb_state
*
mrb
,
mrb_irep
*
irep
,
uint8_t
*
bin
)
{
uint8_t
*
cur
=
bin
;
int
iseq_no
;
size_t
filename_len
;
ptrdiff_t
diff
;
cur
+=
sizeof
(
uint32_t
);
/* record size */
if
(
irep
->
filename
)
{
filename_len
=
strlen
(
irep
->
filename
);
}
else
{
filename_len
=
0
;
}
mrb_assert_int_fit
(
size_t
,
filename_len
,
uint16_t
,
UINT16_MAX
);
cur
+=
uint16_to_bin
((
uint16_t
)
filename_len
,
cur
);
/* filename size */
if
(
filename_len
)
{
memcpy
(
cur
,
irep
->
filename
,
filename_len
);
cur
+=
filename_len
;
/* filename */
}
if
(
irep
->
lines
)
{
mrb_assert_int_fit
(
size_t
,
irep
->
ilen
,
uint32_t
,
UINT32_MAX
);
cur
+=
uint32_to_bin
((
uint32_t
)(
irep
->
ilen
),
cur
);
/* niseq */
for
(
iseq_no
=
0
;
iseq_no
<
irep
->
ilen
;
iseq_no
++
)
{
cur
+=
uint16_to_bin
(
irep
->
lines
[
iseq_no
],
cur
);
/* opcode */
}
}
else
{
cur
+=
uint32_to_bin
(
0
,
cur
);
/* niseq */
}
diff
=
cur
-
bin
;
mrb_assert_int_fit
(
ptrdiff_t
,
diff
,
uint32_t
,
UINT32_MAX
);
uint32_to_bin
((
uint32_t
)
diff
,
bin
);
/* record size */
mrb_assert_int_fit
(
ptrdiff_t
,
diff
,
size_t
,
SIZE_MAX
);
return
(
size_t
)
diff
;
}
static
size_t
write_lineno_record
(
mrb_state
*
mrb
,
mrb_irep
*
irep
,
uint8_t
*
bin
)
{
size_t
rlen
,
size
=
0
;
int
i
;
rlen
=
write_lineno_record_1
(
mrb
,
irep
,
bin
);
bin
+=
rlen
;
size
+=
rlen
;
for
(
i
=
0
;
i
<
irep
->
rlen
;
i
++
)
{
rlen
=
write_lineno_record
(
mrb
,
irep
,
bin
);
bin
+=
rlen
;
size
+=
rlen
;
}
return
size
;
}
static
int
write_section_lineno
(
mrb_state
*
mrb
,
mrb_irep
*
irep
,
uint8_t
*
bin
)
{
size_t
section_size
=
0
;
size_t
rlen
=
0
;
/* size of irep record */
uint8_t
*
cur
=
bin
;
if
(
mrb
==
NULL
||
bin
==
NULL
)
{
return
MRB_DUMP_INVALID_ARGUMENT
;
}
cur
+=
sizeof
(
struct
rite_section_lineno_header
);
section_size
+=
sizeof
(
struct
rite_section_lineno_header
);
rlen
=
write_lineno_record
(
mrb
,
irep
,
cur
);
section_size
+=
rlen
;
write_section_lineno_header
(
mrb
,
section_size
,
bin
);
return
MRB_DUMP_OK
;
}
static
size_t
get_debug_record_size
(
mrb_state
*
mrb
,
mrb_irep
*
irep
)
{
...
...
@@ -911,10 +799,6 @@ dump_irep(mrb_state *mrb, mrb_irep *irep, uint8_t flags, uint8_t **bin, size_t *
section_lineno_size
+=
get_debug_record_size
(
mrb
,
irep
);
}
else
{
section_lineno_size
+=
sizeof
(
struct
rite_section_lineno_header
);
section_lineno_size
+=
get_lineno_record_size
(
mrb
,
irep
);
}
}
if
(
lv_defined
)
{
...
...
@@ -942,12 +826,9 @@ dump_irep(mrb_state *mrb, mrb_irep *irep, uint8_t flags, uint8_t **bin, size_t *
if
(
flags
&
DUMP_DEBUG_INFO
)
{
if
(
debug_info_defined
)
{
result
=
write_section_debug
(
mrb
,
irep
,
cur
,
filenames
,
filenames_len
);
}
else
{
result
=
write_section_lineno
(
mrb
,
irep
,
cur
);
}
if
(
result
!=
MRB_DUMP_OK
)
{
goto
error_exit
;
if
(
result
!=
MRB_DUMP_OK
)
{
goto
error_exit
;
}
}
cur
+=
section_lineno_size
;
}
...
...
src/load.c
View file @
61f49690
...
...
@@ -215,12 +215,11 @@ read_section_irep(mrb_state *mrb, const uint8_t *bin, uint8_t flags)
return
read_irep_record
(
mrb
,
bin
,
&
len
,
flags
);
}
/* ignore lineno record */
static
int
read_lineno_record_1
(
mrb_state
*
mrb
,
const
uint8_t
*
bin
,
mrb_irep
*
irep
,
size_t
*
len
)
{
size_t
i
,
fname_len
,
niseq
;
char
*
fname
;
uint16_t
*
lines
;
*
len
=
0
;
bin
+=
sizeof
(
uint32_t
);
/* record size */
...
...
@@ -228,9 +227,6 @@ read_lineno_record_1(mrb_state *mrb, const uint8_t *bin, mrb_irep *irep, size_t
fname_len
=
bin_to_uint16
(
bin
);
bin
+=
sizeof
(
uint16_t
);
*
len
+=
sizeof
(
uint16_t
);
fname
=
(
char
*
)
mrb_malloc
(
mrb
,
fname_len
+
1
);
memcpy
(
fname
,
bin
,
fname_len
);
fname
[
fname_len
]
=
'\0'
;
bin
+=
fname_len
;
*
len
+=
fname_len
;
...
...
@@ -241,15 +237,11 @@ read_lineno_record_1(mrb_state *mrb, const uint8_t *bin, mrb_irep *irep, size_t
if
(
SIZE_ERROR_MUL
(
niseq
,
sizeof
(
uint16_t
)))
{
return
MRB_DUMP_GENERAL_FAILURE
;
}
lines
=
(
uint16_t
*
)
mrb_malloc
(
mrb
,
niseq
*
sizeof
(
uint16_t
));
for
(
i
=
0
;
i
<
niseq
;
i
++
)
{
lines
[
i
]
=
bin_to_uint16
(
bin
);
bin
+=
sizeof
(
uint16_t
);
/* niseq */
*
len
+=
sizeof
(
uint16_t
);
}
irep
->
filename
=
fname
;
irep
->
lines
=
lines
;
return
MRB_DUMP_OK
;
}
...
...
src/state.c
View file @
61f49690
...
...
@@ -168,10 +168,6 @@ mrb_irep_free(mrb_state *mrb, mrb_irep *irep)
}
mrb_free
(
mrb
,
irep
->
reps
);
mrb_free
(
mrb
,
irep
->
lv
);
if
(
irep
->
own_filename
)
{
mrb_free
(
mrb
,
(
void
*
)
irep
->
filename
);
}
mrb_free
(
mrb
,
irep
->
lines
);
mrb_debug_info_free
(
mrb
,
irep
->
debug_info
);
mrb_free
(
mrb
,
irep
);
}
...
...
@@ -273,7 +269,6 @@ mrb_add_irep(mrb_state *mrb)
irep
=
(
mrb_irep
*
)
mrb_malloc
(
mrb
,
sizeof
(
mrb_irep
));
*
irep
=
mrb_irep_zero
;
irep
->
refcnt
=
1
;
irep
->
own_filename
=
FALSE
;
return
irep
;
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment