| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent 5d18a71 commit 0fd4db2
174 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -25,7 +25,7 @@ | |||
| 25 | 25 | }, | |
| 26 | 26 | "engineStrict": true, | |
| 27 | 27 | "dependencies": { | |
| 28 | - "binaryen": "110.0.0-nightly.20221019", | ||
| 28 | + "binaryen": "110.0.0-nightly.20221105", | ||
| 29 | 29 | "long": "^5.2.0" | |
| 30 | 30 | }, | |
| 31 | 31 | "devDependencies": { | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -1622,6 +1622,15 @@ export const enum SourceKind { | |||
| 1622 | 1622 | ||
| 1623 | 1623 | /** A top-level source node. */ | |
| 1624 | 1624 | export class Source extends Node { | |
| 1625 | + | ||
| 1626 | + /** Gets the special native source. */ | ||
| 1627 | + static get native(): Source { | ||
| 1628 | + let source = Source._native; | ||
| 1629 | + if (!source) Source._native = source = new Source(SourceKind.LibraryEntry, LIBRARY_PREFIX + "native.ts", "[native code]"); | ||
| 1630 | + return source; | ||
| 1631 | + } | ||
| 1632 | + private static _native: Source | null = null; | ||
| 1633 | + | ||
| 1625 | 1634 | constructor( | |
| 1626 | 1635 | /** Source kind. */ | |
| 1627 | 1636 | public sourceKind: SourceKind, | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -5,7 +5,8 @@ import { | |||
| 5 | 5 | LiteralExpression, | |
| 6 | 6 | StringLiteralExpression, | |
| 7 | 7 | TemplateLiteralExpression, | |
| 8 | - findDecorator | ||
| 8 | + findDecorator, | ||
| 9 | + Source | ||
| 9 | 10 | } from "../ast"; | |
| 10 | 11 | ||
| 11 | 12 | import { | |
@@ -22,7 +23,7 @@ import { | |||
| 22 | 23 | Interface, | |
| 23 | 24 | Enum, | |
| 24 | 25 | EnumValue, | |
| 25 | - Field | ||
| 26 | + PropertyPrototype | ||
| 26 | 27 | } from "../program"; | |
| 27 | 28 | ||
| 28 | 29 | import { | |
@@ -446,10 +447,6 @@ export class JSBuilder extends ExportsWalker { | |||
| 446 | 447 | this.visitClass(name, element); | |
| 447 | 448 | } | |
| 448 | 449 | ||
| 449 | - visitField(name: string, element: Field): void { | ||
| 450 | - // not implemented | ||
| 451 | - } | ||
| 452 | - | ||
| 453 | 450 | visitNamespace(name: string, element: Element): void { | |
| 454 | 451 | // not implemented | |
| 455 | 452 | } | |
@@ -1241,12 +1238,14 @@ export class JSBuilder extends ExportsWalker { | |||
| 1241 | 1238 | for (let _keys = Map_keys(members), i = 0, k = _keys.length; i < k; ++i) { | |
| 1242 | 1239 | let memberName = _keys[i]; | |
| 1243 | 1240 | let member = assert(members.get(memberName)); | |
| 1244 | - if (member.kind != ElementKind.Field) continue; | ||
| 1245 | - let field = <Field>member; | ||
| 1241 | + if (member.kind != ElementKind.PropertyPrototype) continue; | ||
| 1242 | + let property = (<PropertyPrototype>member).instance; // resolved during class finalization | ||
| 1243 | + if (!property || !property.isField) continue; | ||
| 1244 | + assert(property.memoryOffset >= 0); | ||
| 1246 | 1245 | indent(sb, this.indentLevel); | |
| 1247 | - sb.push(field.name); | ||
| 1246 | + sb.push(property.name); | ||
| 1248 | 1247 | sb.push(": "); | |
| 1249 | - this.makeLiftFromMemory(field.type, sb, "pointer + " + field.memoryOffset.toString()); | ||
| 1248 | + this.makeLiftFromMemory(property.type, sb, "pointer + " + property.memoryOffset.toString()); | ||
| 1250 | 1249 | sb.push(",\n"); | |
| 1251 | 1250 | } | |
| 1252 | 1251 | } | |
@@ -1283,10 +1282,12 @@ export class JSBuilder extends ExportsWalker { | |||
| 1283 | 1282 | for (let _keys = Map_keys(members), i = 0, k = _keys.length; i < k; ++i) { | |
| 1284 | 1283 | let memberName = _keys[i]; | |
| 1285 | 1284 | let member = assert(members.get(memberName)); | |
| 1286 | - if (member.kind != ElementKind.Field) continue; | ||
| 1287 | - let field = <Field>member; | ||
| 1285 | + if (member.kind != ElementKind.PropertyPrototype) continue; | ||
| 1286 | + let property = (<PropertyPrototype>member).instance; // resolved during class finalization | ||
| 1287 | + if (!property || !property.isField) continue; | ||
| 1288 | + assert(property.memoryOffset >= 0); | ||
| 1288 | 1289 | indent(sb, this.indentLevel); | |
| 1289 | - this.makeLowerToMemory(field.type, sb, "pointer + " + field.memoryOffset.toString(), "value." + memberName); | ||
| 1290 | + this.makeLowerToMemory(property.type, sb, "pointer + " + property.memoryOffset.toString(), "value." + memberName); | ||
| 1290 | 1291 | sb.push(";\n"); | |
| 1291 | 1292 | } | |
| 1292 | 1293 | } | |
@@ -1343,7 +1344,7 @@ function isPlainObject(clazz: Class): bool { | |||
| 1343 | 1344 | if (member.isAny(CommonFlags.Private | CommonFlags.Protected)) return false; | |
| 1344 | 1345 | if (member.is(CommonFlags.Constructor)) { | |
| 1345 | 1346 | // a generated constructor is ok | |
| 1346 | - if (member.declaration.range != member.program.nativeRange) return false; | ||
| 1347 | + if (member.declaration.range != Source.native.range) return false; | ||
| 1347 | 1348 | } | |
| 1348 | 1349 | } | |
| 1349 | 1350 | } | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -1,3 +1,7 @@ | |||
| 1 | + import { | ||
| 2 | + Source | ||
| 3 | + } from "../ast"; | ||
| 4 | + | ||
| 1 | 5 | import { | |
| 2 | 6 | CommonFlags | |
| 3 | 7 | } from "../common"; | |
@@ -10,8 +14,8 @@ import { | |||
| 10 | 14 | Interface, | |
| 11 | 15 | Enum, | |
| 12 | 16 | ElementKind, | |
| 13 | - Field, | ||
| 14 | - Element | ||
| 17 | + Element, | ||
| 18 | + PropertyPrototype | ||
| 15 | 19 | } from "../program"; | |
| 16 | 20 | ||
| 17 | 21 | import { | |
@@ -168,10 +172,6 @@ export class TSDBuilder extends ExportsWalker { | |||
| 168 | 172 | // not implemented | |
| 169 | 173 | } | |
| 170 | 174 | ||
| 171 | - visitField(name: string, element: Field): void { | ||
| 172 | - // not implemented | ||
| 173 | - } | ||
| 174 | - | ||
| 175 | 175 | visitNamespace(name: string, element: Element): void { | |
| 176 | 176 | // not implemented | |
| 177 | 177 | } | |
@@ -238,7 +238,7 @@ export class TSDBuilder extends ExportsWalker { | |||
| 238 | 238 | if (member.isAny(CommonFlags.Private | CommonFlags.Protected)) return false; | |
| 239 | 239 | if (member.is(CommonFlags.Constructor)) { | |
| 240 | 240 | // a generated constructor is ok | |
| 241 | - if (member.declaration.range != this.program.nativeRange) return false; | ||
| 241 | + if (member.declaration.range != Source.native.range) return false; | ||
| 242 | 242 | } | |
| 243 | 243 | } | |
| 244 | 244 | } | |
@@ -347,15 +347,16 @@ export class TSDBuilder extends ExportsWalker { | |||
| 347 | 347 | for (let _keys = Map_keys(members), i = 0, k = _keys.length; i < k; ++i) { | |
| 348 | 348 | let memberName = _keys[i]; | |
| 349 | 349 | let member = assert(members.get(memberName)); | |
| 350 | - if (member.kind != ElementKind.Field) continue; | ||
| 351 | - let field = <Field>member; | ||
| 350 | + if (member.kind != ElementKind.PropertyPrototype) continue; | ||
| 351 | + let property = (<PropertyPrototype>member).instance; // resolved during class finalization | ||
| 352 | + if (!property || !property.isField) continue; | ||
| 352 | 353 | sb.push(" /** @type `"); | |
| 353 | - sb.push(field.type.toString()); | ||
| 354 | + sb.push(property.type.toString()); | ||
| 354 | 355 | sb.push("` */\n "); | |
| 355 | - sb.push(field.name); | ||
| 356 | + sb.push(property.name); | ||
| 356 | 357 | sb.push(": "); | |
| 357 | - sb.push(this.toTypeScriptType(field.type, mode)); | ||
| 358 | - if (this.fieldAcceptsUndefined(field.type)) { | ||
| 358 | + sb.push(this.toTypeScriptType(property.type, mode)); | ||
| 359 | + if (this.fieldAcceptsUndefined(property.type)) { | ||
| 359 | 360 | sb.push(" | TOmittable"); | |
| 360 | 361 | } | |
| 361 | 362 | sb.push(";\n"); | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -14,7 +14,6 @@ import { | |||
| 14 | 14 | Enum, | |
| 15 | 15 | Class, | |
| 16 | 16 | Interface, | |
| 17 | - Field, | ||
| 18 | 17 | File, | |
| 19 | 18 | FunctionPrototype, | |
| 20 | 19 | Global, | |
@@ -95,11 +94,6 @@ export abstract class ExportsWalker { | |||
| 95 | 94 | this.visitClassInstances(name, <ClassPrototype>element); | |
| 96 | 95 | break; | |
| 97 | 96 | } | |
| 98 | - case ElementKind.Field: { | ||
| 99 | - let fieldInstance = <Field>element; | ||
| 100 | - if (fieldInstance.is(CommonFlags.Compiled)) this.visitField(name, fieldInstance); | ||
| 101 | - break; | ||
| 102 | - } | ||
| 103 | 97 | case ElementKind.PropertyPrototype: { | |
| 104 | 98 | let propertyInstance = (<PropertyPrototype>element).instance; | |
| 105 | 99 | if (!propertyInstance) break; | |
@@ -150,7 +144,6 @@ export abstract class ExportsWalker { | |||
| 150 | 144 | abstract visitFunction(name: string, element: Function): void; | |
| 151 | 145 | abstract visitClass(name: string, element: Class): void; | |
| 152 | 146 | abstract visitInterface(name: string, element: Interface): void; | |
| 153 | - abstract visitField(name: string, element: Field): void; | ||
| 154 | 147 | abstract visitNamespace(name: string, element: Element): void; | |
| 155 | 148 | abstract visitAlias(name: string, element: Element, originalName: string): void; | |
| 156 | 149 | } | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -80,11 +80,10 @@ import { | |||
| 80 | 80 | import { | |
| 81 | 81 | ElementKind, | |
| 82 | 82 | FunctionPrototype, | |
| 83 | - Field, | ||
| 84 | 83 | Global, | |
| 85 | 84 | DecoratorFlags, | |
| 86 | - ClassPrototype, | ||
| 87 | - Class | ||
| 85 | + Class, | ||
| 86 | + PropertyPrototype | ||
| 88 | 87 | } from "./program"; | |
| 89 | 88 | ||
| 90 | 89 | import { | |
@@ -1075,11 +1074,12 @@ function builtin_offsetof(ctx: BuiltinContext): ExpressionRef { | |||
| 1075 | 1074 | return module.unreachable(); | |
| 1076 | 1075 | } | |
| 1077 | 1076 | let fieldName = (<StringLiteralExpression>firstOperand).value; | |
| 1078 | - let classMembers = classReference.members; | ||
| 1079 | - if (classMembers && classMembers.has(fieldName)) { | ||
| 1080 | - let member = assert(classMembers.get(fieldName)); | ||
| 1081 | - if (member.kind == ElementKind.Field) { | ||
| 1082 | - return contextualUsize(compiler, i64_new((<Field>member).memoryOffset), contextualType); | ||
| 1077 | + let fieldMember = classReference.getMember(fieldName); | ||
| 1078 | + if (fieldMember && fieldMember.kind == ElementKind.PropertyPrototype) { | ||
| 1079 | + let property = (<PropertyPrototype>fieldMember).instance; | ||
| 1080 | + if (property && property.isField) { | ||
| 1081 | + assert(property.memoryOffset >= 0); | ||
| 1082 | + return contextualUsize(compiler, i64_new(property.memoryOffset), contextualType); | ||
| 1083 | 1083 | } | |
| 1084 | 1084 | } | |
| 1085 | 1085 | compiler.error( | |
@@ -10261,32 +10261,31 @@ function ensureVisitMembersOf(compiler: Compiler, instance: Class): void { | |||
| 10261 | 10261 | // TODO: for (let member of members.values()) { | |
| 10262 | 10262 | for (let _values = Map_values(members), j = 0, l = _values.length; j < l; ++j) { | |
| 10263 | 10263 | let member = unchecked(_values[j]); | |
| 10264 | - if (member.kind == ElementKind.Field) { | ||
| 10265 | - if ((<Field>member).parent == instance) { | ||
| 10266 | - let fieldType = (<Field>member).type; | ||
| 10267 | - if (fieldType.isManaged) { | ||
| 10268 | - let fieldOffset = (<Field>member).memoryOffset; | ||
| 10269 | - assert(fieldOffset >= 0); | ||
| 10270 | - needsTempValue = true; | ||
| 10271 | - body.push( | ||
| 10272 | - // if ($2 = value) __visit($2, $1) | ||
| 10273 | - module.if( | ||
| 10274 | - module.local_tee(2, | ||
| 10275 | - module.load(sizeTypeSize, false, | ||
| 10276 | - module.local_get(0, sizeTypeRef), | ||
| 10277 | - sizeTypeRef, fieldOffset | ||
| 10278 | - ), | ||
| 10279 | - false // internal | ||
| 10280 | - ), | ||
| 10281 | - module.call(visitInstance.internalName, [ | ||
| 10282 | - module.local_get(2, sizeTypeRef), // value | ||
| 10283 | - module.local_get(1, TypeRef.I32) // cookie | ||
| 10284 | - ], TypeRef.None) | ||
| 10285 | - ) | ||
| 10286 | - ); | ||
| 10287 | - } | ||
| 10288 | - } | ||
| 10289 | - } | ||
| 10264 | + if (member.kind != ElementKind.PropertyPrototype) continue; | ||
| 10265 | + // Class should have resolved fields during finalization | ||
| 10266 | + let property = (<PropertyPrototype>member).instance; | ||
| 10267 | + if (!property) continue; | ||
| 10268 | + let fieldType = property.type; | ||
| 10269 | + if (!property.isField || property.getBoundClassOrInterface() != instance || !fieldType.isManaged) continue; | ||
| 10270 | + let fieldOffset = property.memoryOffset; | ||
| 10271 | + assert(fieldOffset >= 0); | ||
| 10272 | + needsTempValue = true; | ||
| 10273 | + body.push( | ||
| 10274 | + // if ($2 = value) __visit($2, $1) | ||
| 10275 | + module.if( | ||
| 10276 | + module.local_tee(2, | ||
| 10277 | + module.load(sizeTypeSize, false, | ||
| 10278 | + module.local_get(0, sizeTypeRef), | ||
| 10279 | + sizeTypeRef, fieldOffset | ||
| 10280 | + ), | ||
| 10281 | + false // internal | ||
| 10282 | + ), | ||
| 10283 | + module.call(visitInstance.internalName, [ | ||
| 10284 | + module.local_get(2, sizeTypeRef), // value | ||
| 10285 | + module.local_get(1, TypeRef.I32) // cookie | ||
| 10286 | + ], TypeRef.None) | ||
| 10287 | + ) | ||
| 10288 | + ); | ||
| 10290 | 10289 | } | |
| 10291 | 10290 | } | |
| 10292 | 10291 | } | |
@@ -10458,66 +10457,6 @@ export function compileRTTI(compiler: Compiler): void { | |||
| 10458 | 10457 | } | |
| 10459 | 10458 | } | |
| 10460 | 10459 | ||
| 10461 | - /** Compiles a class-specific instanceof helper, checking a ref against all concrete instances. */ | ||
| 10462 | - export function compileClassInstanceOf(compiler: Compiler, prototype: ClassPrototype): void { | ||
| 10463 | - let module = compiler.module; | ||
| 10464 | - let sizeTypeRef = compiler.options.sizeTypeRef; | ||
| 10465 | - let instanceofInstance = assert(prototype.program.instanceofInstance); | ||
| 10466 | - compiler.compileFunction(instanceofInstance); | ||
| 10467 | - | ||
| 10468 | - let stmts = new Array<ExpressionRef>(); | ||
| 10469 | - | ||
| 10470 | - // if (!ref) return false | ||
| 10471 | - stmts.push( | ||
| 10472 | - module.if( | ||
| 10473 | - module.unary( | ||
| 10474 | - sizeTypeRef == TypeRef.I64 | ||
| 10475 | - ? UnaryOp.EqzI64 | ||
| 10476 | - : UnaryOp.EqzI32, | ||
| 10477 | - module.local_get(0, sizeTypeRef) | ||
| 10478 | - ), | ||
| 10479 | - module.return( | ||
| 10480 | - module.i32(0) | ||
| 10481 | - ) | ||
| 10482 | - ) | ||
| 10483 | - ); | ||
| 10484 | - | ||
| 10485 | - // if (__instanceof(ref, ID[i])) return true | ||
| 10486 | - let instances = prototype.instances; | ||
| 10487 | - if (instances && instances.size > 0) { | ||
| 10488 | - // TODO: for (let instance of instances.values()) { | ||
| 10489 | - for (let _values = Map_values(instances), i = 0, k = _values.length; i < k; ++i) { | ||
| 10490 | - let instance = unchecked(_values[i]); | ||
| 10491 | - stmts.push( | ||
| 10492 | - module.if( | ||
| 10493 | - module.call(instanceofInstance.internalName, [ | ||
| 10494 | - module.local_get(0, sizeTypeRef), | ||
| 10495 | - module.i32(instance.id) | ||
| 10496 | - ], TypeRef.I32), | ||
| 10497 | - module.return( | ||
| 10498 | - module.i32(1) | ||
| 10499 | - ) | ||
| 10500 | - ) | ||
| 10501 | - ); | ||
| 10502 | - } | ||
| 10503 | - } | ||
| 10504 | - | ||
| 10505 | - // return false | ||
| 10506 | - stmts.push( | ||
| 10507 | - module.return( | ||
| 10508 | - module.i32(0) | ||
| 10509 | - ) | ||
| 10510 | - ); | ||
| 10511 | - | ||
| 10512 | - module.addFunction( | ||
| 10513 | - `${prototype.internalName}~instanceof`, | ||
| 10514 | - sizeTypeRef, | ||
| 10515 | - TypeRef.I32, | ||
| 10516 | - null, | ||
| 10517 | - module.flatten(stmts) | ||
| 10518 | - ); | ||
| 10519 | - } | ||
| 10520 | - | ||
| 10521 | 10460 | // Helpers | |
| 10522 | 10461 | ||
| 10523 | 10462 | let checkConstantType_expr: ExpressionRef = 0; | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -73,8 +73,8 @@ export const enum CommonFlags { | |||
| 73 | 73 | Scoped = 1 << 26, | |
| 74 | 74 | /** Is a stub. */ | |
| 75 | 75 | Stub = 1 << 27, | |
| 76 | - /** Is a virtual method. */ | ||
| 77 | - Virtual = 1 << 28, | ||
| 76 | + /** Is an overridden method. */ | ||
| 77 | + Overridden = 1 << 28, | ||
| 78 | 78 | /** Is (part of) a closure. */ | |
| 79 | 79 | Closure = 1 << 29, | |
| 80 | 80 | ||
@@ -257,7 +257,6 @@ export namespace CommonNames { | |||
| 257 | 257 | export const link = "__link"; | |
| 258 | 258 | export const collect = "__collect"; | |
| 259 | 259 | export const typeinfo = "__typeinfo"; | |
| 260 | - export const instanceof_ = "__instanceof"; | ||
| 261 | 260 | export const visit = "__visit"; | |
| 262 | 261 | export const newBuffer = "__newBuffer"; | |
| 263 | 262 | export const newArray = "__newArray"; | |
| Back | FazBrowse Home | New Git URL |
0 commit comments