-
Notifications
You must be signed in to change notification settings - Fork 10
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Showing
6 changed files
with
326 additions
and
309 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -2,6 +2,12 @@ | |
|
||
## Releases | ||
|
||
### Version 0.13.1 | ||
|
||
#### Bugfixes | ||
|
||
* Fixed documentation | ||
|
||
### Version 0.13.0 | ||
|
||
#### Features | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,5 @@ | ||
name: anyolite | ||
version: 0.13.0 | ||
version: 0.13.1 | ||
|
||
authors: | ||
- Hadeweka | ||
|
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,32 +1,34 @@ | ||
module Anyolite | ||
module Macro | ||
macro format_string(args, context = nil) | ||
{% if args %} | ||
{% required_counter = 0 %} | ||
{% optional_counter = 0 %} | ||
{% optional_args = false %} | ||
{% if flag?(:anyolite_implementation_ruby_3) %} | ||
module Anyolite | ||
module Macro | ||
macro format_string(args, context = nil) | ||
{% if args %} | ||
{% required_counter = 0 %} | ||
{% optional_counter = 0 %} | ||
{% optional_args = false %} | ||
|
||
{% for arg in args %} | ||
{% if arg.is_a?(TypeDeclaration) %} | ||
{% if arg.value || optional_args %} | ||
{% optional_counter += 1 %} | ||
{% optional_args = true %} | ||
{% for arg in args %} | ||
{% if arg.is_a?(TypeDeclaration) %} | ||
{% if arg.value || optional_args %} | ||
{% optional_counter += 1 %} | ||
{% optional_args = true %} | ||
{% else %} | ||
{% required_counter += 1 %} | ||
{% end %} | ||
{% else %} | ||
{% required_counter += 1 %} | ||
{% end %} | ||
{% else %} | ||
{% if optional_args %} | ||
{% optional_counter += 1 %} | ||
{% else %} | ||
{% required_counter += 1 %} | ||
{% if optional_args %} | ||
{% optional_counter += 1 %} | ||
{% else %} | ||
{% required_counter += 1 %} | ||
{% end %} | ||
{% end %} | ||
{% end %} | ||
{% end %} | ||
|
||
"{{required_counter}}{{optional_counter > 0 ? optional_counter : "".id}}" | ||
{% else %} | ||
"" | ||
{% end %} | ||
"{{required_counter}}{{optional_counter > 0 ? optional_counter : "".id}}" | ||
{% else %} | ||
"" | ||
{% end %} | ||
end | ||
end | ||
end | ||
end | ||
{% end %} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,99 +1,101 @@ | ||
require "./RbCore.cr" | ||
require "./FormatString.cr" | ||
{% if flag?(:anyolite_implementation_ruby_3) %} | ||
require "./RbCore.cr" | ||
require "./FormatString.cr" | ||
|
||
{% if !flag?(:use_general_object_format_chars) %} | ||
{% raise "Flag 'use_general_object_format_chars' needs to be set for a working MRI implementation" %} | ||
{% end %} | ||
{% if !flag?(:use_general_object_format_chars) %} | ||
{% raise "Flag 'use_general_object_format_chars' needs to be set for a working MRI implementation" %} | ||
{% end %} | ||
|
||
module Anyolite | ||
module Macro | ||
macro new_rb_func(&b) | ||
Anyolite::RbCore::RbFunc.new do |_argc, _argv, _obj| | ||
_rb = Pointer(Anyolite::RbCore::State).null | ||
{{b.body}} | ||
module Anyolite | ||
module Macro | ||
macro new_rb_func(&b) | ||
Anyolite::RbCore::RbFunc.new do |_argc, _argv, _obj| | ||
_rb = Pointer(Anyolite::RbCore::State).null | ||
{{b.body}} | ||
end | ||
end | ||
end | ||
|
||
macro new_rb_data_func(&b) | ||
Anyolite::RbCore::RbDataFunc.new do |__ptr| | ||
__rb = Pointer(Anyolite::RbCore::State).null | ||
{{b.body}} | ||
macro new_rb_data_func(&b) | ||
Anyolite::RbCore::RbDataFunc.new do |__ptr| | ||
__rb = Pointer(Anyolite::RbCore::State).null | ||
{{b.body}} | ||
end | ||
end | ||
end | ||
|
||
macro set_default_args_for_regular_args(args, regular_arg_tuple, number_of_args) | ||
{% c = 0 %} | ||
{% if args %} | ||
{% for arg in args %} | ||
{% if arg.is_a? TypeDeclaration %} | ||
{% if arg.value %} | ||
if {{number_of_args}} <= {{c}} && Anyolite::RbCast.check_for_nil({{regular_arg_tuple}}[{{c}}].value) | ||
{{regular_arg_tuple}}[{{c}}].value = Anyolite::RbCast.return_value(_rb, {{arg.value}}) | ||
end | ||
macro set_default_args_for_regular_args(args, regular_arg_tuple, number_of_args) | ||
{% c = 0 %} | ||
{% if args %} | ||
{% for arg in args %} | ||
{% if arg.is_a? TypeDeclaration %} | ||
{% if arg.value %} | ||
if {{number_of_args}} <= {{c}} && Anyolite::RbCast.check_for_nil({{regular_arg_tuple}}[{{c}}].value) | ||
{{regular_arg_tuple}}[{{c}}].value = Anyolite::RbCast.return_value(_rb, {{arg.value}}) | ||
end | ||
{% end %} | ||
{% elsif arg.is_a? Path %} | ||
# No default argument was given, so no action is required here | ||
{% else %} | ||
{% raise "Not a TypeDeclaration or a Path: #{arg} of #{arg.class_name}" %} | ||
{% end %} | ||
{% elsif arg.is_a? Path %} | ||
# No default argument was given, so no action is required here | ||
{% else %} | ||
{% raise "Not a TypeDeclaration or a Path: #{arg} of #{arg.class_name}" %} | ||
{% c += 1 %} | ||
{% end %} | ||
{% c += 1 %} | ||
{% end %} | ||
{% end %} | ||
end | ||
end | ||
|
||
macro load_args_into_vars(args, format_string, regular_arg_tuple, block_ptr = nil) | ||
{% if block_ptr %} | ||
number_of_args = Anyolite::RbCore.rb_get_args(_argc, _argv, {{format_string}}, *{{regular_arg_tuple}}, {{block_ptr}}) | ||
{% else %} | ||
number_of_args = Anyolite::RbCore.rb_get_args(_argc, _argv, {{format_string}}, *{{regular_arg_tuple}}) | ||
{% end %} | ||
macro load_args_into_vars(args, format_string, regular_arg_tuple, block_ptr = nil) | ||
{% if block_ptr %} | ||
number_of_args = Anyolite::RbCore.rb_get_args(_argc, _argv, {{format_string}}, *{{regular_arg_tuple}}, {{block_ptr}}) | ||
{% else %} | ||
number_of_args = Anyolite::RbCore.rb_get_args(_argc, _argv, {{format_string}}, *{{regular_arg_tuple}}) | ||
{% end %} | ||
|
||
Anyolite::Macro.set_default_args_for_regular_args({{args}}, {{regular_arg_tuple}}, number_of_args) | ||
end | ||
Anyolite::Macro.set_default_args_for_regular_args({{args}}, {{regular_arg_tuple}}, number_of_args) | ||
end | ||
|
||
macro load_kw_args_into_vars(regular_args, keyword_args, format_string, regular_arg_tuple, block_ptr = nil) | ||
kw_ptr = Pointer(Anyolite::RbCore::RbValue).malloc(size: 1, value: Anyolite::RbCast.return_nil) | ||
macro load_kw_args_into_vars(regular_args, keyword_args, format_string, regular_arg_tuple, block_ptr = nil) | ||
kw_ptr = Pointer(Anyolite::RbCore::RbValue).malloc(size: 1, value: Anyolite::RbCast.return_nil) | ||
|
||
{% if block_ptr %} | ||
number_of_args = Anyolite::RbCore.rb_get_args(_argc, _argv, {{format_string}}, *{{regular_arg_tuple}}, kw_ptr, {{block_ptr}}) | ||
{% else %} | ||
number_of_args = Anyolite::RbCore.rb_get_args(_argc, _argv, {{format_string}}, *{{regular_arg_tuple}}, kw_ptr) | ||
{% end %} | ||
{% if block_ptr %} | ||
number_of_args = Anyolite::RbCore.rb_get_args(_argc, _argv, {{format_string}}, *{{regular_arg_tuple}}, kw_ptr, {{block_ptr}}) | ||
{% else %} | ||
number_of_args = Anyolite::RbCore.rb_get_args(_argc, _argv, {{format_string}}, *{{regular_arg_tuple}}, kw_ptr) | ||
{% end %} | ||
|
||
# TODO: Is number_of_args for the regular arg function correct here? | ||
# TODO: Is number_of_args for the regular arg function correct here? | ||
|
||
Anyolite::Macro.set_default_args_for_regular_args({{regular_args}}, {{regular_arg_tuple}}, number_of_args) | ||
Anyolite::Macro.set_default_args_for_regular_args({{regular_args}}, {{regular_arg_tuple}}, number_of_args) | ||
|
||
# TODO: This is relatively complicated and messy, so can this be simplified? | ||
# TODO: This is relatively complicated and messy, so can this be simplified? | ||
|
||
if Anyolite::RbCast.check_for_nil(kw_ptr.value) | ||
hash_key_values = [] of String | ||
else | ||
rb_hash_key_values = Anyolite::RbCore.rb_hash_keys(_rb, kw_ptr.value) | ||
hash_key_values = Anyolite::Macro.convert_from_ruby_to_crystal(_rb, rb_hash_key_values, k : Array(String)) | ||
end | ||
if Anyolite::RbCast.check_for_nil(kw_ptr.value) | ||
hash_key_values = [] of String | ||
else | ||
rb_hash_key_values = Anyolite::RbCore.rb_hash_keys(_rb, kw_ptr.value) | ||
hash_key_values = Anyolite::Macro.convert_from_ruby_to_crystal(_rb, rb_hash_key_values, k : Array(String)) | ||
end | ||
|
||
return_hash = {} of Symbol => Anyolite::RbCore::RbValue | ||
{% for keyword_arg in keyword_args %} | ||
{% if keyword_arg.is_a? TypeDeclaration %} | ||
if hash_key_values.includes?(":{{keyword_arg.var.id}}") | ||
ruby_hash_value = Anyolite::RbCore.rb_hash_get(_rb, kw_ptr.value, Anyolite::RbCore.get_symbol_value_of_string(_rb, "{{keyword_arg.var.id}}")) | ||
return_hash[:{{keyword_arg.var.id}}] = ruby_hash_value | ||
else | ||
{% if !keyword_arg.value.is_a? Nop %} | ||
return_hash[:{{keyword_arg.var.id}}] = Anyolite::RbCast.return_value(_rb, {{keyword_arg.value}}) | ||
{% else %} | ||
Anyolite.raise_argument_error("Keyword #{"{{keyword_arg.var.id}}"} was not defined.") | ||
{% end %} | ||
end | ||
{% elsif arg.is_a? Path %} | ||
# No default argument was given, so no action is required here | ||
{% else %} | ||
{% raise "Not a TypeDeclaration or a Path: #{keyword_arg} of #{keyword_arg.class_name}" %} | ||
return_hash = {} of Symbol => Anyolite::RbCore::RbValue | ||
{% for keyword_arg in keyword_args %} | ||
{% if keyword_arg.is_a? TypeDeclaration %} | ||
if hash_key_values.includes?(":{{keyword_arg.var.id}}") | ||
ruby_hash_value = Anyolite::RbCore.rb_hash_get(_rb, kw_ptr.value, Anyolite::RbCore.get_symbol_value_of_string(_rb, "{{keyword_arg.var.id}}")) | ||
return_hash[:{{keyword_arg.var.id}}] = ruby_hash_value | ||
else | ||
{% if !keyword_arg.value.is_a? Nop %} | ||
return_hash[:{{keyword_arg.var.id}}] = Anyolite::RbCast.return_value(_rb, {{keyword_arg.value}}) | ||
{% else %} | ||
Anyolite.raise_argument_error("Keyword #{"{{keyword_arg.var.id}}"} was not defined.") | ||
{% end %} | ||
end | ||
{% elsif arg.is_a? Path %} | ||
# No default argument was given, so no action is required here | ||
{% else %} | ||
{% raise "Not a TypeDeclaration or a Path: #{keyword_arg} of #{keyword_arg.class_name}" %} | ||
{% end %} | ||
{% end %} | ||
{% end %} | ||
|
||
return_hash | ||
return_hash | ||
end | ||
end | ||
end | ||
end | ||
{% end %} |
Large diffs are not rendered by default.
Oops, something went wrong.