syntax support for table.init
This commit is contained in:
@@ -165,6 +165,13 @@ import Language.Wasm.Lexer (
|
|||||||
'i64.store32' { Lexeme _ (TKeyword "i64.store32") }
|
'i64.store32' { Lexeme _ (TKeyword "i64.store32") }
|
||||||
'memory.size' { Lexeme _ (TKeyword "memory.size") }
|
'memory.size' { Lexeme _ (TKeyword "memory.size") }
|
||||||
'memory.grow' { Lexeme _ (TKeyword "memory.grow") }
|
'memory.grow' { Lexeme _ (TKeyword "memory.grow") }
|
||||||
|
'table.init' { Lexeme _ (TKeyword "table.init") }
|
||||||
|
'table.copy' { Lexeme _ (TKeyword "table.copy") }
|
||||||
|
'table.fill' { Lexeme _ (TKeyword "table.fill") }
|
||||||
|
'table.size' { Lexeme _ (TKeyword "table.size") }
|
||||||
|
'table.grow' { Lexeme _ (TKeyword "table.grow") }
|
||||||
|
'table.get' { Lexeme _ (TKeyword "table.get") }
|
||||||
|
'table.set' { Lexeme _ (TKeyword "table.set") }
|
||||||
'i32.const' { Lexeme _ (TKeyword "i32.const") }
|
'i32.const' { Lexeme _ (TKeyword "i32.const") }
|
||||||
'i64.const' { Lexeme _ (TKeyword "i64.const") }
|
'i64.const' { Lexeme _ (TKeyword "i64.const") }
|
||||||
'f32.const' { Lexeme _ (TKeyword "f32.const") }
|
'f32.const' { Lexeme _ (TKeyword "f32.const") }
|
||||||
@@ -463,6 +470,12 @@ plaininstr :: { PlainInstr }
|
|||||||
| 'i64.store32' memarg4 { I64Store32 $2 }
|
| 'i64.store32' memarg4 { I64Store32 $2 }
|
||||||
| 'memory.size' { CurrentMemory }
|
| 'memory.size' { CurrentMemory }
|
||||||
| 'memory.grow' { GrowMemory }
|
| 'memory.grow' { GrowMemory }
|
||||||
|
-- table instructions
|
||||||
|
| 'table.init' index opt(index) {
|
||||||
|
case $3 of
|
||||||
|
Nothing -> TableInit (Index 0) $2
|
||||||
|
Just elemIdx -> TableInit $2 elemIdx
|
||||||
|
}
|
||||||
-- numeric instructions
|
-- numeric instructions
|
||||||
| 'i32.const' int32 { I32Const $2 }
|
| 'i32.const' int32 { I32Const $2 }
|
||||||
| 'i64.const' int64 { I64Const $2 }
|
| 'i64.const' int64 { I64Const $2 }
|
||||||
@@ -883,18 +896,23 @@ table :: { [ModuleField] }
|
|||||||
|
|
||||||
limits_elemtype_elem :: { Maybe Ident -> [ModuleField] }
|
limits_elemtype_elem :: { Maybe Ident -> [ModuleField] }
|
||||||
: tabletype ')' { \ident -> [MFTable $ Table [] ident $1] }
|
: tabletype ')' { \ident -> [MFTable $ Table [] ident $1] }
|
||||||
| elemtype '(' 'elem' list(index) ')' ')' {
|
| elemtype '(' 'elem' indexes_or_ref_exprs ')' ')' {
|
||||||
\ident ->
|
\ident ->
|
||||||
let funcsLen = fromIntegral $ length $4 in [
|
let funcsLen = fromIntegral $ length $4 in [
|
||||||
MFTable $ Table [] ident $ TableType (Limit funcsLen (Just funcsLen)) $1,
|
MFTable $ Table [] ident $ TableType (Limit funcsLen (Just funcsLen)) $1,
|
||||||
let tableIndex = (fromMaybe (Index 0) $ Named `fmap` ident) in
|
let tableIndex = (fromMaybe (Index 0) $ Named `fmap` ident) in
|
||||||
let offset = [PlainInstr $ I32Const 0] in
|
let offset = [PlainInstr $ I32Const 0] in
|
||||||
let elements = funcIndexToExpr $4 in
|
let elements = $4 in
|
||||||
MFElem $ ElemSegment Nothing FuncRef (Active tableIndex offset) elements
|
MFElem $ ElemSegment Nothing FuncRef (Active tableIndex offset) elements
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
| '(' import_export_table { $2 }
|
| '(' import_export_table { $2 }
|
||||||
|
|
||||||
|
indexes_or_ref_exprs :: {[[Instruction]]}
|
||||||
|
: index list(index) { funcIndexToExpr ($1:$2) }
|
||||||
|
| elemexpr list(elemexpr) { $1 : $2 }
|
||||||
|
| {- empty -} { [] }
|
||||||
|
|
||||||
import_export_table :: { Maybe Ident -> [ModuleField] }
|
import_export_table :: { Maybe Ident -> [ModuleField] }
|
||||||
: 'import' name name ')' tabletype ')' {
|
: 'import' name name ')' tabletype ')' {
|
||||||
\ident -> [MFImport $ Import [] $2 $3 $ ImportTable ident $5]
|
\ident -> [MFImport $ Import [] $2 $3 $ ImportTable ident $5]
|
||||||
@@ -931,7 +949,7 @@ elem :: { ElemSegment }
|
|||||||
elem1 :: { ElemSegment }
|
elem1 :: { ElemSegment }
|
||||||
: elemlist ')' { let (t, els) = $1 in ElemSegment Nothing t Passive els }
|
: elemlist ')' { let (t, els) = $1 in ElemSegment Nothing t Passive els }
|
||||||
| 'declare' elemlist ')' { let (t, els) = $2 in ElemSegment Nothing t Declarative els }
|
| 'declare' elemlist ')' { let (t, els) = $2 in ElemSegment Nothing t Declarative els }
|
||||||
| '(' elem1_active { $2 }
|
| '(' elem1_active ')' { $2 }
|
||||||
|
|
||||||
elem1_active :: { ElemSegment }
|
elem1_active :: { ElemSegment }
|
||||||
: 'table' index ')' '(' elem1_active_offset {
|
: 'table' index ')' '(' elem1_active_offset {
|
||||||
@@ -948,6 +966,7 @@ elem1_active_offset :: { ([Instruction], ElemType, [[Instruction]]) }
|
|||||||
elemlist :: { (ElemType, [[Instruction]]) }
|
elemlist :: { (ElemType, [[Instruction]]) }
|
||||||
: 'func' list(index) { (FuncRef, funcIndexToExpr $2) }
|
: 'func' list(index) { (FuncRef, funcIndexToExpr $2) }
|
||||||
| 'funcref' list(elemexpr) { (FuncRef, $2) }
|
| 'funcref' list(elemexpr) { (FuncRef, $2) }
|
||||||
|
| list(index) { (FuncRef, funcIndexToExpr $1) }
|
||||||
|
|
||||||
elemexpr :: { [Instruction] }
|
elemexpr :: { [Instruction] }
|
||||||
: plaininstr { [PlainInstr $1] }
|
: plaininstr { [PlainInstr $1] }
|
||||||
@@ -1149,6 +1168,7 @@ type LocalIndex = Index
|
|||||||
type GlobalIndex = Index
|
type GlobalIndex = Index
|
||||||
type TableIndex = Index
|
type TableIndex = Index
|
||||||
type MemoryIndex = Index
|
type MemoryIndex = Index
|
||||||
|
type ElemIndex = Index
|
||||||
|
|
||||||
data PlainInstr =
|
data PlainInstr =
|
||||||
-- Control instructions
|
-- Control instructions
|
||||||
@@ -1199,6 +1219,14 @@ data PlainInstr =
|
|||||||
| I64Store32 MemArg
|
| I64Store32 MemArg
|
||||||
| CurrentMemory
|
| CurrentMemory
|
||||||
| GrowMemory
|
| GrowMemory
|
||||||
|
-- Table instructions
|
||||||
|
| TableInit TableIndex ElemIndex
|
||||||
|
| TableGrow TableIndex
|
||||||
|
| TableSize TableIndex
|
||||||
|
| TableFill TableIndex
|
||||||
|
| TableGet TableIndex
|
||||||
|
| TableSet TableIndex
|
||||||
|
| TableCopy TableIndex TableIndex
|
||||||
-- Numeric instructions
|
-- Numeric instructions
|
||||||
| I32Const Integer
|
| I32Const Integer
|
||||||
| I64Const Integer
|
| I64Const Integer
|
||||||
@@ -1670,6 +1698,13 @@ desugarize fields = do
|
|||||||
synInstrToStruct _ (PlainInstr (I64Store32 memArg)) = return $ S.I64Store32 memArg
|
synInstrToStruct _ (PlainInstr (I64Store32 memArg)) = return $ S.I64Store32 memArg
|
||||||
synInstrToStruct _ (PlainInstr CurrentMemory) = return $ S.CurrentMemory
|
synInstrToStruct _ (PlainInstr CurrentMemory) = return $ S.CurrentMemory
|
||||||
synInstrToStruct _ (PlainInstr GrowMemory) = return $ S.GrowMemory
|
synInstrToStruct _ (PlainInstr GrowMemory) = return $ S.GrowMemory
|
||||||
|
synInstrToStruct FunCtx { ctxMod } (PlainInstr (TableInit tableIdx elemIdx)) =
|
||||||
|
case getTableIndex ctxMod tableIdx of
|
||||||
|
Just tableIdx ->
|
||||||
|
case getElemIndex ctxMod elemIdx of
|
||||||
|
Just elemIdx -> return $ S.TableInit tableIdx elemIdx
|
||||||
|
Nothing -> Left "unknown elem"
|
||||||
|
Nothing -> Left "unknown table"
|
||||||
synInstrToStruct _ (PlainInstr (I32Const val)) = return $ S.I32Const $ integerToWord32 val
|
synInstrToStruct _ (PlainInstr (I32Const val)) = return $ S.I32Const $ integerToWord32 val
|
||||||
synInstrToStruct _ (PlainInstr (I64Const val)) = return $ S.I64Const $ integerToWord64 val
|
synInstrToStruct _ (PlainInstr (I64Const val)) = return $ S.I64Const $ integerToWord64 val
|
||||||
synInstrToStruct _ (PlainInstr (F32Const val)) = return $ S.F32Const val
|
synInstrToStruct _ (PlainInstr (F32Const val)) = return $ S.F32Const val
|
||||||
@@ -1958,6 +1993,15 @@ desugarize fields = do
|
|||||||
extractElemSegment elems (MFElem elem) = elem : elems
|
extractElemSegment elems (MFElem elem) = elem : elems
|
||||||
extractElemSegment elems _ = elems
|
extractElemSegment elems _ = elems
|
||||||
|
|
||||||
|
getElemIndex :: Module -> GlobalIndex -> Maybe Natural
|
||||||
|
getElemIndex mod@Module { elems } (Named id) =
|
||||||
|
let isIdent (_, ElemSegment { ident }) = ident == Just id in
|
||||||
|
let elemIndexes = map fst $ filter isIdent $ zip [0..] elems in
|
||||||
|
case elemIndexes of
|
||||||
|
[idx] -> return idx
|
||||||
|
_ -> Nothing
|
||||||
|
getElemIndex _ (Index idx) = Just idx
|
||||||
|
|
||||||
-- data segment
|
-- data segment
|
||||||
synDataToStruct :: Module -> DataSegment -> Either String S.DataSegment
|
synDataToStruct :: Module -> DataSegment -> Either String S.DataSegment
|
||||||
synDataToStruct mod DataSegment { memIndex, offset, datastring } =
|
synDataToStruct mod DataSegment { memIndex, offset, datastring } =
|
||||||
|
|||||||
@@ -103,6 +103,7 @@ type LocalIndex = Natural
|
|||||||
type GlobalIndex = Natural
|
type GlobalIndex = Natural
|
||||||
type MemoryIndex = Natural
|
type MemoryIndex = Natural
|
||||||
type TableIndex = Natural
|
type TableIndex = Natural
|
||||||
|
type ElemIndex = Natural
|
||||||
|
|
||||||
data ValueType =
|
data ValueType =
|
||||||
I32
|
I32
|
||||||
@@ -176,6 +177,14 @@ data Instruction index =
|
|||||||
| I64Store32 MemArg
|
| I64Store32 MemArg
|
||||||
| CurrentMemory
|
| CurrentMemory
|
||||||
| GrowMemory
|
| GrowMemory
|
||||||
|
-- Table instructions
|
||||||
|
| TableInit TableIndex ElemIndex
|
||||||
|
| TableGrow TableIndex
|
||||||
|
| TableSize TableIndex
|
||||||
|
| TableFill TableIndex
|
||||||
|
| TableGet TableIndex
|
||||||
|
| TableSet TableIndex
|
||||||
|
| TableCopy TableIndex TableIndex
|
||||||
-- Numeric instructions
|
-- Numeric instructions
|
||||||
| I32Const Word32
|
| I32Const Word32
|
||||||
| I64Const Word64
|
| I64Const Word64
|
||||||
|
|||||||
Reference in New Issue
Block a user