summaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authordearblue <[email protected]>2021-08-28 15:52:37 +0900
committerdearblue <[email protected]>2021-08-28 15:52:37 +0900
commitc9f7bcc0cfc3bf27a5906f617c0a32b179d31cc4 (patch)
tree313bc7719eaec31e14595d98f9ea50fa5dfc28f7 /src
parent07f12fe890738688da917cfdc75a95be2bea2e26 (diff)
downloadmruby-c9f7bcc0cfc3bf27a5906f617c0a32b179d31cc4.tar.gz
mruby-c9f7bcc0cfc3bf27a5906f617c0a32b179d31cc4.zip
Integrate the processing of similar specifiers of `mrb_get_args()`
It is `o`, `C`, `S`, `A` and `H` specifiers that are integrated. As a side effect, the `C!` Specifier can now be used.
Diffstat (limited to 'src')
-rw-r--r--src/class.c62
1 files changed, 12 insertions, 50 deletions
diff --git a/src/class.c b/src/class.c
index 316f61798..a4a2f90e3 100644
--- a/src/class.c
+++ b/src/class.c
@@ -877,7 +877,7 @@ void mrb_hash_check_kdict(mrb_state *mrb, mrb_value self);
string mruby type C type note
----------------------------------------------------------------------------------------------
o: Object [mrb_value]
- C: Class/Module [mrb_value]
+ C: Class/Module [mrb_value] when ! follows, the value may be nil
S: String [mrb_value] when ! follows, the value may be nil
A: Array [mrb_value] when ! follows, the value may be nil
H: Hash [mrb_value] when ! follows, the value may be nil
@@ -1015,22 +1015,23 @@ mrb_get_args(mrb_state *mrb, const char *format, ...)
switch (c) {
case 'o':
- {
- mrb_value *p;
-
- p = va_arg(ap, mrb_value*);
- if (pickarg) {
- *p = *pickarg;
- }
- }
- break;
case 'C':
+ case 'S':
+ case 'A':
+ case 'H':
{
mrb_value *p;
p = va_arg(ap, mrb_value*);
if (pickarg) {
- ensure_class_type(mrb, *pickarg);
+ if (!(altmode && mrb_nil_p(*pickarg))) {
+ switch (c) {
+ case 'C': ensure_class_type(mrb, *pickarg); break;
+ case 'S': mrb_ensure_string_type(mrb, *pickarg); break;
+ case 'A': mrb_ensure_array_type(mrb, *pickarg); break;
+ case 'H': mrb_ensure_hash_type(mrb, *pickarg); break;
+ }
+ }
*p = *pickarg;
}
}
@@ -1046,45 +1047,6 @@ mrb_get_args(mrb_state *mrb, const char *format, ...)
}
}
break;
- case 'S':
- {
- mrb_value *p;
-
- p = va_arg(ap, mrb_value*);
- if (pickarg) {
- if (!(altmode && mrb_nil_p(*pickarg))) {
- mrb_ensure_string_type(mrb, *pickarg);
- }
- *p = *pickarg;
- }
- }
- break;
- case 'A':
- {
- mrb_value *p;
-
- p = va_arg(ap, mrb_value*);
- if (pickarg) {
- if (!(altmode && mrb_nil_p(*pickarg))) {
- mrb_ensure_array_type(mrb, *pickarg);
- }
- *p = *pickarg;
- }
- }
- break;
- case 'H':
- {
- mrb_value *p;
-
- p = va_arg(ap, mrb_value*);
- if (pickarg) {
- if (!(altmode && mrb_nil_p(*pickarg))) {
- mrb_ensure_hash_type(mrb, *pickarg);
- }
- *p = *pickarg;
- }
- }
- break;
case 's':
{
const char **ps = 0;