Skip to content

Commit

Permalink
Removed debugging routines and prepared release
Browse files Browse the repository at this point in the history
  • Loading branch information
Hadeweka authored and Hadeweka committed Sep 21, 2020
1 parent e2664f3 commit cdcbcb3
Show file tree
Hide file tree
Showing 7 changed files with 64 additions and 103 deletions.
33 changes: 17 additions & 16 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -127,9 +127,6 @@ b.yell(sound: 'Ouch, you stole my HP!', loud: true)
a.yell(sound: 'Well, take better care of your public attributes!')
```

The syntax stays mostly the same as in Crystal, except for the keyword arguments.
These might be added in the future, but technically you can always wrap the generated methods in pure Ruby methods with keywords.

The example above gives a good overview over the things you can already do with Anyolite.
More features will be added in the future.

Expand All @@ -156,6 +153,20 @@ The term 'anyoli' means 'green' in the Maasai language, thus naming 'anyolite'.

## Releases

### Version 0.2.1

#### Usability
* Operator suffixes as general optional argument for MrbWrap functions
* Option to inspect reference table
* Reference counting in reference table
* Reference table can be cleared

#### Bugfixes
* Fixed structs not being able to be wrapped
* Fixed example in documentation
* Fixed memory leak when returning nontrivial objects in mruby
* Removed constructor limitations for types being able to be used as return values

### Version 0.2.0

#### Major features
Expand Down Expand Up @@ -223,19 +234,7 @@ The term 'anyoli' means 'green' in the Maasai language, thus naming 'anyolite'.

## Upcoming releases

### Version 0.2.1

#### Usability
* [ ] Operator suffixes as general optional argument for MrbWrap functions
* [X] Logging of any reference table operations for debugging
* [X] Reference counting in reference table
* [X] Reference table can be cleared

#### Bugfixes
* [X] Fixed structs not being able to be wrapped
* [X] Fixed example in documentation
* [X] Fixed memory leak when returning nontrivial objects in mruby
* [X] Removed constructor limitations for types being able to be used as return values
None planned yet

### Future updates

Expand All @@ -247,6 +246,8 @@ The term 'anyoli' means 'green' in the Maasai language, thus naming 'anyolite'.
* [ ] MrbClass/MrbModule and Class can be both used as arguments
* [ ] More stable type casting
* [ ] More stable struct reference table management
* [ ] Logging options for reference table
* [ ] Crystal specs for testing

### Possible future updates

Expand Down
4 changes: 0 additions & 4 deletions src/MrbCast.cr
Original file line number Diff line number Diff line change
Expand Up @@ -59,8 +59,6 @@ module MrbCast

ptr = Pointer(typeof(value)).malloc(size: 1, value: value)

puts "Returning ... #{ptr} -> #{value.to_s}"

new_ruby_object = MrbInternal.new_empty_object(mrb, ruby_class, ptr.as(Void*), MrbTypeCache.register(typeof(value), destructor))
MrbMacro.convert_from_ruby_object(mrb, new_ruby_object, typeof(value)).value = value

Expand All @@ -70,8 +68,6 @@ module MrbCast
MrbRefTable.add(value.hash, ptr.as(Void*))
end

puts "> Added class #{value.class} (cast)"

return new_ruby_object
end

Expand Down
46 changes: 21 additions & 25 deletions src/MrbMacro.cr
Original file line number Diff line number Diff line change
Expand Up @@ -126,22 +126,22 @@ module MrbMacro
ptr.as({{crystal_type}}*)
end

macro call_and_return(mrb, proc, proc_args, converted_args)
return_value = {{proc}}(*{{converted_args}})
macro call_and_return(mrb, proc, proc_args, converted_args, operator = "")
return_value = {{proc}}{{operator.id}}(*{{converted_args}})
MrbCast.return_value({{mrb}}, return_value)
end

macro call_and_return_keyword_method(mrb, proc, converted_regular_args, keyword_args, kw_args, empty_regular = false)
macro call_and_return_keyword_method(mrb, proc, converted_regular_args, keyword_args, kw_args, operator = "", empty_regular = false)
{% if empty_regular %}
return_value = {{proc}}(
return_value = {{proc}}{{operator.id}}(
{% c = 0 %}
{% for keyword in keyword_args.keys %}
{{keyword.id}}: MrbMacro.convert_keyword_arg({{mrb}}, {{kw_args}}.values[{{c}}], {{keyword_args[keyword]}}),
{% c += 1 %}
{% end %}
)
{% else %}
return_value = {{proc}}(*{{converted_regular_args}},
return_value = {{proc}}{{operator.id}}(*{{converted_regular_args}},
{% c = 0 %}
{% for keyword in keyword_args.keys %}
{{keyword.id}}: MrbMacro.convert_keyword_arg({{mrb}}, {{kw_args}}.values[{{c}}], {{keyword_args[keyword]}}),
Expand Down Expand Up @@ -235,7 +235,7 @@ module MrbMacro
{{mrb_state}}.define_module_function({{name}}, {{under_module}}, wrapped_method)
end

macro wrap_module_function_with_keyword_args(mrb_state, under_module, name, proc, keyword_args, regular_args = [] of Class)
macro wrap_module_function_with_keyword_args(mrb_state, under_module, name, proc, keyword_args, regular_args = [] of Class, operator = "")
{% if regular_args.class_name == "ArrayLiteral" %}
{% regular_arg_array = regular_args %}
{% else %}
Expand All @@ -252,16 +252,16 @@ module MrbMacro
converted_regular_args = MrbMacro.convert_args(mrb, regular_arg_tuple, {{regular_arg_array}})

{% if regular_arg_array.size == 0 %}
MrbMacro.call_and_return_keyword_method(mrb, {{proc}}, converted_regular_args, {{keyword_args}}, kw_args, empty_regular: true)
MrbMacro.call_and_return_keyword_method(mrb, {{proc}}, converted_regular_args, {{keyword_args}}, kw_args, operator: {{operator}}, empty_regular: true)
{% else %}
MrbMacro.call_and_return_keyword_method(mrb, {{proc}}, converted_regular_args, {{keyword_args}}, kw_args)
MrbMacro.call_and_return_keyword_method(mrb, {{proc}}, converted_regular_args, {{keyword_args}}, kw_args, operator: {{operator}})
{% end %}
end

{{mrb_state}}.define_module_function({{name}}, {{under_module}}, wrapped_method)
end

macro wrap_class_method_with_args(mrb_state, crystal_class, name, proc, proc_args = [] of Class)
macro wrap_class_method_with_args(mrb_state, crystal_class, name, proc, proc_args = [] of Class, operator = "")
{% if proc_args.class_name == "ArrayLiteral" %}
{% proc_arg_array = proc_args %}
{% else %}
Expand All @@ -270,13 +270,13 @@ module MrbMacro

wrapped_method = MrbFunc.new do |mrb, obj|
converted_args = MrbMacro.get_converted_args(mrb, {{proc_arg_array}})
MrbMacro.call_and_return(mrb, {{proc}}, {{proc_arg_array}}, converted_args)
MrbMacro.call_and_return(mrb, {{proc}}, {{proc_arg_array}}, converted_args, operator: {{operator}})
end

{{mrb_state}}.define_class_method({{name}}, MrbClassCache.get({{crystal_class}}), wrapped_method)
end

macro wrap_class_method_with_keyword_args(mrb_state, crystal_class, name, proc, keyword_args, regular_args = [] of Class)
macro wrap_class_method_with_keyword_args(mrb_state, crystal_class, name, proc, keyword_args, regular_args = [] of Class, operator = "")
{% if regular_args.class_name == "ArrayLiteral" %}
{% regular_arg_array = regular_args %}
{% else %}
Expand All @@ -293,9 +293,9 @@ module MrbMacro
converted_regular_args = MrbMacro.convert_args(mrb, regular_arg_tuple, {{regular_arg_array}})

{% if regular_arg_array.size == 0 %}
MrbMacro.call_and_return_keyword_method(mrb, {{proc}}, converted_regular_args, {{keyword_args}}, kw_args, empty_regular: true)
MrbMacro.call_and_return_keyword_method(mrb, {{proc}}, converted_regular_args, {{keyword_args}}, kw_args, operator: {{operator}}, empty_regular: true)
{% else %}
MrbMacro.call_and_return_keyword_method(mrb, {{proc}}, converted_regular_args, {{keyword_args}}, kw_args)
MrbMacro.call_and_return_keyword_method(mrb, {{proc}}, converted_regular_args, {{keyword_args}}, kw_args, operator: {{operator}})
{% end %}
end

Expand All @@ -312,7 +312,7 @@ module MrbMacro
wrapped_method = MrbFunc.new do |mrb, obj|
converted_args = MrbMacro.get_converted_args(mrb, {{proc_arg_array}})
converted_obj = MrbMacro.convert_from_ruby_object(mrb, obj, {{crystal_class}}).value
MrbMacro.call_and_return_instance_method(mrb, {{proc}}, converted_obj, converted_args, {{operator}})
MrbMacro.call_and_return_instance_method(mrb, {{proc}}, converted_obj, converted_args, operator: {{operator}})
end

{{mrb_state}}.define_method({{name + operator}}, MrbClassCache.get({{crystal_class}}), wrapped_method)
Expand All @@ -336,16 +336,16 @@ module MrbMacro
converted_obj = MrbMacro.convert_from_ruby_object(mrb, obj, {{crystal_class}}).value

{% if regular_arg_array.size == 0 %}
MrbMacro.call_and_return_keyword_instance_method(mrb, {{proc}}, converted_obj, converted_regular_args, {{keyword_args}}, kw_args, {{operator}}, empty_regular: true)
MrbMacro.call_and_return_keyword_instance_method(mrb, {{proc}}, converted_obj, converted_regular_args, {{keyword_args}}, kw_args, operator: {{operator}}, empty_regular: true)
{% else %}
MrbMacro.call_and_return_keyword_instance_method(mrb, {{proc}}, converted_obj, converted_regular_args, {{keyword_args}}, kw_args, {{operator}})
MrbMacro.call_and_return_keyword_instance_method(mrb, {{proc}}, converted_obj, converted_regular_args, {{keyword_args}}, kw_args, operator: {{operator}})
{% end %}
end

{{mrb_state}}.define_method({{name + operator}}, MrbClassCache.get({{crystal_class}}), wrapped_method)
end

macro wrap_constructor_function_with_args(mrb_state, crystal_class, proc, proc_args = [] of Class)
macro wrap_constructor_function_with_args(mrb_state, crystal_class, proc, proc_args = [] of Class, operator = "")
{% if proc_args.class_name == "ArrayLiteral" %}
{% proc_arg_array = proc_args %}
{% else %}
Expand All @@ -355,7 +355,7 @@ module MrbMacro
wrapped_method = MrbFunc.new do |mrb, obj|
# Create local object
converted_args = MrbMacro.get_converted_args(mrb, {{proc_arg_array}})
new_obj = {{proc}}(*converted_args)
new_obj = {{proc}}{{operator.id}}(*converted_args)

if new_obj.responds_to?(:mrb_initialize)
new_obj.mrb_initialize(mrb)
Expand All @@ -369,8 +369,6 @@ module MrbMacro
MrbRefTable.add(new_obj_ptr.value.hash, new_obj_ptr.as(Void*))
end

puts "> Added class #{{{crystal_class}}} (regular): #{new_obj_ptr} -> #{new_obj_ptr.value.to_s}"

destructor = MrbTypeCache.destructor_method({{crystal_class}})
MrbInternal.set_data_ptr_and_type(obj, new_obj_ptr, MrbTypeCache.register({{crystal_class}}, destructor))

Expand All @@ -381,7 +379,7 @@ module MrbMacro
{{mrb_state}}.define_method("initialize", MrbClassCache.get({{crystal_class}}), wrapped_method)
end

macro wrap_constructor_function_with_keyword_args(mrb_state, crystal_class, proc, keyword_args, regular_args = [] of Class)
macro wrap_constructor_function_with_keyword_args(mrb_state, crystal_class, proc, keyword_args, regular_args = [] of Class, operator = "")
{% if regular_args.class_name == "ArrayLiteral" %}
{% regular_arg_array = regular_args %}
{% else %}
Expand All @@ -398,15 +396,15 @@ module MrbMacro
converted_regular_args = MrbMacro.convert_args(mrb, regular_arg_tuple, {{regular_arg_array}})

{% if regular_arg_array.size == 0 %}
new_obj = {{proc}}(
new_obj = {{proc}}{{operator.id}}(
{% c = 0 %}
{% for keyword in keyword_args.keys %}
{{keyword.id}}: MrbMacro.convert_keyword_arg(mrb, kw_args.values[{{c}}], {{keyword_args[keyword]}}),
{% c += 1 %}
{% end %}
)
{% else %}
new_obj = {{proc}}(*converted_regular_args,
new_obj = {{proc}}{{operator.id}}(*converted_regular_args,
{% c = 0 %}
{% for keyword in keyword_args.keys %}
{{keyword.id}}: MrbMacro.convert_keyword_arg(mrb, kw_args.values[{{c}}], {{keyword_args[keyword]}}),
Expand All @@ -427,8 +425,6 @@ module MrbMacro
MrbRefTable.add(new_obj_ptr.value.hash, new_obj_ptr.as(Void*))
end

puts "> Added class #{{{crystal_class}}} (keyword): #{new_obj_ptr} -> #{new_obj_ptr.value.to_s}"

destructor = MrbTypeCache.destructor_method({{crystal_class}})
MrbInternal.set_data_ptr_and_type(obj, new_obj_ptr, MrbTypeCache.register({{crystal_class}}, destructor))

Expand Down
2 changes: 0 additions & 2 deletions src/MrbRefTable.cr
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@ module MrbRefTable
end

def self.add(identification, value)
puts "* Added ref #{identification} -> #{value}"
if @@content[identification]?
if value != @@content[identification][0]
puts "WARNING: Value #{identification} replaced pointers."
Expand All @@ -24,7 +23,6 @@ module MrbRefTable

def self.delete(identification)
if @@content[identification]?
puts "* Deleted ref #{identification} -> #{@@content[identification]}"
@@content[identification] = {@@content[identification][0], @@content[identification][1] - 1}
if @@content[identification][1] <= 0
@@content.delete(identification)
Expand Down
3 changes: 0 additions & 3 deletions src/MrbTypeCache.cr
Original file line number Diff line number Diff line change
Expand Up @@ -19,11 +19,8 @@ module MrbTypeCache
crystal_value.mrb_finalize(mrb)
end

puts "> Destructor for #{crystal_ptr} with value #{crystal_ptr}."

# Delete the Crystal reference to this object
MrbRefTable.delete(crystal_ptr.value.object_id)

}
end
end
Loading

0 comments on commit cdcbcb3

Please sign in to comment.