Skip to content

GraalJS: Cannot bind to proxy object #356

Open
@REASY

Description

@REASY

The following JS code works in Google Chrome:

console.log("########### Direct call in JS #############")
console.log("window.document.createElement:", window.document.createElement("p"));
console.log("document.createElement.apply:", window.document.createElement.apply(window.document, ["p"]));
console.log("########################")

console.log("\n")

console.log("########## Call via Bind/Call ##############")
var boundCall = Object.bind.apply(Object.call, [Object.bind, Object.call]);
var boundCall2 = boundCall.apply(window, [Object.bind]);
var createElementMethod = boundCall2.apply(window, [document.createElement, window.document]);
console.log(createElementMethod("p"));
console.log(createElementMethod.apply(window.document, ["p"]));
console.log("########################")

And produces
image

But when I use GraaJS v20.2.0 with proxy Document objec: https://github.com/REASY/graalvm-js-bind-issue/blob/8402fbb326125db62414a4348ed63cbc70fee6f6/src/main/java/com/examples/graalvm/blink/Document.java#L9t to execute that code https://github.com/REASY/graalvm-js-bind-issue/blob/main/src/main/scala/com/examples/graalvm/BindExample.scala#L20-L23, I get the exception org.graalvm.polyglot.PolyglotException: TypeError: com.examples.graalvm.blink.Document$1@103441bb is not a function:

########### Direct call in JS #############
hasMember: createElement
hasMember: createElement
getMember: createElement
execute(). Received [p]
window.document.createElement: bar
hasMember: createElement
getMember: createElement
execute(). Received [p]
document.createElement.apply: bar
########################
########## Call via Bind/Call ##############
hasMember: createElement
getMember: createElement
[error] (run-main-0) org.graalvm.polyglot.PolyglotException: TypeError: com.examples.graalvm.blink.Document$1@103441bb is not a function
[error] org.graalvm.polyglot.PolyglotException: TypeError: com.examples.graalvm.blink.Document$1@103441bb is not a function
[error]         at <js>.:program(bind_example.js:9)
[error]         at org.graalvm.polyglot.Context.eval(Context.java:345)
[error]         at com.examples.graalvm.BindExample$.execute(BindExample.scala:23)
[error]         at com.examples.graalvm.BindExample$.main(BindExample.scala:29)
[error]         at com.examples.graalvm.BindExample.main(BindExample.scala)
[error]         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[error]         at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
[error]         at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[error]         at java.lang.reflect.Method.invoke(Method.java:498)
[error] stack trace is suppressed; run last Compile / bgRunMain for the full output
[error] Nonzero exit code: 1
[error] (Compile / runMain) Nonzero exit code: 1
[error] Total time: 1 s, completed Oct 6, 2020 12:13:39 AM

image

GraalVM params:

  • allowAllAccess = true
  • allowExperimentalOptions = true
  • js.experimental-foreign-object-prototype = true

GraalVM version: 20.2.0
JVM: Oracle JDK 1.8.0_251
Repo: https://github.com/REASY/graalvm-js-bind-issue

Metadata

Metadata

Assignees

Labels

interopPolyglot Language Interoperability

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions