@@ -623,9 +623,12 @@ export class Compiler extends DiagnosticEmitter {
623623 break ;
624624 }
625625 case ElementKind . FIELD : {
626- this . makeExportedFieldGetter ( prefix + GETTER_PREFIX + name , < Field > element ) ;
627- if ( ! element . is ( CommonFlags . READONLY ) ) {
628- this . makeExportedFieldSetter ( prefix + SETTER_PREFIX + name , < Field > element ) ;
626+ if ( element . is ( CommonFlags . COMPILED ) ) {
627+ let module = this . module ;
628+ module . addFunctionExport ( ( < Field > element ) . internalGetterName , prefix + GETTER_PREFIX + name ) ;
629+ if ( ! element . is ( CommonFlags . READONLY ) ) {
630+ module . addFunctionExport ( ( < Field > element ) . internalSetterName , prefix + SETTER_PREFIX + name ) ;
631+ }
629632 }
630633 break ;
631634 }
@@ -674,48 +677,6 @@ export class Compiler extends DiagnosticEmitter {
674677 }
675678 }
676679
677- /** Makes an exported function to get the value of an instance field. */
678- private makeExportedFieldGetter ( name : string , field : Field ) : void {
679- var type = field . type ;
680- var nativeThisType = this . options . nativeSizeType ;
681- var nativeValueType = type . toNativeType ( ) ;
682- var module = this . module ;
683- var returnExpr = module . load ( type . byteSize , type . is ( TypeFlags . SIGNED ) ,
684- module . local_get ( 0 , nativeThisType ) ,
685- nativeValueType , field . memoryOffset
686- ) ;
687- // functions retain the return value for the caller
688- if ( type . isManaged ) returnExpr = this . makeRetain ( returnExpr ) ;
689- module . addFunction ( name , nativeThisType , nativeValueType , null , returnExpr ) ;
690- module . addFunctionExport ( name , name ) ;
691- }
692-
693- /** Makes an exported function to set the value of an instance field. */
694- private makeExportedFieldSetter ( name : string , field : Field ) : void {
695- var type = field . type ;
696- var nativeThisType = this . options . nativeSizeType ;
697- var nativeValueType = type . toNativeType ( ) ;
698- var module = this . module ;
699- var valueExpr = module . local_get ( 1 , nativeValueType ) ;
700- if ( type . isManaged ) {
701- valueExpr = this . makeReplace (
702- module . load ( type . byteSize , false ,
703- module . local_get ( 0 , nativeThisType ) ,
704- nativeValueType , field . memoryOffset
705- ) ,
706- valueExpr
707- ) ;
708- }
709- module . addFunction ( name , createType ( [ nativeThisType , nativeValueType ] ) , NativeType . None , null ,
710- module . store ( type . byteSize ,
711- module . local_get ( 0 , nativeThisType ) ,
712- valueExpr ,
713- nativeValueType , field . memoryOffset
714- )
715- ) ;
716- module . addFunctionExport ( name , name ) ;
717- }
718-
719680 // === Elements =================================================================================
720681
721682 /** Compiles any element. */
@@ -1423,15 +1384,12 @@ export class Compiler extends DiagnosticEmitter {
14231384 }
14241385 break ;
14251386 }
1426- case ElementKind . FIELD_PROTOTYPE : {
1427- element . set ( CommonFlags . COMPILED ) ;
1387+ case ElementKind . FIELD : {
1388+ this . compileField ( < Field > element ) ;
14281389 break ;
14291390 }
14301391 case ElementKind . PROPERTY : {
1431- let getterInstance = ( < Property > element ) . getterInstance ;
1432- if ( getterInstance ) this . compileFunction ( getterInstance ) ;
1433- let setterInstance = ( < Property > element ) . setterInstance ;
1434- if ( setterInstance ) this . compileFunction ( setterInstance ) ;
1392+ this . compileProperty ( < Property > element ) ;
14351393 break ;
14361394 }
14371395 }
@@ -1440,6 +1398,56 @@ export class Compiler extends DiagnosticEmitter {
14401398 return true ;
14411399 }
14421400
1401+ /** Compiles an instance field to a getter and a setter. */
1402+ compileField ( instance : Field ) : bool {
1403+ if ( instance . is ( CommonFlags . COMPILED ) ) return true ;
1404+ instance . set ( CommonFlags . COMPILED ) ;
1405+ var type = instance . type ;
1406+ var nativeThisType = this . options . nativeSizeType ;
1407+ var nativeValueType = type . toNativeType ( ) ;
1408+ var module = this . module ;
1409+
1410+ // Make a getter
1411+ var returnExpr = module . load ( type . byteSize , type . is ( TypeFlags . SIGNED ) ,
1412+ module . local_get ( 0 , nativeThisType ) ,
1413+ nativeValueType , instance . memoryOffset
1414+ ) ;
1415+ if ( type . isManaged ) returnExpr = this . makeRetain ( returnExpr ) ;
1416+ module . addFunction ( instance . internalGetterName , nativeThisType , nativeValueType , null , returnExpr ) ;
1417+
1418+ // Make a setter
1419+ var valueExpr = module . local_get ( 1 , nativeValueType ) ;
1420+ if ( type . isManaged ) {
1421+ valueExpr = this . makeReplace (
1422+ module . load ( type . byteSize , false ,
1423+ module . local_get ( 0 , nativeThisType ) ,
1424+ nativeValueType , instance . memoryOffset
1425+ ) ,
1426+ valueExpr
1427+ ) ;
1428+ }
1429+ module . addFunction ( instance . internalSetterName , createType ( [ nativeThisType , nativeValueType ] ) , NativeType . None , null ,
1430+ module . store ( type . byteSize ,
1431+ module . local_get ( 0 , nativeThisType ) ,
1432+ valueExpr ,
1433+ nativeValueType , instance . memoryOffset
1434+ )
1435+ ) ;
1436+
1437+ return true ;
1438+ }
1439+
1440+ /** Compiles a property to a getter and potentially a setter. */
1441+ compileProperty ( instance : Property ) : bool {
1442+ if ( instance . is ( CommonFlags . COMPILED ) ) return true ;
1443+ instance . set ( CommonFlags . COMPILED ) ;
1444+ var getterInstance = instance . getterInstance ;
1445+ if ( getterInstance ) this . compileFunction ( getterInstance ) ;
1446+ var setterInstance = instance . setterInstance ;
1447+ if ( setterInstance ) this . compileFunction ( setterInstance ) ;
1448+ return true ;
1449+ }
1450+
14431451 // === Memory ===================================================================================
14441452
14451453 /** Adds a static memory segment with the specified data. */
0 commit comments