aboutsummaryrefslogtreecommitdiff
path: root/lux-ruby
diff options
context:
space:
mode:
authorEduardo Julian2021-10-31 00:40:58 -0400
committerEduardo Julian2021-10-31 00:40:58 -0400
commitda89da48cbe538521790f8a1bdc64ffae21161b5 (patch)
treeb429d7b27f7a47bcd533c2eaba256222eafe6bc2 /lux-ruby
parent0e97f0797dfa861441ca0d3d9b8384ebd0b709ca (diff)
Fixed a bug when calling JVM functions from Ruby code.
Diffstat (limited to 'lux-ruby')
-rw-r--r--lux-ruby/source/program.lux193
1 files changed, 122 insertions, 71 deletions
diff --git a/lux-ruby/source/program.lux b/lux-ruby/source/program.lux
index 7e3f4ef91..9aa71067f 100644
--- a/lux-ruby/source/program.lux
+++ b/lux-ruby/source/program.lux
@@ -25,7 +25,7 @@
["[0]" utf8]]]
[collection
["[0]" array {"+" Array}]
- ["[0]" list]]]
+ ["[0]" list ("[1]#[0]" functor)]]]
["[0]" macro
[syntax {"+" syntax:}]
["[0]" template]]
@@ -245,17 +245,6 @@
(again (++ idx) (array.write! idx lux_value output))))
{try.#Success output}))))
-(def: function_abstract_class
- (|> ..read_tuple
- (:as java/lang/Object)
- java/lang/Object::getClass
- java/lang/Class::getSuperclass))
-
-(def: (function? value)
- (-> Any Bit)
- (java/lang/Class::isInstance (:as java/lang/Object value)
- ..function_abstract_class))
-
(exception: (unknown_kind_of_object [object java/lang/Object])
(exception.report
["Class" (java/lang/Object::toString (java/lang/Object::getClass object))]
@@ -361,6 +350,74 @@
["[1]::[0]"
("static" [t] copyOfRange [[t] int int] [t])])
+(exception: (invalid_arity [arity Nat])
+ (exception.report
+ ["Arity" (%.nat arity)]))
+
+(def: (lux_wrapper_call useful_object_class lux_structure value)
+ (-> (-> (-> (Array java/lang/Object) org/jruby/runtime/builtin/IRubyObject)
+ (Array java/lang/Object)
+ org/jruby/RubyClass)
+ (-> (Array java/lang/Object) org/jruby/runtime/builtin/IRubyObject)
+ (-> (Array java/lang/Object) org/jruby/internal/runtime/methods/DynamicMethod))
+ (ffi.object [] org/jruby/internal/runtime/methods/DynamicMethod []
+ [java/lang/String "call"]
+
+ (org/jruby/internal/runtime/methods/DynamicMethod
+ [] (call self [thread_context org/jruby/runtime/ThreadContext
+ self org/jruby/runtime/builtin/IRubyObject
+ module org/jruby/RubyModule
+ method java/lang/String
+ args [org/jruby/runtime/builtin/IRubyObject]
+ block org/jruby/runtime/Block])
+ org/jruby/runtime/builtin/IRubyObject
+ (let [arity (ffi.length args)]
+ (try.trusted
+ (do [! try.monad]
+ [args (|> arity
+ list.indices
+ (list#each (function (_ index)
+ (ffi.read! index args)))
+ (monad.each ! (|>> (:as java/lang/Object) ..read)))
+ output (case args
+ (^ (list arg/0))
+ (in ((:as (-> Any Any) value)
+ arg/0))
+
+ (^ (list arg/0 arg/1))
+ (in ((:as (-> Any Any Any) value)
+ arg/0 arg/1))
+
+ (^ (list arg/0 arg/1 arg/2))
+ (in ((:as (-> Any Any Any Any) value)
+ arg/0 arg/1 arg/2))
+
+ (^ (list arg/0 arg/1 arg/2 arg/3))
+ (in ((:as (-> Any Any Any Any Any) value)
+ arg/0 arg/1 arg/2 arg/3))
+
+ (^ (list arg/0 arg/1 arg/2 arg/3 arg/4))
+ (in ((:as (-> Any Any Any Any Any Any) value)
+ arg/0 arg/1 arg/2 arg/3 arg/4))
+
+ (^ (list arg/0 arg/1 arg/2 arg/3 arg/4 arg/5))
+ (in ((:as (-> Any Any Any Any Any Any Any) value)
+ arg/0 arg/1 arg/2 arg/3 arg/4 arg/5))
+
+ (^ (list arg/0 arg/1 arg/2 arg/3 arg/4 arg/5 arg/6))
+ (in ((:as (-> Any Any Any Any Any Any Any Any) value)
+ arg/0 arg/1 arg/2 arg/3 arg/4 arg/5 arg/6))
+
+ (^ (list arg/0 arg/1 arg/2 arg/3 arg/4 arg/5 arg/6 arg/7))
+ (in ((:as (-> Any Any Any Any Any Any Any Any Any) value)
+ arg/0 arg/1 arg/2 arg/3 arg/4 arg/5 arg/6 arg/7))
+
+ _
+ (exception.except ..invalid_arity [arity]))]
+ (in (|> output
+ (:as java/lang/Object)
+ (wrapped_lux_value useful_object_class lux_structure)))))))))
+
(def: (lux_wrapper_access useful_object_class lux_structure value)
(-> (-> (-> (Array java/lang/Object) org/jruby/runtime/builtin/IRubyObject)
(Array java/lang/Object)
@@ -379,70 +436,61 @@
block org/jruby/runtime/Block])
org/jruby/runtime/builtin/IRubyObject
(let [member (ffi.read! 0 args)]
- (if (function? value)
- (case (..read (:as java/lang/Object member))
- {try.#Success input}
- (|> ((:as (-> Any Any) value) input)
- (:as java/lang/Object)
- (wrapped_lux_value useful_object_class lux_structure))
-
- {try.#Failure error}
- (panic! error))
- (<| (case (ffi.check org/jruby/RubyFixnum member)
- {.#Some member}
- (case (array.read! (org/jruby/RubyFixnum::getLongValue member) value)
+ (<| (case (ffi.check org/jruby/RubyFixnum member)
+ {.#Some member}
+ (case (array.read! (org/jruby/RubyFixnum::getLongValue member) value)
+ {.#Some value}
+ (wrapped_lux_value useful_object_class lux_structure value)
+
+ {.#None}
+ ..ruby_nil)
+
+ {.#None})
+ (case (ffi.check org/jruby/RubyString member)
+ {.#Some member}
+ (case (:as Text (org/jruby/RubyString::asJavaString member))
+ (^ (static runtime.variant_tag_field))
+ (|> value
+ (array.read! 0)
+ maybe.trusted
+ (:as java/lang/Integer)
+ java/lang/Integer::longValue
+ (org/jruby/RubyFixnum::new ..initial_ruby_runtime))
+
+ (^ (static runtime.variant_flag_field))
+ (case (array.read! 1 value)
+ {.#None}
+ ..ruby_nil
+
+ {.#Some flag}
+ ..lux_unit)
+
+ (^ (static runtime.variant_value_field))
+ (case (array.read! 2 value)
{.#Some value}
(wrapped_lux_value useful_object_class lux_structure value)
{.#None}
- ..ruby_nil)
-
- {.#None})
- (case (ffi.check org/jruby/RubyString member)
- {.#Some member}
- (case (:as Text (org/jruby/RubyString::asJavaString member))
- (^ (static runtime.variant_tag_field))
- (|> value
- (array.read! 0)
- maybe.trusted
- (:as java/lang/Integer)
- java/lang/Integer::longValue
- (org/jruby/RubyFixnum::new ..initial_ruby_runtime))
-
- (^ (static runtime.variant_flag_field))
- (case (array.read! 1 value)
- {.#None}
- ..ruby_nil
-
- {.#Some flag}
- ..lux_unit)
-
- (^ (static runtime.variant_value_field))
- (case (array.read! 2 value)
- {.#Some value}
- (wrapped_lux_value useful_object_class lux_structure value)
+ (panic! (exception.error ..nil_has_no_lux_representation [])))
- {.#None}
- (panic! (exception.error ..nil_has_no_lux_representation [])))
-
- field
- (panic! (exception.error ..invalid_variant_access [field])))
-
- {.#None})
- (case (ffi.check org/jruby/RubyRange member)
- {.#Some member}
- (case [(|> member (org/jruby/RubyRange::first thread_context) (ffi.check org/jruby/RubyFixnum))
- (|> member (org/jruby/RubyRange::size thread_context) (ffi.check org/jruby/RubyFixnum))]
- [{.#Some first} {.#Some size}]
- (let [first (org/jruby/RubyFixnum::getLongValue first)
- size (org/jruby/RubyFixnum::getLongValue size)]
- (lux_structure (java/util/Arrays::copyOfRange value first (i.+ first size))))
-
- _
- (panic! (exception.error ..invalid_index (:as java/lang/Object member))))
-
- {.#None})
- (panic! (exception.error ..invalid_index (:as java/lang/Object member)))))))))
+ field
+ (panic! (exception.error ..invalid_variant_access [field])))
+
+ {.#None})
+ (case (ffi.check org/jruby/RubyRange member)
+ {.#Some member}
+ (case [(|> member (org/jruby/RubyRange::first thread_context) (ffi.check org/jruby/RubyFixnum))
+ (|> member (org/jruby/RubyRange::size thread_context) (ffi.check org/jruby/RubyFixnum))]
+ [{.#Some first} {.#Some size}]
+ (let [first (org/jruby/RubyFixnum::getLongValue first)
+ size (org/jruby/RubyFixnum::getLongValue size)]
+ (lux_structure (java/util/Arrays::copyOfRange value first (i.+ first size))))
+
+ _
+ (panic! (exception.error ..invalid_index (:as java/lang/Object member))))
+
+ {.#None})
+ (panic! (exception.error ..invalid_index (:as java/lang/Object member))))))))
(def: (lux_wrapper_equality value)
(-> (Array java/lang/Object) org/jruby/internal/runtime/methods/DynamicMethod)
@@ -552,6 +600,9 @@
[] (searchWithCache self [method java/lang/String])
org/jruby/runtime/callsite/CacheEntry
(case (:as Text method)
+ "call"
+ (org/jruby/runtime/callsite/CacheEntry::new (..lux_wrapper_call useful_object_class lux_structure value) 0)
+
"[]"
(org/jruby/runtime/callsite/CacheEntry::new (..lux_wrapper_access useful_object_class lux_structure value) 0)