@@ -532,11 +532,50 @@ Expected<Value, Error> Value::callImpl(std::span<const dom::Value> args) const
532532
533533Expected<Value, Error> Value::callPropImpl (std::string_view prop, std::initializer_list<dom::Value> args) const
534534{
535- Value v = get (prop);
536- if (v.isUndefined ())
535+ if (!val_) return Unexpected (Error (" undefined" ));
536+ auto lock = lockContext (impl_);
537+
538+ jerry_value_t obj = to_js (val_);
539+ if (!jerry_value_is_object (obj))
540+ return Unexpected (Error (" not an object" ));
541+
542+ jerry_value_t key = jerry_string_sz (prop.data ());
543+ jerry_value_t fn = jerry_object_get (obj, key);
544+ jerry_value_free (key);
545+
546+ if (jerry_value_is_exception (fn))
547+ {
548+ auto err = makeError (fn);
549+ jerry_value_free (fn);
550+ return Unexpected (err);
551+ }
552+ if (jerry_value_is_undefined (fn))
553+ {
554+ jerry_value_free (fn);
537555 return Unexpected (Error (" property not found" ));
538- std::vector<dom::Value> vec (args);
539- return v.callImpl (std::span<const dom::Value>(vec));
556+ }
557+ if (!jerry_value_is_function (fn))
558+ {
559+ jerry_value_free (fn);
560+ return Unexpected (Error (" not a function" ));
561+ }
562+
563+ std::vector<jerry_value_t > jsArgs;
564+ jsArgs.reserve (args.size ());
565+ for (auto const & a : args)
566+ jsArgs.push_back (toJsValue (a, impl_));
567+
568+ jerry_value_t ret = jerry_call (fn, obj, jsArgs.data (), jsArgs.size ());
569+ for (auto & a : jsArgs) jerry_value_free (a);
570+ jerry_value_free (fn);
571+
572+ if (jerry_value_is_exception (ret))
573+ {
574+ auto err = makeError (ret);
575+ jerry_value_free (ret);
576+ return Unexpected (err);
577+ }
578+ return Value::fromJs (nullptr , to_handle (ret), impl_);
540579}
541580
542581Expected<Value> Value::apply (std::span<const dom::Value> args) const
0 commit comments