bug report: __pp_Process()

156 views
Skip to first unread message

Wen Sheng

unread,
Jul 8, 2025, 10:08:55 AMJul 8
to Harbour Developers
<code>
#include "hbclass.ch"
local cCode   := '',;
      cCodePP := '',;
      l_pp    := __pp_Init()
//
cCode += '#include "\harbour\include\hbclass.ch"'+hb_eol()
cCode += '? "zzz"'+hb_eol()
cCode += 'CLASS TW2UI'+hb_eol()
//cCode += '//'+hb_eol()      // <--- remove comment is ok!!
cCode += '  VAR cThemeName'+hb_eol()
cCode += '  METHOD New()'+hb_eol()
cCode += 'ENDCLASS'+hb_eol()
cCode += ''+hb_eol()
cCode += 'METHOD TW2UI:New()'+hb_eol()
cCode += 'RETURN self'+hb_eol()

? "code:",hb_eol(),cCode

cCodePP := __pp_Process( l_pp, cCode ) 
? "PP code:",hb_eol(),cCodePP

oHrb = HB_CompileFromBuf( cCodePP, .T., "-m", "-n2", "-q2", ;
       "-I" + hb_GetEnv( "HB_INCLUDE" ), hb_GetEnv( "HB_USER_PRGFLAGS" ) )

return
</code>

run: hb_mk2 test.prg
and execute test.exe show:
Error COMPILER/30  Syntax error "syntax error at '_HB_MEMBER'": line:4                                                  Called from HB_COMPILEFROMBUF(0)                                                                                        Called from TEST(23)

It's ok when I remove comment from line 9.


Aleksander Czajczynski

unread,
Jul 8, 2025, 10:30:58 AMJul 8
to harbou...@googlegroups.com
Fantastic self-contained example! Extra inception level.

//cCode += hb_eol()      // <--- remove comment is ok!!

Even empty line added here "fixes" it, comment doesn't matter. Always an oddity lurking, most CLASS code in fact has this empty line after (CREATE) CLASS xxx.

https://os.allcom.pl/hbv3/#!eJx1Ul1vgjAUfe-vuHYPQgRJfHQziyIKiWOEj-2RaFcDWUsdoEv89StFDDGsD23vOeee3vaWCbJnQGzxRQFgvoDx2HhGoIZCg-ABZenpBK02ldvUK_Ja0--0cMMVsizUWk5k6lNeEHaWAb5trOxA2L6qpiTD40l2SKlgmt7LeAV8vV6HOXu3jCKIP2eJ1-MtC-6SDmzrkcyLaZpQUi4uFIjgnBY15BWI79GoZwzwsQyBxBnl1N9zOng6wJsTu-9r8Omvpg9KHH-tahwkB8GbpbrT_H_j0ImT0IeKsmOPR_KxiJTMsdFhhspBqNc_1amgFIRWlaZaaNweTIfGQaoGTYIAIeGWB1iAu0ptwU85o5tS8NX5qHUfxIBpPDUAmxw3czFTy0-zdL9Cxh6GSdObLa2d4qIBloaeb--StYNBNx6pJHLC NAi3m91yG0kByKuWtD6XxR9p_77u

Inception "ported" to playground for others.

It should be emphasized that oddity doesn't happen when the same code is passed normally to the compiler:

https://os.allcom.pl/hbv3/#!eJxTzsxLzilNSVVQgjL0M5KScxKLi_WSM5S47BWUqqqqlLicfRyDgxVCwo1CPbkUFMIcgxSSQzJSc1P9EnNTgQK-riEe_i4KfqnlGppcrn4uYOVcXFBhsDYriGSQa0hokJ9CcWpOGgDgqyOO

Best regards, Aleksander

Wen Sheng wrote:
--
You received this message because you are subscribed to the Google Groups "Harbour Developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email to harbour-deve...@googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/harbour-devel/c533a1f0-f1bd-4552-a782-7b9d5eec1facn%40googlegroups.com.

Wen Sheng

unread,
Jul 8, 2025, 10:53:25 AMJul 8
to Harbour Developers

I discovered this while testing mod_harbour.
Aleksander Czajczynski 在 2025年7月8日 星期二晚上10:30:58 [UTC+8] 的信中寫道:

Aleksander Czajczynski

unread,
Jul 8, 2025, 12:28:05 PMJul 8
to harbou...@googlegroups.com
.c code suggests that __pp_Process() expects a line of code (hb_parseLine() is called), nothing more. Function description does not tell about it.

https://os.allcom.pl/hbv3/#!eJx1Uk1vozAUvPtXjLyHQMMGqcdU1YoQEpCyFBGy7Q0R1w2oxk752Er59TWQtFFFffDHm3nj9zwWimUCzFXPHMD8HpOJdUfQjz4aRd-iIj0eMXBTvU0DWTSG-QkrP15YYJtCcmLbZFCeaoVfhWSi1Qd63tj5nomsrmcsp5Npvk-5EoZ5lfEH9HQ6jWPuxtlukTze7oJRHPjnxGBJzkseZiX_gfTXS_yHJUL-bpijFC9c9leNgqPBs2Rf2vxn4dhLdnGImouXK5zonpmmzKl1iVl9DiGrhxie4_rD2yII4S9SJ1GvXNbG4JWFSxJMcmXg9GxVVCnGa83uPDybhOlXkn0DpsqSy6aQB6i2-YJyXmn59 0IIFLKp1HPLOJqcY98ekB2yQuLGhgkSek9J14W-drSRKCJE-dUe9139riqPheCrSpWL9sW4VGxhlsws0N8l7WZ52y9v3XL5Z_oc0KH4NW88-d8A1YJB6G52S4_CtL5Du60Xp1G8Xm2c9VYThjfqBql401byA9cf208

The oddity is back though if  __pp_Process() does not get hb_eol() at the end. Implementing code scans the previous "output buffer" of the preprocessor if it contains end-of-line character. Such example seems to work as expected:

local cCode   := '',;
      cCodePP := '',;
      l_pp    := __pp_Init(),;
      oHRB, cLine
//
cCode += '#include "include/hbclass.ch"'+hb_eol()

cCode += '? "zzz"'+hb_eol()
cCode += 'CLASS TW2UI'+hb_eol()
cCode += '  VAR cThemeName'+hb_eol()
cCode += '  METHOD New()'+hb_eol()
cCode += 'ENDCLASS'+hb_eol()
cCode += ''+hb_eol()
cCode += 'METHOD TW2UI:New()'+hb_eol()
cCode += 'RETURN self'+hb_eol()

? "code:",hb_eol(),cCode

FOR EACH cLine IN hb_ATokens( cCode, hb_eol() )
   cCodePP += __pp_Process( l_pp, cLine + hb_eol() /* commenting out hb_eol() here, will introduce the bug again */ )
NEXT

? "PP code:",hb_eol(),cCodePP

oHrb = HB_CompileFromBuf( cCodePP, .T., "-m", "-n2", "-q2", ;
       "-I" + hb_GetEnv( "HB_INCLUDE" ), hb_GetEnv( "HB_USER_PRGFLAGS" ) )
      
return

Wen Sheng wrote:

I discovered this while testing mod_harbour.
Aleksander Czajczynski 在 2025年7月8日 星期二晚上10:30:58 [UTC+8] 的信中寫道:
Fantastic self-contained example! Extra inception level.

//cCode += hb_eol()      // <--- remove comment is ok!!

Even empty line added here "fixes" it, comment doesn't matter. Always an oddity lurking, most CLASS code in fact has this empty line after (CREATE) CLASS xxx.

Wen Sheng

unread,
Jul 8, 2025, 9:30:38 PMJul 8
to harbou...@googlegroups.com

Aleksander Czajczynski

unread,
Jul 9, 2025, 4:23:02 AMJul 9
to harbou...@googlegroups.com
Here additionally compiler is not happy about old-style assignment with
multiple values/concatenation:
local a="abc"+"def"
local b:="abc"+"def"
Compare:
https://os.allcom.pl/hbv3/#!eJzLyU9OzFFItFVKTEpW0lZKSU1T4soBiyVZoQhyAQAVbgv8

But after changing the assignment style it still didn't work. Please
continue! So that we know the scope of the problem before fixing attempts.

https://os.allcom.pl/hbv3/#!eJydVN-TmjAQfs9fsUMfxJNq5x51bAcRhalFBrHXNybEnDAXEi_AOfrXN_zQs1d8aMMMSXa_bzd8u4EJghkQS-woAIyn0OsZEwT1qK2-_8HKosMBGmyklpHL00LvX93CCWYGkFXKKRqNUBN5oCJ8Sjlhpdpo7WKUxIThPB-SROsNkjiigun9G8Y30M7nc7fPWpmbDYRPj1u30w_w0wyAhAnNqIczegf0ww6d9Rw8etT7nRDbm9epOp2dxjZkfbTx_cCsFh6PpxqOiTaYAHTC7ivQBIjfA_wXn1z5_0gP7HAbeJBT9nzjR6pmREHGmnGxGTUHodEDHIV8wVKUfAevJWZpcTIgLyVlJyiSNAeCOexoXkhxglxkFEL7Vzhbra3vcJB4n2F4GKH5Gp4cd2WDWeigqWcA11RtI_fhK3xBlw6uOnVTyFBirjcW4y_eZQV9pCoO8zVC97mTP7maplhosQ7ANi2naX1wvQphhuKF8vxKvUlzc78G7U3ypSA0V-jqirV36CYTKAWJyDLKi5TvQZTFuyuhUoU_poxBypV-u5JQpSmFuNwD3uOUK-mULshTilZFUmk76-T7CAlHxjAFZxZZIjukjC6kyGbls345sQHDcKg-_HOmVW_-WE-v1XT5Dai928q0pIXN31StVEDXs1bbua0UMz66ths7iPxguViZy40CNBpVA0lalJL_BuJyUis

I'm no PP expert, if the ";" is normally processed and lines are
collapsed before preprocessor is fed. Would have to check out all that.

local cCode := '',;
cCodePP := '',;
l_pp := __pp_Init(),;
oHRB, cLine
//
cCode += '#include "include/hbclass.ch"'+hb_eol()
cCode += '? "zzz"'+hb_eol()
cCode += 'CLASS TW2UI'+hb_eol()
cCode += ' VAR cThemeName'+hb_eol()
cCode += ' METHOD New()'+hb_eol()
cCode += 'ENDCLASS'+hb_eol()
cCode += ''+hb_eol()
cCode += 'METHOD TW2UI:New()'+hb_eol()
cCode += 'local a:="abc"+; '+hb_eol()
cCode += '"zzz"'+hb_eol()
cCode += 'local b:="abc"+; '+hb_eol()
cCode += '"zzz"'+hb_eol()
cCode += 'local c:="abc"+;'+hb_eol()
cCode += '"zzz"'+hb_eol()
cCode += 'RETURN self'+hb_eol()

? "code:",hb_eol(),cCode

/* workaround quality, surely this can destroy some TEXTBLOCK pragma */
DO WHILE At( " " + hb_eol(), cCode ) > 0
cCode := StrTran( cCode, " " + hb_eol(), hb_eol() )
END DO

cCode := StrTran( cCode, ";" + hb_eol(), "" )

FOR EACH cLine IN hb_ATokens( cCode, hb_eol() )
cCodePP += __pp_Process( l_pp, cLine + hb_eol() /* commenting out
hb_eol() here, will introduce the bug again */ )
NEXT
? "PP code:",hb_eol(),cCodePP

oHrb = HB_CompileFromBuf( cCodePP, .T., "-m", "-n2", "-q2", ;
"-I" + hb_GetEnv( "HB_INCLUDE" ), hb_GetEnv( "HB_USER_PRGFLAGS" ) )

return

Wen Sheng wrote:
> Not good!
> You can run test it
>
> https://os.allcom.pl/hbv3/#!eJx1UsuOokAU3ddX3NQshIaRpJcaM0FEIXFogjjdOwLlbSFTVDk8phO_vgvQbmOwFvW459xT98UlSzkwRx4QAGYLmEzMOYF-9dYwvLPy5HSCgZuoa-KLotH0L1h60dIEti0EEssig7KhFH4UgvFWPejlYuUZ42ldT1lOJ0aeJSi5pt94_AJ6Pp_HMWdr73YQvz7v_VEc4I8dAYtzLDFIS3xA-u3G3ssKAvzQ9FGKG6z6r0bBUeNFsg9t9liY94VPFzTNGDXmo5zH6UduvI8CqJG_3-BEVYwpyoyaV5vZ-xCyfonAtR1v6Az4AXjLxI7lXxS1NnTahKsT6OSm_cal0WElGdaK3U3ApcVgfDtZT8BkWaJoCnEE2TbfUI6Vkv8oOIdCNJU8tAyhyRGy9gjpMS0EPFmgAwnct7jLQn07mkgYEiK9KoNFF78jy1PBcV3Jctm-a9eITZjGUxPoz5J2u3juj3_dcZ1S9fbpEPwGG1f814AqQT9wtvuVS0E376H9zo2SMNqst_ZmpwhDjbpFKmzaSnwCM_jtIA
> <https://os.allcom.pl/hbv3/#%21eJx1UsuOokAU3ddX3NQshIaRpJcaM0FEIXFogjjdOwLlbSFTVDk8phO_vgvQbmOwFvW459xT98UlSzkwRx4QAGYLmEzMOYF-9dYwvLPy5HSCgZuoa-KLotH0L1h60dIEti0EEssig7KhFH4UgvFWPejlYuUZ42ldT1lOJ0aeJSi5pt94_AJ6Pp_HMWdr73YQvz7v_VEc4I8dAYtzLDFIS3xA-u3G3ssKAvzQ9FGKG6z6r0bBUeNFsg9t9liY94VPFzTNGDXmo5zH6UduvI8CqJG_3-BEVYwpyoyaV5vZ-xCyfonAtR1v6Az4AXjLxI7lXxS1NnTahKsT6OSm_cal0WElGdaK3U3ApcVgfDtZT8BkWaJoCnEE2TbfUI6Vkv8oOIdCNJU8tAyhyRGy9gjpMS0EPFmgAwnct7jLQn07mkgYEiK9KoNFF78jy1PBcV3Jctm-a9eITZjGUxPoz5J2u3juj3_dcZ1S9fbpEPwGG1f814AqQT9wtvuVS0E376H9zo2SMNqst_ZmpwhDjbpFKmzaSnwCM_jtIA>


Ignacio Ortiz de Zúñiga

unread,
Jul 9, 2025, 6:14:06 AMJul 9
to harbou...@googlegroups.com
local a="abc"+"def"

I don't think it's a Clipper standard. ':=' must be used. 

Regards 


Wen Sheng

unread,
Jul 9, 2025, 10:00:01 AMJul 9
to Harbour Developers
Same error!!
You can run a link test to see!!

Ignacio Ortiz de Zúñiga 在 2025年7月9日 星期三下午6:14:06 [UTC+8] 的信中寫道:

Aleksander Czajczynski

unread,
Jul 9, 2025, 11:00:44 AMJul 9
to harbou...@googlegroups.com
It's not the same error:

cCode += 'METHOD TW2UI:New()'+hb_eol()
cCode += 'local a="abc"+;'+hb_eol()
cCode += '"zzz"'+hb_eol()
-> Error COMPILER/30 Syntax error "syntax error at '='": line:5


cCode += 'METHOD TW2UI:New()'+hb_eol()
cCode += 'local a:="abc"+;'+hb_eol()
cCode += '"zzz"'+hb_eol()
-> Error COMPILER/20  Incomplete statement or unbalanced delimiters: line:5
Wen Sheng wrote:
--
You received this message because you are subscribed to the Google Groups "Harbour Developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email to harbour-deve...@googlegroups.com.

Aleksander Czajczynski

unread,
Jul 9, 2025, 11:17:14 AMJul 9
to harbou...@googlegroups.com
Reply all
Reply to author
Forward
0 new messages