Skip to content

Commit 2dce0d8

Browse files
committed
feat: javascript helpers extension
fix #881
1 parent 0a03b57 commit 2dce0d8

File tree

1 file changed

+43
-4
lines changed

1 file changed

+43
-4
lines changed

src/lib/Support/JavaScript.cpp

Lines changed: 43 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -532,11 +532,50 @@ Expected<Value, Error> Value::callImpl(std::span<const dom::Value> args) const
532532

533533
Expected<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

542581
Expected<Value> Value::apply(std::span<const dom::Value> args) const

0 commit comments

Comments
 (0)