Cface__SmalltalkXGenerator.st
changeset 2 cfd2c393abfe
parent 1 b6c0180314d1
child 3 110a9cbf8594
equal deleted inserted replaced
1:b6c0180314d1 2:cfd2c393abfe
    50     ^self on: aStringOrFilename asFilename readStream
    50     ^self on: aStringOrFilename asFilename readStream
    51 
    51 
    52     "Created: / 08-02-2008 / 08:55:08 / janfrog"
    52     "Created: / 08-02-2008 / 08:55:08 / janfrog"
    53 ! !
    53 ! !
    54 
    54 
    55 !SmalltalkXGenerator methodsFor:'accessing'!
    55 !SmalltalkXGenerator methodsFor:'processing'!
    56 
    56 
    57 analyser
    57 process: node
    58     ^ analyser
       
    59 
    58 
    60     "Created: / 08-02-2008 / 08:39:26 / janfrog"
    59     super process: node.
    61 !
    60     ^changeset
    62 
    61 
    63 analyser:something
    62     "Created: / 03-07-2008 / 21:01:19 / Jan Vrany <vranyj1@fel.cvut.cz>"
    64     analyser := something.
       
    65 
       
    66     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
    67 !
       
    68 
       
    69 cBuilder
       
    70     ^ cBuilder
       
    71 
       
    72     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
    73 !
       
    74 
       
    75 cBuilder:something
       
    76     cBuilder := something.
       
    77 
       
    78     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
    79 !
       
    80 
       
    81 className
       
    82     ^ className
       
    83 
       
    84     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
    85 !
       
    86 
       
    87 className:something
       
    88     className := something.
       
    89 
       
    90     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
    91 !
       
    92 
       
    93 defaultCBuilder
       
    94 
       
    95     ^CCodeBuilder on:outputStream.
       
    96 "    ^CCodeBuilder on:String new writeStream"
       
    97 
       
    98     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
    99 !
       
   100 
       
   101 defaultParser
       
   102 
       
   103     ^Parser
       
   104 
       
   105     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
   106 !
       
   107 
       
   108 defaultStBuilder
       
   109 
       
   110     ^OldSmalltalkCodeBuilder on:outputStream.
       
   111 "    ^CCodeBuilder on:String new writeStream"
       
   112 
       
   113     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
   114     "Modified: / 13-02-2008 / 08:07:12 / janfrog"
       
   115 !
       
   116 
       
   117 fundamentalTypes
       
   118 
       
   119 "
       
   120 Possible combinations:
       
   121 
       
   122 char
       
   123 signed char
       
   124 unsigned char
       
   125 
       
   126 int, signed int
       
   127 short int, short, signed short int, signed short
       
   128 long int, long, signed long int,signed long
       
   129 
       
   130 unsigned int, unsigned
       
   131 unsigned short int, unsigned short
       
   132 unsigned long int, unsigned long
       
   133 
       
   134 float
       
   135 double
       
   136 long double
       
   137 "
       
   138 
       
   139     ^#('char' 'short' 'int' 'long' 'float' 'double' 'void' 'signed' 'unsigned').
       
   140 
       
   141     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
   142 !
       
   143 
       
   144 inputStream
       
   145     ^ inputStream
       
   146 
       
   147     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
   148 !
       
   149 
       
   150 inputStream:something
       
   151     inputStream := something.
       
   152 
       
   153     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
   154 !
       
   155 
       
   156 nameSpace
       
   157     ^ nameSpace
       
   158 
       
   159     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
   160 !
       
   161 
       
   162 nameSpace:something
       
   163     nameSpace := something.
       
   164 
       
   165     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
   166 !
       
   167 
       
   168 outputStream
       
   169     ^ outputStream
       
   170 
       
   171     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
   172 !
       
   173 
       
   174 outputStream:something
       
   175     outputStream := something.
       
   176 
       
   177     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
   178 !
       
   179 
       
   180 parentNode
       
   181     ^ parentNode
       
   182 
       
   183     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
   184 !
       
   185 
       
   186 parentNode:something
       
   187     parentNode := something.
       
   188 
       
   189     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
   190 !
       
   191 
       
   192 parseTree
       
   193     ^ parseTree
       
   194 
       
   195     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
   196 !
       
   197 
       
   198 parseTree:something
       
   199     parseTree := something.
       
   200 
       
   201     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
   202 !
       
   203 
       
   204 parser
       
   205     ^ parser
       
   206 
       
   207     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
   208 !
       
   209 
       
   210 parser:something
       
   211     parser := something.
       
   212 
       
   213     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
   214 !
       
   215 
       
   216 prototypes
       
   217     ^ prototypes
       
   218 
       
   219     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
   220 !
       
   221 
       
   222 prototypes:something
       
   223     prototypes := something.
       
   224 
       
   225     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
   226 !
       
   227 
       
   228 stBuilder
       
   229     ^ stBuilder
       
   230 
       
   231     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
   232 !
       
   233 
       
   234 stBuilder:something
       
   235     stBuilder := something.
       
   236 
       
   237     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
   238 !
       
   239 
       
   240 streamContents
       
   241 
       
   242     ^outputStream streamContents
       
   243 
       
   244     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
   245 ! !
       
   246 
       
   247 !SmalltalkXGenerator methodsFor:'actions'!
       
   248 
       
   249 analyse
       
   250 
       
   251     prototypes := analyser on:parseTree.
       
   252 
       
   253     "Modified: / 17-11-2007 / 09:12:31 / haja"
       
   254     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
   255 !
       
   256 
       
   257 parseDef
       
   258 
       
   259     parser := self defaultParser on:inputStream.
       
   260     parser parse.
       
   261     parseTree := parser nodeStack first.
       
   262 
       
   263     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
   264 !
       
   265 
       
   266 startGeneration:aClassName nameSpace:aNameSpace 
       
   267     className := aClassName.
       
   268     namespace := aNameSpace.
       
   269     self visit:parseTree.
       
   270 
       
   271     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
   272 !
       
   273 
       
   274 startGeneration:aClassName nameSpace:aNameSpace toFile:aFileName 
       
   275     className := aClassName.
       
   276     namespace := aNameSpace.
       
   277     self visit:parseTree.
       
   278     self writeToFile:aFileName.
       
   279 
       
   280     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
   281 ! !
       
   282 
       
   283 !SmalltalkXGenerator methodsFor:'generators'!
       
   284 
       
   285 generateArrayCompositeStructAccessMethod:aStructOrUnionFieldNode in:aStructFieldNode in:aStructNode 
       
   286     self stBuilder 
       
   287         methodFor:aStructNode name
       
   288         category:'accessing'
       
   289         with:[
       
   290             self 
       
   291                 nextPutString:aStructFieldNode name , '_' , aStructOrUnionFieldNode name 
       
   292                         , 'At:position'.
       
   293             self cr.
       
   294             self cr.
       
   295             self generateCommentFor:aStructFieldNode.
       
   296             self generateCommentFor:aStructOrUnionFieldNode.
       
   297             self cr.
       
   298             self stBuilder declareId:#( 'errorString' ).
       
   299             self cr.
       
   300             self cBuilder 
       
   301                 primitiveWith:[
       
   302                     self cBuilder 
       
   303                         if:[ self nextPutString:'not __isInteger( position )'. ]
       
   304                         then:[
       
   305                             self cBuilder 
       
   306                                 assign:[
       
   307                                     self cBuilder functionCall:'__MKSTRING'
       
   308                                         withString:'"Argument position is not integer"'.
       
   309                                 ]
       
   310                                 to:'errorString'.
       
   311                         ]
       
   312                         else:[
       
   313                             self cBuilder 
       
   314                                 declareId:'temp'
       
   315                                 asString:(self declarationCString:aStructNode)
       
   316                                 init:'__externalAddressVal( self )'.
       
   317                             self cBuilder returnMacro:true
       
   318                                 with:[
       
   319                                     self cBuilder 
       
   320                                         functionCall:[ self cBuilder objectCreation:aStructFieldNode id ]
       
   321                                         withString:[
       
   322                                             self cBuilder struct:'temp'
       
   323                                                 access:aStructFieldNode name , '[__longIntVal(position)]' , '.' 
       
   324                                                         , aStructOrUnionFieldNode name.
       
   325                                         ].
       
   326                                 ].
       
   327                         ].
       
   328                 ].
       
   329             self cr.
       
   330             self stBuilder commentWith:'If reached, primitive code has failed'.
       
   331             self stBuilder makeIndent.
       
   332             self nextPutString:'^self primitiveFailed: errorString.'.
       
   333             self cr.
       
   334         ].
       
   335     self cr.
       
   336     self stBuilder 
       
   337         methodFor:'accessing'
       
   338         category:aStructNode name
       
   339         with:[
       
   340             self 
       
   341                 nextPutString:aStructFieldNode name , '_' , aStructOrUnionFieldNode name 
       
   342                         , 'At:position put:aValue'.
       
   343             self cr.
       
   344             self cr.
       
   345             self generateCommentFor:aStructFieldNode.
       
   346             self generateCommentFor:aStructOrUnionFieldNode.
       
   347             self cr.
       
   348             self stBuilder declareId:#( 'errorString' ).
       
   349             self cr.
       
   350             self cBuilder 
       
   351                 primitiveWith:[
       
   352                     self cr.
       
   353                     self cBuilder 
       
   354                         declareId:'args_ok'
       
   355                         asString:'int '
       
   356                         init:'1'.
       
   357                     self cr.
       
   358                     self cBuilder commentWith:'Checking arguments'.
       
   359                     self cBuilder 
       
   360                         if:[
       
   361                             self nextPutString:'args_ok && '.
       
   362                             self cBuilder 
       
   363                                 parenthesesWith:[ self nextPutString:'not __isInteger( position )'. ].
       
   364                         ]
       
   365                         then:[
       
   366                             self cBuilder 
       
   367                                 assign:[
       
   368                                     self cBuilder functionCall:'__MKSTRING'
       
   369                                         withString:'"Argument position is not integer"'.
       
   370                                 ]
       
   371                                 to:'errorString'.
       
   372                             self cBuilder assign:'0' to:'args_ok'.
       
   373                         ].
       
   374                     self cBuilder 
       
   375                         if:[
       
   376                             self nextPutString:'args_ok && '.
       
   377                             self cBuilder 
       
   378                                 parenthesesWith:[
       
   379                                     self nextPutString:'not '.
       
   380                                     self cBuilder typeCheck:aStructOrUnionFieldNode id variable:'aValue'.
       
   381                                 ].
       
   382                         ]
       
   383                         then:[
       
   384                             self cBuilder 
       
   385                                 assign:[
       
   386                                     self cBuilder functionCall:'__MKSTRING'
       
   387                                         withString:'"Argument aValue is not instance of expected class"'.
       
   388                                 ]
       
   389                                 to:'errorString'.
       
   390                             self cBuilder assign:'0' to:'args_ok'.
       
   391                         ].
       
   392                     self cr.
       
   393                     self cBuilder if:'args_ok'
       
   394                         then:[
       
   395                             self cBuilder 
       
   396                                 declareId:'temp'
       
   397                                 asString:(self declarationCString:aStructNode)
       
   398                                 init:'__externalAddressVal( self )'.
       
   399                             self cBuilder 
       
   400                                 assign:[
       
   401                                     self cBuilder valueExtraction:aStructOrUnionFieldNode id
       
   402                                         variable:'aValue'.
       
   403                                 ]
       
   404                                 to:[
       
   405                                     self cBuilder struct:'temp'
       
   406                                         access:aStructFieldNode name , '[__longIntVal(position)].' 
       
   407                                                 , aStructOrUnionFieldNode name
       
   408                                 ].
       
   409                             self cBuilder return.
       
   410                         ].
       
   411                 ].
       
   412             self cr.
       
   413             self stBuilder commentWith:'If reached, primitive code has failed'.
       
   414             self stBuilder makeIndent.
       
   415             self nextPutString:'^self primitiveFailed: errorString.'.
       
   416             self cr.
       
   417         ].
       
   418 
       
   419     "Modified: / 19-12-2007 / 17:31:13 / haja"
       
   420     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
   421     "Modified: / 10-02-2008 / 11:16:09 / janfrog"
       
   422 !
       
   423 
       
   424 generateArrayCompositeStructAccessMethods:aStructFieldNode in:aStructNode 
       
   425 
       
   426     aStructFieldNode id id reference fields do:[:aStructOrUnionFieldNode|
       
   427       self generateArrayCompositeStructAccessMethod:aStructOrUnionFieldNode in:aStructFieldNode in:aStructNode.
       
   428 
       
   429     ].
       
   430 
       
   431     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
   432 !
       
   433 
       
   434 generateArrayStructAccessMethod:aStructFieldNode in:aStructNode 
       
   435     self stBuilder 
       
   436         methodFor:aStructNode name
       
   437         category:'accessing'
       
   438         with:[
       
   439             self nextPutString:aStructFieldNode name , 'At:position'.
       
   440             self cr.
       
   441             self cr.
       
   442             self generateCommentFor:aStructFieldNode.
       
   443             self cr.
       
   444             self stBuilder declareId:#( 'errorString' ).
       
   445             self cr.
       
   446             self cBuilder 
       
   447                 primitiveWith:[
       
   448                     self cBuilder 
       
   449                         if:[ self nextPutString:'not __isInteger( position )'. ]
       
   450                         then:[
       
   451                             self cBuilder 
       
   452                                 assign:[
       
   453                                     self cBuilder functionCall:'__MKSTRING'
       
   454                                         withString:'"Argument position is not integer"'.
       
   455                                 ]
       
   456                                 to:'errorString'.
       
   457                         ]
       
   458                         else:[
       
   459                             self cBuilder 
       
   460                                 declareId:'temp'
       
   461                                 asString:(self declarationCString:aStructNode)
       
   462                                 init:'__externalAddressVal( self )'.
       
   463                             self cBuilder returnMacro:true
       
   464                                 with:[
       
   465                                     self cBuilder 
       
   466                                         functionCall:[ self cBuilder objectCreation:aStructFieldNode id ]
       
   467                                         withString:[
       
   468                                             self cBuilder struct:'temp'
       
   469                                                 access:aStructFieldNode name , '[__longIntVal(position)]'.
       
   470                                         ].
       
   471                                 ].
       
   472                         ].
       
   473                 ].
       
   474             self cr.
       
   475             self stBuilder commentWith:'If reached, primitive code has failed'.
       
   476             self stBuilder makeIndent.
       
   477             self nextPutString:'^self primitiveFailed: errorString.'.
       
   478             self cr.
       
   479         ].
       
   480     self cr.
       
   481     self stBuilder 
       
   482         methodFor:'accessing'
       
   483         category:aStructNode name
       
   484         with:[
       
   485             self nextPutString:aStructFieldNode name , 'At:position put:aValue'.
       
   486             self cr.
       
   487             self cr.
       
   488             self generateCommentFor:aStructFieldNode.
       
   489             self cr.
       
   490             self stBuilder declareId:#( 'errorString' ).
       
   491             self cr.
       
   492             self cBuilder 
       
   493                 primitiveWith:[
       
   494                     self cr.
       
   495                     self cBuilder 
       
   496                         declareId:'args_ok'
       
   497                         asString:'int '
       
   498                         init:'1'.
       
   499                     self cr.
       
   500                     self cBuilder commentWith:'Checking arguments'.
       
   501                     self cBuilder 
       
   502                         if:[
       
   503                             self nextPutString:'args_ok && '.
       
   504                             self cBuilder 
       
   505                                 parenthesesWith:[ self nextPutString:'not __isInteger( position )'. ].
       
   506                         ]
       
   507                         then:[
       
   508                             self cBuilder 
       
   509                                 assign:[
       
   510                                     self cBuilder functionCall:'__MKSTRING'
       
   511                                         withString:'"Argument position is not integer"'.
       
   512                                 ]
       
   513                                 to:'errorString'.
       
   514                             self cBuilder assign:'0' to:'args_ok'.
       
   515                         ].
       
   516                     self cBuilder 
       
   517                         if:[
       
   518                             self nextPutString:'args_ok && '.
       
   519                             self cBuilder 
       
   520                                 parenthesesWith:[
       
   521                                     self nextPutString:'not '.
       
   522                                     self cBuilder typeCheck:aStructFieldNode id variable:'aValue'.
       
   523                                 ].
       
   524                         ]
       
   525                         then:[
       
   526                             self cBuilder 
       
   527                                 assign:[
       
   528                                     self cBuilder functionCall:'__MKSTRING'
       
   529                                         withString:'"Argument aValue is not instance of expected class"'.
       
   530                                 ]
       
   531                                 to:'errorString'.
       
   532                             self cBuilder assign:'0' to:'args_ok'.
       
   533                         ].
       
   534                     self cr.
       
   535                     self cBuilder if:'args_ok'
       
   536                         then:[
       
   537                             self cBuilder 
       
   538                                 declareId:'temp'
       
   539                                 asString:(self declarationCString:aStructNode)
       
   540                                 init:'__externalAddressVal( self )'.
       
   541                             self cBuilder 
       
   542                                 assign:[ self cBuilder valueExtraction:aStructFieldNode id variable:'aValue'. ]
       
   543                                 to:[
       
   544                                     self cBuilder struct:'temp'
       
   545                                         access:aStructFieldNode name , '[__longIntVal(position)]'
       
   546                                 ].
       
   547                             self cBuilder return.
       
   548                         ].
       
   549                 ].
       
   550             self cr.
       
   551             self stBuilder commentWith:'If reached, primitive code has failed'.
       
   552             self stBuilder makeIndent.
       
   553             self nextPutString:'^self primitiveFailed: errorString.'.
       
   554             self cr.
       
   555         ].
       
   556 
       
   557     "Modified: / 19-12-2007 / 17:30:19 / haja"
       
   558     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
   559     "Modified: / 10-02-2008 / 11:16:09 / janfrog"
       
   560 !
       
   561 
       
   562 generateBasicStructAccessMethod:aStructFieldNode in:aStructNode 
       
   563     self stBuilder 
       
   564         methodFor:aStructNode name
       
   565         category:'accessing'
       
   566         with:[
       
   567             self nextPutString:aStructFieldNode name.
       
   568             self cr.
       
   569             self cr.
       
   570             self generateCommentFor:aStructFieldNode.
       
   571             self cr.
       
   572             self cBuilder 
       
   573                 primitiveWith:[
       
   574                     self cBuilder 
       
   575                         declareId:'temp'
       
   576                         asString:(self declarationCString:aStructNode)
       
   577                         init:'__externalAddressVal( self )'.
       
   578                     self cBuilder returnMacro:true
       
   579                         with:[
       
   580                             self cBuilder 
       
   581                                 functionCall:[ self cBuilder objectCreation:aStructFieldNode id ]
       
   582                                 withString:[ self cBuilder struct:'temp' access:aStructFieldNode name. ].
       
   583                         ].
       
   584                 ].
       
   585         ].
       
   586     self cr.
       
   587     self stBuilder 
       
   588         methodFor:'accessing'
       
   589         category:aStructNode name
       
   590         with:[
       
   591             self nextPutString:aStructFieldNode name , ':aValue'.
       
   592             self cr.
       
   593             self cr.
       
   594             self generateCommentFor:aStructFieldNode.
       
   595             self cr.
       
   596             self stBuilder declareId:#( 'errorString' ).
       
   597             self cr.
       
   598             self cBuilder 
       
   599                 primitiveWith:[
       
   600                     self cBuilder 
       
   601                         if:[
       
   602                             self nextPutString:'not '.
       
   603                             self cBuilder typeCheck:aStructFieldNode id variable:'aValue'.
       
   604                         ]
       
   605                         then:[
       
   606                             self cBuilder 
       
   607                                 assign:[
       
   608                                     self cBuilder functionCall:'__MKSTRING'
       
   609                                         withString:'"Argument aValue is not instance of expected class"'.
       
   610                                 ]
       
   611                                 to:'errorString'.
       
   612                         ]
       
   613                         else:[
       
   614                             self cBuilder 
       
   615                                 declareId:'temp'
       
   616                                 asString:(self declarationCString:aStructNode)
       
   617                                 init:'__externalAddressVal( self )'.
       
   618                             self cBuilder 
       
   619                                 assign:[ self cBuilder valueExtraction:aStructFieldNode id variable:'aValue'. ]
       
   620                                 to:[ self cBuilder struct:'temp' access:aStructFieldNode name ].
       
   621                             self cBuilder return.
       
   622                         ].
       
   623                 ].
       
   624             self cr.
       
   625             self stBuilder commentWith:'If reached, primitive code has failed'.
       
   626             self stBuilder makeIndent.
       
   627             self nextPutString:'^self primitiveFailed: errorString.'.
       
   628             self cr.
       
   629         ].
       
   630 
       
   631     "Modified: / 19-12-2007 / 17:29:02 / haja"
       
   632     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
   633     "Modified: / 10-02-2008 / 11:16:09 / janfrog"
       
   634 !
       
   635 
       
   636 generateCallbackCFunction:aFunctionNode
       
   637 
       
   638     self cBuilder function:(self correctMethodName:aFunctionNode name)
       
   639       with:aFunctionNode arguments
       
   640       return:aFunctionNode return
       
   641       body:[
       
   642         self cBuilder returnC:aFunctionNode return
       
   643           with:[
       
   644             self cBuilder methodCall:(self correctMethodName:aFunctionNode name) on:nameSpace,'::',className withArgsSize:aFunctionNode arguments.
       
   645           ].
       
   646       ].
       
   647     self cr.
       
   648 
       
   649     "Modified: / 28-11-2007 / 18:08:17 / haja"
       
   650     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
   651 !
       
   652 
       
   653 generateCallbackCFunctions
       
   654 
       
   655     prototypes do:[:aFunctionPrototypeNode|
       
   656       self generateCallbackCFunction:aFunctionPrototypeNode.
       
   657     ].
       
   658 
       
   659     "Modified: / 16-11-2007 / 15:26:48 / haja"
       
   660     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
   661 !
       
   662 
       
   663 generateCallbackSmalltalkMethod:aFunctionPrototypeNode 
       
   664     self stBuilder 
       
   665         methodFor:(className , ' class')
       
   666         category:(parseTree generatedFrom , ' - Callback Methods')
       
   667         with:[
       
   668             self stBuilder 
       
   669                 method:(self correctMethodName:aFunctionPrototypeNode name)
       
   670                 withArgsSize:(aFunctionPrototypeNode arguments size).
       
   671             self cr.
       
   672             self generateCommentFor:aFunctionPrototypeNode.
       
   673         ].
       
   674 
       
   675     "Modified: / 28-11-2007 / 18:06:29 / haja"
       
   676     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
   677     "Modified: / 10-02-2008 / 11:16:09 / janfrog"
       
   678 !
       
   679 
       
   680 generateCallbackSmalltalkMethods
       
   681 
       
   682     prototypes do:[:aFunctionPrototypeNode|
       
   683       self generateCallbackSmalltalkMethod:aFunctionPrototypeNode.
       
   684     ].
       
   685 
       
   686     "Modified: / 27-11-2007 / 15:58:09 / haja"
       
   687     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
   688 !
       
   689 
       
   690 generateComment:aType name:aName id:anId
       
   691 
       
   692     self stBuilder commentWith:[
       
   693       self nextPutString:aType,' ',aName,' is of type '.
       
   694       self stBuilder typeDescription:anId.
       
   695       self cr.
       
   696     ].
       
   697 
       
   698     "Modified: / 20-12-2007 / 12:04:49 / haja"
       
   699     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
   700 !
       
   701 
       
   702 generateCommentFor:aNode
       
   703 
       
   704     (aNode references:CFunctionNode) ifTrue:[
       
   705       self stBuilder commentWith:[
       
   706         self cr.
       
   707         (aNode arguments isEmpty) ifFalse:[
       
   708           1 to:aNode arguments size do:[:pos | 
       
   709             self stBuilder makeIndent.
       
   710             self nextPutString:'argument ',(aNode arguments at:pos) name, ' should be boxed '.
       
   711             self stBuilder typeDescription:(aNode arguments at:pos) id.
       
   712             self cr.
       
   713           ].
       
   714         ].
       
   715         self stBuilder makeIndent.
       
   716         self nextPutString:'function should return boxed '.
       
   717         self stBuilder typeDescription:aNode return.
       
   718         self cr.
       
   719       ].
       
   720       ^self.
       
   721     ].
       
   722 
       
   723     (aNode references:CFunctionPrototypeNode) ifTrue:[
       
   724       self stBuilder commentWith:[
       
   725         self cr.
       
   726         (aNode arguments isEmpty) ifFalse:[
       
   727           1 to:aNode arguments size do:[:pos | 
       
   728             self stBuilder makeIndent.
       
   729             self nextPutString:'arg' , pos asString , ' should be boxed '.
       
   730             self stBuilder typeDescription:(aNode arguments at:pos) id.
       
   731             self cr.
       
   732           ].
       
   733         ].
       
   734         self stBuilder makeIndent.
       
   735         self nextPutString:'function should return boxed '.
       
   736         self stBuilder typeDescription:aNode return.
       
   737         self cr.
       
   738       ].
       
   739       ^self.
       
   740     ].
       
   741 
       
   742     (aNode references:CStructFieldNode) ifTrue:[
       
   743       self stBuilder commentWith:[
       
   744         self nextPutString:'structure field ' , aNode name , ' is of type '.
       
   745         self stBuilder typeDescription:aNode id.
       
   746         self generateLocalType:(self getIdNode:aNode id) in:parentNode.
       
   747         self cr.
       
   748       ].
       
   749       ^self
       
   750     ].
       
   751 
       
   752 
       
   753     (aNode references:CTypedefNode) ifTrue:[
       
   754       self stBuilder commentWith:[
       
   755         self nextPutString:'typedef ' , aNode name , ' is of type '.
       
   756         self stBuilder typeDescription:aNode id.
       
   757         self cr.
       
   758       ].
       
   759       ^self
       
   760     ].
       
   761 
       
   762     ^self error.
       
   763 
       
   764     "Modified: / 20-12-2007 / 12:05:37 / haja"
       
   765     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
   766     "Modified: / 10-02-2008 / 10:50:19 / janfrog"
       
   767 !
       
   768 
       
   769 generateCompositeStructAccessMethod:aStructOrUnionFieldNode in:aStructFieldNode in:aStructNode 
       
   770     self stBuilder 
       
   771         methodFor:aStructNode name
       
   772         category:'accessing'
       
   773         with:[
       
   774             self 
       
   775                 nextPutString:aStructFieldNode name , '_' , aStructOrUnionFieldNode name.
       
   776             self cr.
       
   777             self cr.
       
   778             self generateCommentFor:aStructFieldNode.
       
   779             self generateCommentFor:aStructOrUnionFieldNode.
       
   780             self cr.
       
   781             self cBuilder 
       
   782                 primitiveWith:[
       
   783                     self cBuilder 
       
   784                         declareId:'temp'
       
   785                         asString:(self declarationCString:aStructNode)
       
   786                         init:'__externalAddressVal( self )'.
       
   787                     self cBuilder returnMacro:true
       
   788                         with:[
       
   789                             self cBuilder 
       
   790                                 functionCall:[ self cBuilder objectCreation:aStructOrUnionFieldNode id ]
       
   791                                 withString:[
       
   792                                     self cBuilder struct:'temp'
       
   793                                         access:aStructFieldNode name , '.' , aStructOrUnionFieldNode name.
       
   794                                 ].
       
   795                         ].
       
   796                 ].
       
   797         ].
       
   798     self cr.
       
   799     self stBuilder 
       
   800         methodFor:'accessing'
       
   801         category:aStructNode name
       
   802         with:[
       
   803             self 
       
   804                 nextPutString:aStructFieldNode name , '_' , aStructOrUnionFieldNode name 
       
   805                         , ':aValue'.
       
   806             self cr.
       
   807             self cr.
       
   808             self generateCommentFor:aStructFieldNode.
       
   809             self generateCommentFor:aStructOrUnionFieldNode.
       
   810             self cr.
       
   811             self stBuilder declareId:#( 'errorString' ).
       
   812             self cr.
       
   813             self cBuilder 
       
   814                 primitiveWith:[
       
   815                     self cBuilder 
       
   816                         if:[
       
   817                             self nextPutString:'not '.
       
   818                             self cBuilder typeCheck:aStructOrUnionFieldNode id variable:'aValue'.
       
   819                         ]
       
   820                         then:[
       
   821                             self cBuilder 
       
   822                                 assign:[
       
   823                                     self cBuilder functionCall:'__MKSTRING'
       
   824                                         withString:'"Argument aValue is not instance of expected class"'.
       
   825                                 ]
       
   826                                 to:'errorString'.
       
   827                         ]
       
   828                         else:[
       
   829                             self cBuilder 
       
   830                                 declareId:'temp'
       
   831                                 asString:(self declarationCString:aStructNode)
       
   832                                 init:'__externalAddressVal( self )'.
       
   833                             self cBuilder 
       
   834                                 assign:[
       
   835                                     self cBuilder valueExtraction:aStructOrUnionFieldNode id
       
   836                                         variable:'aValue'.
       
   837                                 ]
       
   838                                 to:[
       
   839                                     self cBuilder struct:'temp'
       
   840                                         access:aStructFieldNode name , '.' , aStructOrUnionFieldNode name
       
   841                                 ].
       
   842                             self cBuilder return.
       
   843                         ].
       
   844                 ].
       
   845             self cr.
       
   846             self stBuilder commentWith:'If reached, primitive code has failed'.
       
   847             self stBuilder makeIndent.
       
   848             self nextPutString:'^self primitiveFailed: errorString.'.
       
   849             self cr.
       
   850         ].
       
   851 
       
   852     "Modified: / 19-12-2007 / 17:29:46 / haja"
       
   853     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
   854     "Modified: / 10-02-2008 / 11:16:09 / janfrog"
       
   855 !
       
   856 
       
   857 generateCompositeStructAccessMethods:aStructFieldNode in:aStructNode 
       
   858 
       
   859     aStructFieldNode id reference fields do:[:aStructOrUnionFieldNode|
       
   860       self generateCompositeStructAccessMethod:aStructOrUnionFieldNode in:aStructFieldNode in:aStructNode.
       
   861     ].
       
   862 
       
   863     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
   864 !
       
   865 
       
   866 generateInclude
       
   867 
       
   868     self cBuilder makeIndent.
       
   869     self nextPutString:'#define not !!'.self cr.
       
   870     self cr.
       
   871 
       
   872     self cBuilder include:(self includeFromSourceFile:parseTree generatedFrom).
       
   873 
       
   874     "Modified: / 23-11-2007 / 12:20:59 / haja"
       
   875     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
   876 !
       
   877 
       
   878 generateLocalType:anIdNode in:aStructOrUnionNode
       
   879 
       
   880     (anIdNode isNil not) ifTrue:[
       
   881       aStructOrUnionNode fields do:[:aLocalStructOrUnionNode|
       
   882         ((aLocalStructOrUnionNode references:StructNode) | (aLocalStructOrUnionNode references:UnionNode)) ifTrue:[
       
   883           (aLocalStructOrUnionNode name = anIdNode names last) ifTrue:[
       
   884             self stBuilder typeDescription:aLocalStructOrUnionNode.
       
   885           ].
       
   886         ].
       
   887       ].
       
   888     ].
       
   889 
       
   890     "Modified: / 20-12-2007 / 12:05:44 / haja"
       
   891     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
   892 !
       
   893 
       
   894 generateStructOrUnionCreateMethod:aStructOrUnionNode 
       
   895     self stBuilder 
       
   896         methodFor:(aStructOrUnionNode name , ' class')
       
   897         category:'instance creation'
       
   898         with:[
       
   899             self stBuilder nextPutString:'create'.
       
   900             self cr.
       
   901             self cr.
       
   902             self stBuilder declareId:#( 'temp' ).
       
   903             self cr.
       
   904             self cr.
       
   905             self cBuilder 
       
   906                 primitiveWith:[
       
   907                     self cBuilder 
       
   908                         declareId:'temp'
       
   909                         asString:''
       
   910                         init:[
       
   911                             self cBuilder functionCall:'__MKEXTERNALADDRESS'
       
   912                                 withString:[
       
   913                                     self cBuilder nextPutString:' ('.
       
   914                                     self cBuilder nextPutString:aStructOrUnionNode name.
       
   915                                     self cBuilder nextPutString:' *) '.
       
   916                                     self cBuilder functionCall:'malloc'
       
   917                                         withString:[
       
   918                                             self cBuilder functionCall:'sizeof' withString:aStructOrUnionNode name.
       
   919                                         ].
       
   920                                 ].
       
   921                         ].
       
   922                     self cr.
       
   923                 ].
       
   924             self cr.
       
   925             self stBuilder makeIndent.
       
   926             self stBuilder nextPutString:'^self newAddress: temp address.'.
       
   927             self cr.
       
   928         ].
       
   929     self cr.
       
   930 
       
   931     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
   932     "Modified: / 10-02-2008 / 11:16:09 / janfrog"
       
   933 !
       
   934 
       
   935 generateStructOrUnionCreateNULLPointerMethod:aStructOrUnionNode 
       
   936     self stBuilder 
       
   937         methodFor:(aStructOrUnionNode name , ' class')
       
   938         category:'instance creation'
       
   939         with:[
       
   940             self stBuilder nextPutString:'createNULLPointer'.
       
   941             self cr.
       
   942             self cr.
       
   943             self stBuilder makeIndent.
       
   944             self stBuilder nextPutString:'^self newAddress: 0.'.
       
   945             self cr.
       
   946         ].
       
   947     self cr.
       
   948 
       
   949     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
   950     "Modified: / 10-02-2008 / 11:16:09 / janfrog"
       
   951 !
       
   952 
       
   953 generateStructOrUnionFreeMethod:aStructOrUnionNode 
       
   954     self stBuilder 
       
   955         methodFor:aStructOrUnionNode name
       
   956         category:'freeing'
       
   957         with:[
       
   958             self stBuilder nextPutString:'free'.
       
   959             self cr.
       
   960             self cr.
       
   961             self cBuilder 
       
   962                 primitiveWith:[
       
   963                     self cBuilder 
       
   964                         declareId:'temp'
       
   965                         asString:(self declarationCString:aStructOrUnionNode)
       
   966                         init:'__externalAddressVal( self )'.
       
   967                     self cBuilder makeIndent.
       
   968                     self cBuilder functionCall:'free' withString:'temp'.
       
   969                     self cBuilder nextPutString:';'.
       
   970                     self cr.
       
   971                 ].
       
   972             self cr.
       
   973             self stBuilder makeIndent.
       
   974             self stBuilder nextPutString:'^self beNull.'.
       
   975             self cr.
       
   976         ].
       
   977     self cr.
       
   978 
       
   979     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
   980     "Modified: / 10-02-2008 / 11:16:09 / janfrog"
       
   981 ! !
       
   982 
       
   983 !SmalltalkXGenerator methodsFor:'initialization'!
       
   984 
       
   985 initialize
       
   986     "Invoked when a new instance is created."
       
   987 
       
   988     "/ please change as required (and remove this comment)
       
   989     "/ parser := nil.
       
   990 
       
   991     "/ super initialize.   -- commented since inherited method does nothing
       
   992 
       
   993     outputStream := WriteStream on:''.
       
   994     cBuilder := self defaultCBuilder.
       
   995     stBuilder := self defaultStBuilder.
       
   996 
       
   997     analyser := Analyser new.
       
   998     prototypes := OrderedCollection new.
       
   999 
       
  1000     "Modified: / 20-12-2007 / 13:03:56 / haja"
       
  1001     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
  1002 ! !
       
  1003 
       
  1004 !SmalltalkXGenerator methodsFor:'private'!
       
  1005 
       
  1006 correctMethodName:aName
       
  1007 
       
  1008     (aName startsWith:'_') ifTrue:[
       
  1009       ^'f',aName,'_callback'.
       
  1010     ].
       
  1011 
       
  1012     ^aName,'_callback'.
       
  1013 
       
  1014     "Modified: / 25-11-2007 / 10:48:02 / haja"
       
  1015     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
  1016 !
       
  1017 
       
  1018 declarationCString:aNode
       
  1019 
       
  1020     ((aNode references:CEnumNode) | (aNode references:CStructNode) | (aNode references:CUnionNode)) ifTrue:[
       
  1021       (aNode typedef) ifFalse:[
       
  1022         (aNode references:CEnumNode) ifTrue:[ ^'enum ',aNode name,' *' ].
       
  1023         (aNode references:CStructNode) ifTrue:[ ^'struct ',aNode name,' *' ].
       
  1024         (aNode references:CUnionNode) ifTrue:[ ^'union ',aNode name,' *' ].
       
  1025       ] ifTrue:[ ^aNode name,' *' ].
       
  1026     ].
       
  1027 
       
  1028     ^self error.
       
  1029     "must be an instance of EnumNode, StructNode or UnionNode"
       
  1030 
       
  1031     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
  1032     "Modified: / 10-02-2008 / 10:49:15 / janfrog"
       
  1033 !
       
  1034 
       
  1035 getIdNode:aNode
       
  1036 
       
  1037     ^IdNodeGetter on:aNode.
       
  1038 
       
  1039     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
  1040 !
       
  1041 
       
  1042 includeFromSourceFile:aFilePath
       
  1043 
       
  1044      | tmp |
       
  1045 
       
  1046     tmp := aFilePath.
       
  1047 
       
  1048     [
       
  1049         (tmp indexOfAny:'/') = 0
       
  1050     ] whileFalse:[ tmp := tmp copyFrom:(tmp indexOfAny:'/') + 1 ].
       
  1051 
       
  1052     ^tmp
       
  1053 
       
  1054     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
  1055 ! !
       
  1056 
       
  1057 !SmalltalkXGenerator methodsFor:'queries'!
       
  1058 
       
  1059 hasLocalDeclaration:aStructOrUnionFieldNode
       
  1060 
       
  1061    |anIdNode|
       
  1062 
       
  1063    anIdNode := self getIdNode:aStructOrUnionFieldNode id.
       
  1064    (anIdNode notNil) ifTrue:[
       
  1065      (((anIdNode reference) references:StructNode) | ((anIdNode reference) references:UnionNode))  ifTrue:[
       
  1066        ^anIdNode reference local
       
  1067      ].
       
  1068    ].
       
  1069    ^false.
       
  1070 
       
  1071     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
  1072 !
       
  1073 
       
  1074 hasValidReturn:aReturnNode
       
  1075 
       
  1076     (aReturnNode references:Cface::IdNode) ifTrue:[
       
  1077         (aReturnNode names first = 'void') ifTrue:[
       
  1078             ^false.
       
  1079         ] ifFalse:[
       
  1080             ^true.
       
  1081         ].
       
  1082     ] ifFalse:[
       
  1083         ^true.
       
  1084     ].
       
  1085 
       
  1086     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
  1087 !
       
  1088 
       
  1089 isAnyEnum:aStructOrUnionFieldNode
       
  1090 
       
  1091    ((aStructOrUnionFieldNode id) references:IdNode) ifTrue:[
       
  1092      (((aStructOrUnionFieldNode id) reference) references:EnumNode) ifTrue:[
       
  1093        ^true
       
  1094      ].
       
  1095    ].
       
  1096    ^false.
       
  1097 
       
  1098     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
  1099 !
       
  1100 
       
  1101 isAnyStructure:aStructOrUnionFieldNode
       
  1102 
       
  1103    ((aStructOrUnionFieldNode id) references:IdNode) ifTrue:[
       
  1104      (((aStructOrUnionFieldNode id) reference) references:StructNode) ifTrue:[
       
  1105        ^true
       
  1106      ].
       
  1107    ].
       
  1108    ^false.
       
  1109 
       
  1110     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
  1111 !
       
  1112 
       
  1113 isAnyUnion:aStructOrUnionFieldNode
       
  1114 
       
  1115    ((aStructOrUnionFieldNode id) references:IdNode) ifTrue:[
       
  1116      (((aStructOrUnionFieldNode id) reference) references:UnionNode) ifTrue:[
       
  1117        ^true
       
  1118      ].
       
  1119    ].
       
  1120    ^false.
       
  1121 
       
  1122     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
  1123 !
       
  1124 
       
  1125 isArray:aStructOrUnionFieldNode
       
  1126 
       
  1127     ((aStructOrUnionFieldNode id) references:ArrayNode) ifTrue:[ ^true]
       
  1128     ifFalse:[ ^false].
       
  1129 
       
  1130     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
  1131 !
       
  1132 
       
  1133 isArrayStructure:aStructOrUnionFieldNode
       
  1134 
       
  1135    ((aStructOrUnionFieldNode id) references:CArrayNode) ifTrue:[
       
  1136      ((aStructOrUnionFieldNode id) id references:IdNode) ifTrue:[
       
  1137        (((aStructOrUnionFieldNode id) id reference) references:CStructNode) ifTrue:[
       
  1138        ^true
       
  1139        ].
       
  1140      ].
       
  1141    ].
       
  1142    ^false.
       
  1143 
       
  1144     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
  1145     "Modified: / 10-02-2008 / 10:49:35 / janfrog"
       
  1146 !
       
  1147 
       
  1148 isArrayUnion:aStructOrUnionFieldNode
       
  1149 
       
  1150    ((aStructOrUnionFieldNode id) references:CArrayNode) ifTrue:[
       
  1151      ((aStructOrUnionFieldNode id) id references:IdNode) ifTrue:[
       
  1152        (((aStructOrUnionFieldNode id) id reference) references:CUnionNode) ifTrue:[
       
  1153        ^true
       
  1154        ].
       
  1155      ].
       
  1156    ].
       
  1157    ^false.
       
  1158 
       
  1159     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
  1160     "Modified: / 10-02-2008 / 10:49:43 / janfrog"
       
  1161 ! !
       
  1162 
       
  1163 !SmalltalkXGenerator methodsFor:'streaming'!
       
  1164 
       
  1165 cr
       
  1166 
       
  1167     self nextPut:Character cr
       
  1168 
       
  1169     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
  1170 !
       
  1171 
       
  1172 nextPut:aCharacter
       
  1173 
       
  1174     outputStream nextPut:aCharacter.
       
  1175 
       
  1176     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
  1177 !
       
  1178 
       
  1179 nextPutString:aString
       
  1180 
       
  1181     outputStream nextPutAll:aString.
       
  1182 
       
  1183     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
  1184 !
       
  1185 
       
  1186 space
       
  1187 
       
  1188     self nextPut:Character space
       
  1189 
       
  1190     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
  1191 !
       
  1192 
       
  1193 tab
       
  1194 
       
  1195     self space;
       
  1196          space.
       
  1197 
       
  1198     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
  1199 !
       
  1200 
       
  1201 writeToFile:aFileName
       
  1202 
       
  1203     | fileStream |
       
  1204 
       
  1205     fileStream := aFileName asFilename writeStream.
       
  1206     fileStream nextPutAll:outputStream contents.
       
  1207     fileStream close.
       
  1208 
       
  1209     "Created: / 08-02-2008 / 08:39:27 / janfrog"
       
  1210 ! !
    63 ! !
  1211 
    64 
  1212 !SmalltalkXGenerator methodsFor:'visiting'!
    65 !SmalltalkXGenerator methodsFor:'visiting'!
  1213 
    66 
  1214 visitCArrayNode:anArrayNode 
    67 visitCEnumNode: cEnumNode
  1215     "shouldn't reach"
       
  1216     
       
  1217     self error.
       
  1218 
    68 
  1219     "Modified: / 14-11-2007 / 11:25:12 / haja"
    69     (changeset add: ClassDefinitionChange new)
  1220     "Created: / 10-02-2008 / 10:44:35 / janfrog"
    70         superClassName: 
       
    71             SharedPool fullName;
       
    72         className: 
       
    73             cEnumNode smalltalkClassNameWithNamespace;
       
    74         classVariableNames:
       
    75             (String streamContents:
       
    76                 [:s|
       
    77                 cEnumNode values do:
       
    78                     [:cEnumValueNode|
       
    79                     s nextPutAll: cEnumValueNode cName; space]]);
       
    80         category:
       
    81             cEnumNode smalltalkCategory;
       
    82         package:
       
    83             cEnumNode smalltalkPackage.
       
    84 
       
    85     (changeset add: MethodDefinitionChange new)
       
    86         className:
       
    87             cEnumNode smalltalkClassNameWithNamespace, ' class';
       
    88         selector:
       
    89             #initialize;
       
    90         category:
       
    91             #initialization;
       
    92         source:
       
    93             (String streamContents:
       
    94                 [:s|
       
    95                 s nextPutAll:'initialize' ; cr; cr.
       
    96                 cEnumNode values do:
       
    97                     [:cEnumValueNode|
       
    98                     s 
       
    99                         tab; 
       
   100                         nextPutAll: cEnumValueNode cName;
       
   101                         nextPutAll: ' := ';
       
   102                         nextPutAll: cEnumValueNode intValue;
       
   103                         nextPut:$.; cr]]).
       
   104 
       
   105     cEnumNode values do:
       
   106         [:cEnumValueNode|
       
   107         (changeset add: MethodDefinitionChange new)
       
   108             className:
       
   109                 cEnumNode smalltalkClassNameWithNamespace, ' class';
       
   110             selector:
       
   111                 cEnumValueNode cName asSymbol;
       
   112             category:
       
   113                 #constants;
       
   114             source:
       
   115                 (String streamContents:
       
   116                     [:s|
       
   117                     s nextPutAll: cEnumValueNode cName; cr; cr.
       
   118                     s tab; nextPut:$^; nextPutAll: cEnumValueNode cName])]
       
   119 
       
   120     "Created: / 03-07-2008 / 20:10:34 / Jan Vrany <vranyj1@fel.cvut.cz>"
       
   121     "Modified: / 03-07-2008 / 22:07:20 / Jan Vrany <vranyj1@fel.cvut.cz>"
  1221 !
   122 !
  1222 
   123 
  1223 visitCConstNode:aConstNode 
   124 visitCFunctionNode:functionNode
  1224     "shouldn't reach"
       
  1225     
       
  1226     self error.
       
  1227 
   125 
  1228     "Modified: / 14-11-2007 / 11:25:08 / haja"
   126     (changeset add: MethodDefinitionChange new)
  1229     "Created: / 10-02-2008 / 10:44:45 / janfrog"
   127         className: functionNode smalltalkClassNameWithNamespace , ' class';
       
   128         category: 'external functions';
       
   129         selector: functionNode smalltalkSelector;
       
   130         source:
       
   131             (String streamContents:
       
   132                 [:s|
       
   133                 s 
       
   134                     nextPutAll: functionNode smalltalkSelector; cr; cr; tab;
       
   135                     nextPutAll: '<cdecl:';
       
   136                     space;
       
   137                     nextPutAll: functionNode return ffiTypeSymbol;
       
   138                     space;
       
   139                     nextPutAll: functionNode cName;
       
   140                     space;
       
   141                     nextPut:$(;
       
   142                     space.
       
   143                 functionNode arguments do:
       
   144                     [:argument|
       
   145                     s nextPutAll: argument type ffiTypeSymbol; space].
       
   146                 s 
       
   147                     nextPut:$);
       
   148                     space;
       
   149                     nextPut:$>])
       
   150 
       
   151     "Created: / 03-07-2008 / 21:26:42 / Jan Vrany <vranyj1@fel.cvut.cz>"
       
   152     "Modified: / 03-07-2008 / 23:42:47 / Jan Vrany <vranyj1@fel.cvut.cz>"
  1230 !
   153 !
  1231 
   154 
  1232 visitCEnumFieldNode:anEnumFieldNode 
   155 visitCStructNode: cStructNode
  1233     |enumClassName enumValueClassName|
       
  1234 
   156 
  1235     (parentNode references:CEnumNode) ifFalse:[
   157     cStructNode isAnonymous ifTrue:[^self].
  1236         self error.
       
  1237     ].
       
  1238     enumClassName := mappings smalltalkClassForEnum:parentNode.
       
  1239     enumValueClassName := mappings smalltalkClassForEnumValue:anEnumFieldNode.
       
  1240     stBuilder
       
  1241         class:enumValueClassName superclass:enumClassName;
       
  1242         methodFor:enumValueClassName , ' class'
       
  1243             category:'accessing'
       
  1244             with:('intValue' , Character cr , Character tab , '^' 
       
  1245                     , anEnumFieldNode number)
       
  1246 
   158 
  1247     "Modified: / 17-02-2008 / 20:52:26 / janfrog"
   159     (changeset add: ClassDefinitionChange new)
       
   160         superClassName: 
       
   161             ExternalStructure fullName;
       
   162         className: 
       
   163             cStructNode smalltalkClassNameWithNamespace;
       
   164         category:
       
   165             cStructNode smalltalkCategory;
       
   166         package:
       
   167             cStructNode smalltalkPackage.
       
   168 
       
   169     "Created: / 03-07-2008 / 21:31:31 / Jan Vrany <vranyj1@fel.cvut.cz>"
       
   170     "Modified: / 03-07-2008 / 23:42:54 / Jan Vrany <vranyj1@fel.cvut.cz>"
  1248 !
   171 !
  1249 
   172 
  1250 visitCEnumNode:anEnumNode 
   173 visitCTypedefNode: typedefNode
  1251     |enumClassName|
       
  1252 
   174 
  1253     (anEnumNode foreign) ifTrue:[
   175     "Created: / 03-07-2008 / 22:00:49 / Jan Vrany <vranyj1@fel.cvut.cz>"
  1254         ^ self
       
  1255     ].
       
  1256     enumClassName := mappings smalltalkClassForEnum:anEnumNode.
       
  1257     self stBuilder 
       
  1258         class:enumClassName
       
  1259         superclass:'Cface::CEnum'
       
  1260         category:nameSpace , ' - C Enumerations'.
       
  1261     self cr.
       
  1262     parentNode := anEnumNode.
       
  1263     self visit:anEnumNode fields.
       
  1264 
       
  1265     "Modified: / 05-12-2007 / 21:42:56 / haja"
       
  1266     "Created: / 10-02-2008 / 10:44:59 / janfrog"
       
  1267     "Modified: / 17-02-2008 / 20:52:00 / janfrog"
       
  1268 !
       
  1269 
       
  1270 visitCFileNode:aFileNode 
       
  1271     self stBuilder package:'__NoProject__'.
       
  1272     self stBuilder namespace:nameSpace.
       
  1273     self cr.
       
  1274     self stBuilder 
       
  1275         class:#CInterface
       
  1276         superclass:'Object'
       
  1277         category:nameSpace , ' - C Interface'.
       
  1278     self cr.
       
  1279     self stBuilder primitiveDefinitionsFor:className
       
  1280         with:[
       
  1281             self cBuilder 
       
  1282                 definitionPrimitiveWith:[
       
  1283                     self cBuilder commentWith:'here place needed include directives'.
       
  1284                     self cr.
       
  1285                     self generateInclude.
       
  1286                     self cr.
       
  1287                     (prototypes isEmpty) ifFalse:[
       
  1288                         self cBuilder commentWith:'Callbacks'.
       
  1289                         (self cBuilder)
       
  1290                             commentWith:'If you need one, uncomment it';
       
  1291                             cr.
       
  1292                         (self cBuilder)
       
  1293                             commentWith:[
       
  1294                                     self cr.
       
  1295                                     self generateCallbackCFunctions
       
  1296                                 ];
       
  1297                             cr.
       
  1298                     ].
       
  1299                 ].
       
  1300         ].
       
  1301     self cr.
       
  1302     self visit:aFileNode defBody.
       
  1303     self cr.
       
  1304     self generateCallbackSmalltalkMethods.
       
  1305     self cr.
       
  1306     self nextPutString:'!!'.
       
  1307     self cr.
       
  1308 
       
  1309     "Modified: / 28-11-2007 / 18:14:53 / haja"
       
  1310     "Created: / 10-02-2008 / 10:45:06 / janfrog"
       
  1311 !
       
  1312 
       
  1313 visitCFunctionNode:aFunctionNode 
       
  1314     self stBuilder 
       
  1315         methodFor:(className , ' class')
       
  1316         category:parseTree generatedFrom
       
  1317         with:[
       
  1318             self stBuilder method:aFunctionNode name
       
  1319                 withArgs:(aFunctionNode arguments).
       
  1320             self cr.
       
  1321             self generateCommentFor:aFunctionNode.
       
  1322             self cr.
       
  1323             self stBuilder declareId:#( 'errorString' ).
       
  1324             self cr.
       
  1325             self cBuilder 
       
  1326                 primitiveWith:[
       
  1327                     self cr.
       
  1328                     self cBuilder 
       
  1329                         declareId:'args_ok'
       
  1330                         asString:'int '
       
  1331                         init:'1'.
       
  1332                     self cr.
       
  1333                     (aFunctionNode arguments isEmpty) ifFalse:[
       
  1334                         self cBuilder commentWith:'Checking arguments'.
       
  1335                         1 to:aFunctionNode arguments size do:[:pos | 
       
  1336                             self cBuilder 
       
  1337                                 if:[
       
  1338                                     self nextPutString:'args_ok && '.
       
  1339                                     self cBuilder 
       
  1340                                         parenthesesWith:[
       
  1341                                             self nextPutString:'not '.
       
  1342                                             self cBuilder typeCheck:(aFunctionNode arguments at:pos) id
       
  1343                                                 variable:(aFunctionNode arguments at:pos) name.
       
  1344                                         ].
       
  1345                                 ]
       
  1346                                 then:[
       
  1347                                     self cBuilder 
       
  1348                                         assign:[
       
  1349                                             self cBuilder functionCall:'__MKSTRING'
       
  1350                                                 withString:'"Argument ' , (aFunctionNode arguments at:pos) name 
       
  1351                                                         , ' is not instance of expected class"'.
       
  1352                                         ]
       
  1353                                         to:'errorString'.
       
  1354                                     self cBuilder assign:'0' to:'args_ok'.
       
  1355                                 ].
       
  1356                         ].
       
  1357                     ].
       
  1358                     self cr.
       
  1359                     self cBuilder commentWith:'Calling function'.
       
  1360                     self cBuilder if:'args_ok'
       
  1361                         then:[
       
  1362                             self cBuilder returnMacro:(self hasValidReturn:aFunctionNode return)
       
  1363                                 with:[
       
  1364                                     self cBuilder 
       
  1365                                         objectCreation:(self hasValidReturn:aFunctionNode return)
       
  1366                                         id:(aFunctionNode return)
       
  1367                                         with:[
       
  1368                                             self cBuilder functionCall:aFunctionNode name
       
  1369                                                 withArgs:aFunctionNode arguments.
       
  1370                                         ].
       
  1371                                 ].
       
  1372                             (self hasValidReturn:aFunctionNode return) ifFalse:[
       
  1373                                 self cBuilder return.
       
  1374                             ].
       
  1375                         ].
       
  1376                 ].
       
  1377             self cr.
       
  1378             self stBuilder commentWith:'If reached, primitive code has failed'.
       
  1379             self stBuilder makeIndent.
       
  1380             self nextPutString:'^self primitiveFailed: errorString.'.
       
  1381             self cr.
       
  1382         ].
       
  1383     self cr.
       
  1384 
       
  1385     "Modified: / 19-12-2007 / 15:51:21 / haja"
       
  1386     "Created: / 10-02-2008 / 10:45:12 / janfrog"
       
  1387 !
       
  1388 
       
  1389 visitCPointerNode:aPointerNode 
       
  1390     "shouldn't reach"
       
  1391     
       
  1392     self error.
       
  1393 
       
  1394     "Modified: / 14-11-2007 / 11:24:50 / haja"
       
  1395     "Created: / 10-02-2008 / 10:45:24 / janfrog"
       
  1396 !
       
  1397 
       
  1398 visitCStructFieldNode:aStructFieldNode 
       
  1399     ((parentNode references:CStructNode) 
       
  1400         or:[(parentNode references:CUnionNode)]) ifFalse:[
       
  1401         self error.
       
  1402     ].
       
  1403     (self isArray:aStructFieldNode) ifTrue:[
       
  1404         ((self isArrayStructure:aStructFieldNode) 
       
  1405             | (self isArrayUnion:aStructFieldNode)) 
       
  1406                 ifTrue:[
       
  1407                     ^ self generateArrayCompositeStructAccessMethods:aStructFieldNode
       
  1408                         in:parentNode.
       
  1409                 ].
       
  1410         self generateArrayStructAccessMethod:aStructFieldNode in:parentNode.
       
  1411     ] ifFalse:[
       
  1412         ((self isAnyStructure:aStructFieldNode) 
       
  1413             | (self isAnyUnion:aStructFieldNode)) 
       
  1414                 ifTrue:[
       
  1415                     ^ self generateCompositeStructAccessMethods:aStructFieldNode
       
  1416                         in:parentNode.
       
  1417                 ].
       
  1418         self generateBasicStructAccessMethod:aStructFieldNode in:parentNode.
       
  1419     ].
       
  1420 
       
  1421     "Modified: / 27-11-2007 / 18:26:51 / haja"
       
  1422     "Created: / 10-02-2008 / 10:45:36 / janfrog"
       
  1423 !
       
  1424 
       
  1425 visitCStructNode:aStructNode 
       
  1426     (aStructNode foreign | aStructNode local) ifTrue:[
       
  1427         ^ self
       
  1428     ].
       
  1429     self stBuilder 
       
  1430         class:aStructNode name
       
  1431         superclass:'ExternalAddress'
       
  1432         category:nameSpace , ' - C Structures'.
       
  1433     self cr.
       
  1434     self stBuilder primitiveDefinitionsFor:aStructNode name
       
  1435         with:[
       
  1436             self cBuilder 
       
  1437                 definitionPrimitiveWith:[
       
  1438                     self cBuilder commentWith:'here place needed include directives'.
       
  1439                     self cr.
       
  1440                     self generateInclude.
       
  1441                 ].
       
  1442         ].
       
  1443     self cr.
       
  1444     (aStructNode fields isEmpty) ifFalse:[
       
  1445         self generateStructOrUnionCreateMethod:aStructNode.
       
  1446         self generateStructOrUnionFreeMethod:aStructNode.
       
  1447     ].
       
  1448     self generateStructOrUnionCreateNULLPointerMethod:aStructNode.
       
  1449     parentNode := aStructNode.
       
  1450     self visit:aStructNode fields.
       
  1451 
       
  1452     "Modified: / 06-01-2008 / 16:10:11 / haja"
       
  1453     "Created: / 10-02-2008 / 10:45:43 / janfrog"
       
  1454 !
       
  1455 
       
  1456 visitCTypedefNode:aTypeDefNode 
       
  1457     (aTypeDefNode foreign) ifTrue:[
       
  1458         ^ self
       
  1459     ].
       
  1460     self stBuilder 
       
  1461         class:aTypeDefNode name
       
  1462         superclass:'ExternalAddress'
       
  1463         category:nameSpace , ' - C TypeDefs'.
       
  1464     self cr.
       
  1465     self stBuilder primitiveDefinitionsFor:aTypeDefNode name
       
  1466         with:[
       
  1467             self cBuilder 
       
  1468                 definitionPrimitiveWith:[
       
  1469                     self cBuilder commentWith:'here place needed include directives'.
       
  1470                     self cr.
       
  1471                     self generateInclude.
       
  1472                 ].
       
  1473         ].
       
  1474     self cr.
       
  1475     self stBuilder 
       
  1476         methodFor:aTypeDefNode name
       
  1477         category:'accessing'
       
  1478         with:[
       
  1479             self nextPutString:'value'.
       
  1480             self cr.
       
  1481             self cr.
       
  1482             self generateCommentFor:aTypeDefNode.
       
  1483             self cr.
       
  1484             self cBuilder 
       
  1485                 primitiveWith:[
       
  1486                     self cBuilder 
       
  1487                         declareId:'temp'
       
  1488                         asString:aTypeDefNode name , ' *'
       
  1489                         init:'__externalAddressVal( self )'.
       
  1490                     self cBuilder returnMacro:true
       
  1491                         with:[
       
  1492                             self cBuilder 
       
  1493                                 functionCall:[ self cBuilder objectCreation:aTypeDefNode id ]
       
  1494                                 withString:'temp'.
       
  1495                         ].
       
  1496                 ].
       
  1497         ].
       
  1498     self cr.
       
  1499     self stBuilder 
       
  1500         methodFor:aTypeDefNode name
       
  1501         category:'accessing'
       
  1502         with:[
       
  1503             self nextPutString:'value:aValue'.
       
  1504             self cr.
       
  1505             self cr.
       
  1506             self generateCommentFor:aTypeDefNode.
       
  1507             self cr.
       
  1508             self cBuilder 
       
  1509                 primitiveWith:[
       
  1510                     self cBuilder 
       
  1511                         declareId:'temp'
       
  1512                         asString:aTypeDefNode name , ' *'
       
  1513                         init:'__externalAddressVal( self )'.
       
  1514                     self cBuilder 
       
  1515                         assign:[ self cBuilder valueExtraction:aTypeDefNode id variable:'aValue'. ]
       
  1516                         to:'temp'.
       
  1517                 ].
       
  1518         ].
       
  1519 
       
  1520     "Modified: / 19-12-2007 / 17:31:47 / haja"
       
  1521     "Created: / 10-02-2008 / 10:45:50 / janfrog"
       
  1522 !
       
  1523 
       
  1524 visitCUnionNode:aUnionNode 
       
  1525     (aUnionNode foreign) ifTrue:[
       
  1526         ^ self
       
  1527     ].
       
  1528     self stBuilder 
       
  1529         class:aUnionNode name
       
  1530         superclass:'ExternalAddress'
       
  1531         category:nameSpace , ' - C Unions'.
       
  1532     self cr.
       
  1533     self stBuilder primitiveDefinitionsFor:aUnionNode name
       
  1534         with:[
       
  1535             self cBuilder 
       
  1536                 definitionPrimitiveWith:[
       
  1537                     self cBuilder commentWith:'here place needed include directives'.
       
  1538                     self cr.
       
  1539                     self generateInclude.
       
  1540                 ].
       
  1541         ].
       
  1542     self cr.
       
  1543     (aUnionNode fields isEmpty) ifFalse:[
       
  1544         self generateStructOrUnionCreateMethod:aUnionNode.
       
  1545         self generateStructOrUnionFreeMethod:aUnionNode.
       
  1546     ].
       
  1547     self generateStructOrUnionCreateNULLPointerMethod:aUnionNode.
       
  1548     parentNode := aUnionNode.
       
  1549     self visit:aUnionNode fields.
       
  1550 
       
  1551     "Modified: / 06-01-2008 / 16:10:27 / haja"
       
  1552     "Created: / 10-02-2008 / 10:46:54 / janfrog"
       
  1553 !
       
  1554 
       
  1555 visitIdNode:anIdNode
       
  1556 
       
  1557     "shouldn't reach"
       
  1558     self error.
       
  1559 
       
  1560     "Modified: / 14-11-2007 / 11:24:56 / haja"
       
  1561     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
  1562 !
       
  1563 
       
  1564 visitSequenceableCollection:aCollection with:aParameter 
       
  1565     aCollection do:[:aNode | 
       
  1566         self visit:aNode.
       
  1567     ].
       
  1568 
       
  1569     "Created: / 08-02-2008 / 08:39:26 / janfrog"
       
  1570 !
       
  1571 
       
  1572 visitUnionFieldNode:aUnionFieldNode 
       
  1573     (parentNode references:CUnionNode) ifFalse:[
       
  1574         self error.
       
  1575     ].
       
  1576     self stBuilder 
       
  1577         methodFor:parentNode name
       
  1578         category:'accessing'
       
  1579         with:[
       
  1580             self nextPutString:aUnionFieldNode name.
       
  1581             self cr.
       
  1582             self cr.
       
  1583             self generateCommentFor:aUnionFieldNode.
       
  1584             self cr.
       
  1585             self cBuilder 
       
  1586                 primitiveWith:[
       
  1587                     self cBuilder 
       
  1588                         declareId:'temp'
       
  1589                         asString:(self declarationCString:parentNode)
       
  1590                         init:'__externalAddressVal( self )'.
       
  1591                     self cBuilder returnMacro:true
       
  1592                         with:[
       
  1593                             self cBuilder 
       
  1594                                 functionCall:[ self cBuilder objectCreation:aUnionFieldNode id ]
       
  1595                                 withString:[ self cBuilder struct:'temp' access:aUnionFieldNode name. ].
       
  1596                         ].
       
  1597                 ].
       
  1598         ].
       
  1599     self cr.
       
  1600     self stBuilder 
       
  1601         methodFor:'accessing'
       
  1602         category:parentNode name
       
  1603         with:[
       
  1604             self nextPutString:aUnionFieldNode name , ':aValue'.
       
  1605             self cr.
       
  1606             self cr.
       
  1607             self generateCommentFor:aUnionFieldNode.
       
  1608             self cr.
       
  1609             self cBuilder 
       
  1610                 primitiveWith:[
       
  1611                     self cBuilder 
       
  1612                         declareId:'temp'
       
  1613                         asString:(self declarationCString:parentNode)
       
  1614                         init:'__externalAddressVal( self )'.
       
  1615                     self cBuilder 
       
  1616                         assign:[ self cBuilder valueExtraction:aUnionFieldNode id variable:'aValue'. ]
       
  1617                         to:[ self cBuilder struct:'temp' access:aUnionFieldNode name ].
       
  1618                 ].
       
  1619         ].
       
  1620 
       
  1621     "Modified: / 19-12-2007 / 17:30:01 / haja"
       
  1622     "Created: / 08-02-2008 / 08:39:27 / janfrog"
       
  1623     "Modified: / 10-02-2008 / 11:16:09 / janfrog"
       
  1624 ! !
   176 ! !
  1625 
   177 
  1626 !SmalltalkXGenerator class methodsFor:'documentation'!
   178 !SmalltalkXGenerator class methodsFor:'documentation'!
  1627 
   179 
  1628 version
   180 version