Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
48 changes: 8 additions & 40 deletions src/backend/binaryen/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -983,21 +983,25 @@ export class WASMGen extends Ts2wasmBackend {
const index = memberFieldsCnt++;
buffer[j + 1] =
(flag & META_FLAG_MASK) | ((index << 4) & META_INDEX_MASK);
buffer[j + 2] = this.getDefinedTypeId(member.valueType);
buffer[j + 2] = FunctionalFuncs.getPredefinedTypeId(
member.valueType,
);
} else if (member.type === MemberType.METHOD) {
const flag = ItableFlag.METHOD;
const index = memberMethodsCnt++;
buffer[j + 1] =
(flag & META_FLAG_MASK) | ((index << 4) & META_INDEX_MASK);
buffer[j + 2] = this.getDefinedTypeId(member.valueType);
buffer[j + 2] = FunctionalFuncs.getPredefinedTypeId(
member.valueType,
);
} else if (member.type === MemberType.ACCESSOR) {
if (member.hasGetter) {
const flag = ItableFlag.GETTER;
const index = memberMethodsCnt++;
buffer[j + 1] =
(flag & META_FLAG_MASK) |
((index << 4) & META_INDEX_MASK);
buffer[j + 2] = this.getDefinedTypeId(
buffer[j + 2] = FunctionalFuncs.getPredefinedTypeId(
(member.getter as VarValue).type,
);
}
Expand All @@ -1011,7 +1015,7 @@ export class WASMGen extends Ts2wasmBackend {
buffer[j + 1] =
(flag & META_FLAG_MASK) |
((index << 4) & META_INDEX_MASK);
buffer[j + 2] = this.getDefinedTypeId(
buffer[j + 2] = FunctionalFuncs.getPredefinedTypeId(
(member.setter as VarValue).type,
);
}
Expand All @@ -1024,42 +1028,6 @@ export class WASMGen extends Ts2wasmBackend {
return offset;
}

private getDefinedTypeId(type: ValueType) {
switch (type.kind) {
case ValueTypeKind.UNDEFINED:
case ValueTypeKind.UNION:
case ValueTypeKind.ANY: {
return PredefinedTypeId.ANY;
}
case ValueTypeKind.NULL:
return PredefinedTypeId.NULL;
case ValueTypeKind.INT:
return PredefinedTypeId.INT;
case ValueTypeKind.NUMBER:
return PredefinedTypeId.NUMBER;
case ValueTypeKind.BOOLEAN:
return PredefinedTypeId.BOOLEAN;
case ValueTypeKind.RAW_STRING:
case ValueTypeKind.STRING:
return PredefinedTypeId.STRING;
case ValueTypeKind.FUNCTION:
/** TODO: create type id for function type base on signature */
return PredefinedTypeId.FUNCTION;
case ValueTypeKind.ARRAY:
return PredefinedTypeId.ARRAY;
case ValueTypeKind.INTERFACE:
case ValueTypeKind.OBJECT: {
const objType = type as ObjectType;
return objType.typeId;
}
default:
Logger.warn(
`encounter type not assigned type id, type kind is ${type.kind}`,
);
return 0;
}
}

public findMethodImplementClass(
meta: ObjectDescription,
member: MemberDescription,
Expand Down
43 changes: 42 additions & 1 deletion src/backend/binaryen/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import { UnimplementError } from '../../error.js';
import { dyntype } from './lib/dyntype/utils.js';
import { SemanticsKind } from '../../semantics/semantics_nodes.js';
import {
ObjectType,
Primitive,
PrimitiveType,
TypeParameterType,
Expand All @@ -33,7 +34,11 @@ import {
stringArrayStructTypeInfo,
stringArrayStructTypeInfoForStringRef,
} from './glue/packType.js';
import { SourceLocation, getBuiltInFuncName } from '../../utils.js';
import {
PredefinedTypeId,
SourceLocation,
getBuiltInFuncName,
} from '../../utils.js';
import {
NewLiteralArrayValue,
SemanticsValue,
Expand Down Expand Up @@ -906,6 +911,7 @@ export namespace FunctionalFuncs {
case ValueTypeKind.BOOLEAN:
case ValueTypeKind.STRING:
case ValueTypeKind.NULL:
case ValueTypeKind.UNDEFINED:
return boxBaseTypeToAny(module, valueRef, valueTypeKind);
case ValueTypeKind.UNION:
case ValueTypeKind.ANY:
Expand Down Expand Up @@ -1754,4 +1760,39 @@ export namespace FunctionalFuncs {
);
return ifShapeCompatibal;
}

export function getPredefinedTypeId(type: ValueType) {
switch (type.kind) {
case ValueTypeKind.UNDEFINED:
case ValueTypeKind.UNION:
case ValueTypeKind.TYPE_PARAMETER:
case ValueTypeKind.ANY: {
return PredefinedTypeId.ANY;
}
case ValueTypeKind.NULL:
return PredefinedTypeId.NULL;
case ValueTypeKind.INT:
return PredefinedTypeId.INT;
case ValueTypeKind.NUMBER:
return PredefinedTypeId.NUMBER;
case ValueTypeKind.BOOLEAN:
return PredefinedTypeId.BOOLEAN;
case ValueTypeKind.RAW_STRING:
case ValueTypeKind.STRING:
return PredefinedTypeId.STRING;
case ValueTypeKind.FUNCTION:
return PredefinedTypeId.FUNCTION;
case ValueTypeKind.ARRAY:
return PredefinedTypeId.ARRAY;
case ValueTypeKind.INTERFACE:
case ValueTypeKind.OBJECT: {
const objType = type as ObjectType;
return objType.typeId;
}
default:
throw new UnimplementError(
`encounter type not assigned type id, type kind is ${type.kind}`,
);
}
}
}
Loading