type5 is much more first principles based, so we get a lot of weird quirks removed: - FromLiteral no longer needs to understand AST - Type unifications works more like Haskell - Function types are just ordinary types, saving a lot of manual busywork and more.
78 lines
2.3 KiB
Python
78 lines
2.3 KiB
Python
"""
|
|
The default class for build environments.
|
|
|
|
Contains the compiler builtins as well as some sane defaults.
|
|
"""
|
|
from ..type5 import typeexpr as type5typeexpr
|
|
from ..wasm import (
|
|
WasmTypeFloat32,
|
|
WasmTypeFloat64,
|
|
WasmTypeInt32,
|
|
WasmTypeInt64,
|
|
)
|
|
from ..wasmgenerator import Generator
|
|
from .base import BuildBase, TypeInfo
|
|
from .typeclasses import (
|
|
bits,
|
|
convertable,
|
|
eq,
|
|
extendable,
|
|
floating,
|
|
# foldable,
|
|
fractional,
|
|
integral,
|
|
intnum,
|
|
natnum,
|
|
ord,
|
|
promotable,
|
|
reinterpretable,
|
|
sized,
|
|
# subscriptable,
|
|
)
|
|
|
|
|
|
class BuildDefault(BuildBase[Generator]):
|
|
__slots__ = ()
|
|
|
|
def __init__(self) -> None:
|
|
super().__init__()
|
|
|
|
self.type_info_map.update({
|
|
'u16': TypeInfo('u16', WasmTypeInt32, 'i32.load16_u', 'i32.store16', 2, False),
|
|
'u64': TypeInfo('u64', WasmTypeInt64, 'i64.load', 'i64.store', 8, False),
|
|
'i8': TypeInfo('i8', WasmTypeInt32, 'i32.load8_s', 'i32.store8', 1, True),
|
|
'i16': TypeInfo('i16', WasmTypeInt32, 'i32.load16_s', 'i32.store16', 2, True),
|
|
'i32': TypeInfo('i32', WasmTypeInt32, 'i32.load', 'i32.store', 4, True),
|
|
'i64': TypeInfo('i64', WasmTypeInt64, 'i64.load', 'i64.store', 8, True),
|
|
'f32': TypeInfo('f32', WasmTypeFloat32, 'f32.load', 'f32.store', 4, None),
|
|
'f64': TypeInfo('f64', WasmTypeFloat64, 'f64.load', 'f64.store', 8, None),
|
|
})
|
|
|
|
self.types.update({
|
|
'u16': type5typeexpr.AtomicType('u16'),
|
|
'u64': type5typeexpr.AtomicType('u64'),
|
|
'i8': type5typeexpr.AtomicType('i8'),
|
|
'i16': type5typeexpr.AtomicType('i16'),
|
|
'i32': type5typeexpr.AtomicType('i32'),
|
|
'i64': type5typeexpr.AtomicType('i64'),
|
|
'f32': type5typeexpr.AtomicType('f32'),
|
|
'f64': type5typeexpr.AtomicType('f64'),
|
|
})
|
|
|
|
tc_list = [
|
|
bits,
|
|
eq, ord,
|
|
extendable, promotable,
|
|
convertable, reinterpretable,
|
|
natnum, intnum, fractional, floating,
|
|
integral,
|
|
# foldable, subscriptable,
|
|
sized,
|
|
]
|
|
|
|
for tc in tc_list:
|
|
tc.load(self)
|
|
|
|
for tc in tc_list:
|
|
tc.wasm(self)
|