Add isArrayLike builtin (#453)

This commit is contained in:
Max Graey
2019-02-27 22:47:52 +02:00
committed by Daniel Wirtz
parent e8b0767143
commit aad263e670
8 changed files with 327 additions and 212 deletions

View File

@ -47,6 +47,7 @@ import {
import {
ElementKind,
OperatorKind,
FunctionPrototype,
Class,
Field,
@ -64,7 +65,7 @@ import {
} from "./resolver";
import {
CommonFlags, CommonSymbols
CommonFlags
} from "./common";
/** Symbols of various compiler built-ins. */
@ -76,6 +77,7 @@ export namespace BuiltinSymbols {
export const isReference = "~lib/builtins/isReference";
export const isString = "~lib/builtins/isString";
export const isArray = "~lib/builtins/isArray";
export const isArrayLike = "~lib/builtins/isArrayLike";
export const isFunction = "~lib/builtins/isFunction";
export const isNullable = "~lib/builtins/isNullable";
export const isDefined = "~lib/builtins/isDefined";
@ -350,6 +352,19 @@ export function compileCall(
: 0
);
}
case BuiltinSymbols.isArrayLike: { // isArrayLike<T!>() / isArrayLike<T?>(value: T) -> bool
let type = evaluateConstantType(compiler, typeArguments, operands, reportNode);
compiler.currentType = Type.bool;
if (!type) return module.createUnreachable();
let classReference = type.classReference;
if (!classReference) return module.createI32(0);
return module.createI32(
classReference.lookupInSelf("length") && (
classReference.lookupOverload(OperatorKind.INDEXED_GET) ||
classReference.lookupOverload(OperatorKind.UNCHECKED_INDEXED_GET)
) ? 1 : 0
);
}
case BuiltinSymbols.isFunction: { // isFunction<T!> / isFunction<T?>(value: T) -> bool
let type = evaluateConstantType(compiler, typeArguments, operands, reportNode);
compiler.currentType = Type.bool;