Comments (5)
Good catch! The reference interpreter allows this [edit: with the fix @jakobkummerow points out below], since it just assumes the operand can be (the subtype of) any function type. But as you correctly point out, that is not actually supported by the typing rule, which requires the type to exist in the current module.
In the absence of a type annotation, there is no simple solution to this within the current type system, where type indices are not substituted by definitions. To avoid a crazy algorithm, we'd need to introduce an additional special-case rule for Bottom to achieve more relaxed typing – and similarly for other instructions with reference operands, if we remove their annotations. That would be half a step in the direction of @conrad-watt's relaxed dead code typing proposal, though handling this kind of case would actually require way more changes/additions than what is currently described in that proposal's overview.
So this definitely is an argument for having type annotations.
from function-references.
FWIW, V8 is fine with the call_ref
+ f64.add
in this example, but complains at the end:
Compiling function #0 failed: expected 2 elements on the stack for fallthru, found 3 @+38
When I add a drop
after the f64.add
, the module validates in V8. Checking for too many stack values in unreachable code may well be a bug.
Binaryen's wasm-dis
and wasm-opt
accept the module without any changes; I'm not sure whether this implies that Binaryen ran proper validation on it.
So this definitely is an argument for having type annotations.
I don't think anything about unreachable code is an argument for adding bytes to non-unreachable code.
from function-references.
Binaryen's
wasm-dis
andwasm-opt
accept the module without any changes; I'm not sure whether this implies that Binaryen ran proper validation on it.
Binaryen's validation algorithm is already similar to the one in the relaxed dead code typing proposal, so proper validation was definitely not run.
from function-references.
When I add a drop after the
f64.add
, the module validates in V8. Checking for too many stack values in unreachable code may well be a bug.
No, I think you and V8 are correct, as written, this particular example has to be rejected regardless.
from function-references.
Closing via #76.
from function-references.
Related Issues (20)
- Issues with the JavaScript spec tests HOT 4
- `Illegal macro parameter reference` in the spec HOT 1
- Binary encoding out of sync with GC proposal
- Merge in latest spec repo HOT 2
- Function reference from JavaScript functions? HOT 4
- Fix table-elem desugaring
- `func.bind` and iso-recursion HOT 2
- Validating local.get in nested blocks with unreachable HOT 5
- br_on_non_null.wast needs unreachable test HOT 1
- slowness of test/core/skip-stack-guard-page.wast HOT 3
- Drop null casts? HOT 4
- Tweak binary format for table declarations HOT 2
- JS-API is missing value conversions HOT 3
- Extend `TableType` to support non-nullable references in JS-API HOT 1
- Progress toward phase 4 HOT 2
- Malformed br_on_null and br_on_non_null in tests HOT 1
- Default/init values in JS-API for globals and table. HOT 3
- Clarification request: initializers for tables with non-nullable type and initial_size == 0 HOT 3
- Should non-nullable locals be initialized by unreachable code? HOT 13
Recommend Projects
-
React
A declarative, efficient, and flexible JavaScript library for building user interfaces.
-
Vue.js
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
-
Typescript
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
-
TensorFlow
An Open Source Machine Learning Framework for Everyone
-
Django
The Web framework for perfectionists with deadlines.
-
Laravel
A PHP framework for web artisans
-
D3
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
-
Recommend Topics
-
javascript
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
-
web
Some thing interesting about web. New door for the world.
-
server
A server is a program made to process requests and deliver data to clients.
-
Machine learning
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
-
Visualization
Some thing interesting about visualization, use data art
-
Game
Some thing interesting about game, make everyone happy.
Recommend Org
-
Facebook
We are working to build community through open source technology. NB: members must have two-factor auth.
-
Microsoft
Open source projects and samples from Microsoft.
-
Google
Google ❤️ Open Source for everyone.
-
Alibaba
Alibaba Open Source for everyone
-
D3
Data-Driven Documents codes.
-
Tencent
China tencent open source team.
from function-references.