Skip to content

Commit

Permalink
Fixed documentation
Browse files Browse the repository at this point in the history
Hadeweka committed Sep 12, 2021
1 parent 901dd80 commit 7b5b73c
Showing 6 changed files with 326 additions and 309 deletions.
6 changes: 6 additions & 0 deletions Changelog.md
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
7 changes: 6 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -226,6 +226,12 @@ The term 'anyoli' means 'green' in the Maasai language, thus naming 'anyolite'.

## Upcoming releases

### Version 0.14.0

#### Features

* [ ] Windows support

### Version 1.0.0

This release will mark the first full release of Anyolite, mostly
@@ -237,7 +243,6 @@ Anyolite are already implemented.

#### Platform support

* [ ] Windows support (currently not supported due to problems with Crystal)
* [ ] Mac support (might be possible, not tested yet)

#### Documentation
2 changes: 1 addition & 1 deletion shard.yml
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
52 changes: 27 additions & 25 deletions src/implementations/mri/FormatString.cr
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 %}
156 changes: 79 additions & 77 deletions src/implementations/mri/Implementation.cr
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 %}
412 changes: 207 additions & 205 deletions src/implementations/mri/RbCore.cr

Large diffs are not rendered by default.

0 comments on commit 7b5b73c

Please sign in to comment.