Files
harbour-core/harbour/tests/tstmacro.prg
Viktor Szakats 175f05df56 2013-02-26 14:41 UTC+0100 Viktor Szakats (harbour syenar.net)
* utils/hbmk2/hbmk2.*.po
  * utils/hbmk2/hbmk2.prg
    + do not share plugin variables (hbmk[ "vars" ])
      between different plugins. It avoids potentially nasty
      issues with plugins stepping onto each other's toes.
      [INCOMPATIBLE - though it's unlikely anyone is
      affected. If you must communicate between plugins,
      use public function or variable.]
    + clarified in help that -icon might not work on all
      platforms/compilers and detailed Windows implementation
      (in particular it's disabled on bcc/bcc64 and on
      mingw it won't work when a manual .rc is specified,
      also on some (old?) msvc versions. Consult your
      C compiler's Windows resource handling limitations.)
    + clarified in help the syntax of filters
    + clarified in help that .hbp references are handled as
      sub-projects
    + clarification to command substitution macro
    + clarification to filter syntax note
    ! strict parameter checks in all public shell APIs to
      avoid RTEs inside hbmk2 due to faulty API usage by scripts

  * utils/hbmk2/examples/plug_bis.hb
    * updated according to latest plugin changes

  * include/harbour.hbx
  * include/hbapi.h
  * src/vm/debug.c
  * src/vm/hvm.c
    + added internal function hb_vmInternalsEnabled()
      to query whether potentially sensitive internals
      are allowed to be accessed by public Harbour APIs
    + added .prg level function __vmNoInternals()
      to disable potentially sensitive internals
      by default accessible via public APIs.
      Intentionally a one-way function: once disabled,
      it cannot be reenabled from .prg or .c level.
      NOTE: It will break Harbour debug functionality,
      so it'd will be useful for hbrun scripts and
      release (non-debug) builds.
    + modified internal __dbg*() functions to return
      dummy values when internals are disabled via
      __vmNoInternals() functions. While the function
      return types are kept, apps relying on their
      specific values and certain relationships between
      them might break.
    ; NOTE: In the future, some more internals might
      be protected by this setting (f.e. low-level
      object and class functions and some API from
      hbdebug lib)
    ; Please review

  * tests/debugtst.prg
    ! fixed to compile warning-free without lowering
      warning level
    ! fixed to run RTE-free with internals disabled

  * bin/3rdpatch.hb
  * bin/commit.hb
  * config/postinst.hb
  * contrib/make.hb
  * contrib/hbtest/hbtest.ch
  * src/debug/*.prg
  * src/rtl/tclass.prg
  * utils/hbmk2/examples/plug_bis.hb
  * utils/hbmk2/examples/plug_tpl.hb
    * use short form #pragmas (the ones identical
      to Harbour options)
    ; NOTE: Except -l which works reversed compared
      to cmdline -l option. TOFIX? (I tried and failed)

  * src/rtl/hbi18n2.prg
  * contrib/xhb/tfile.prg
    * use F_ERROR instead of -1 literal

  * contrib/xhb/xhbtedit.prg
    ! replaced dirty xhb extension with std SubStr() call
      Reported by Tony Quick
      [pls report such bugs on Harbour devl list]

  * contrib/hbodbc/todbc.prg
    ! Don't continue ::Open() when SQLExecDir() have error
      Fix from xhb via Vicente Guerra, with cleanups.

  * tests/multifnc/multifnc.hbp
    + added comment
    + support for watcom

  * tests/multifnc/t1.prg
    ! missing file ending EOL

  * tests/*.prg
  * extras/gtwvw/tests/wvwtest9.prg
    * formatting
2013-02-26 13:44:10 +00:00

177 lines
3.8 KiB
Plaintext

/*
* $Id$
*/
#include "hbclass.ch"
MEMVAR cStr, cStr_1, cVar_1, aVar, oVar, OtherVar, SomeVar, Private
MEMVAR cMainPrivate, GlobalPrivate, BornInRunTimeVar, Public
PROCEDURE Main()
PRIVATE cStr := "cVar", cStr_1 := "cVar_1", aVar := { "cVar_1" }, oVar
PRIVATE cVar_1, cMainPrivate := "cVar_1", GlobalPrivate := "BornInRunTimeVar"
// to avoid unused STATIC FUNCTION warnings
UDF_STATIC()
UDF2_STATIC()
&cStr_1 := "Simple "
? M->cVar_1
&( "cVar" + "_1" ) := "Macro"
?? M->cVar_1
M->&cStr_1 := "Aliased"
? M->cVar_1
MEMVAR->&( "cVar" + "_1" ) := " Macro"
?? M->cVar_1
cStr := "cVar_"
&cStr.1 := "Concatenated Macro (Numeric)"
? M->cVar_1
cStr := "cVar"
&cStr._1 := "Concatenated Macro (String)"
? M->cVar_1
&( aVar[1] ) := "Array Macro"
? M->cVar_1
oVar := TValue():New()
oVar:cVal := "cVar_1"
&( oVar:cVal ) := "Class Macro"
? M->cVar_1
SubFun()
? '"cVar_1" = [' + M->cVar_1 + '] AFTER SubFun() PRIVATE'
? M->NewPublicVar
TEST_Type()
RETURN
FUNCTION TValue
STATIC s_oClass
IF s_oClass == NIL
s_oClass := HBClass():New( "TValue" )
s_oClass:AddData( "cVal" )
s_oClass:AddMethod( "New", @New() ) // New() Method
s_oClass:Create()
ENDIF
RETURN s_oClass:Instance()
STATIC FUNCTION New()
LOCAL Self := QSelf()
RETURN Self
FUNCTION SubFun()
? '"cVar_1" = [' + M->cVar_1 + '] BEFORE SubFun() PRIVATE'
// Testing conflict with KEY WORDS
PRIVATE PRIVATE := "I am a Var named PRIVATE ", &cMainPrivate, SomeVar, OtherVar := 1, &GlobalPrivate := "I was born in Run Time"
PUBLIC PUBLIC := "NewPublicVar"
PUBLIC &PUBLIC
? M->NewPublicVar
M->NewPublicVar := "Still Alive because I am PUBLIC"
? M->PRIVATE + PRIVATE
? PRIVATE + M->PRIVATE
? BornInRunTimeVar
&cMainPrivate := "In SubFun()"
? '"cVar_1" = [' + M->cVar_1 + '] in SubFun() PRIVATE'
RETURN NIL
STATIC PROCEDURE TEST_Type()
LOCAL v1, v2, v1a, v2a
LOCAL bErr := ErrorBlock( {| e | Break( e ) } ), oE
?
? "=========== Type() function ================="
v1 := "UDF()"
? "Test for Type('UDF()') - should be 'UI': ", Type( v1 )
v2 := "UDF_STATIC()"
? "Test for Type('UDF_STATIC()') - should be 'U': ", Type( v2 )
? "Test for &" + "'UDF()' - should print 'udf': ", &v1
? "Test for &" + "'UDF_STATIC()' - should print 'ERROR: undefined function': "
BEGIN SEQUENCE
?? &v2
RECOVER USING oE
? "ERROR: " + oE:Description
END SEQUENCE
ErrorBlock( bErr )
v1 := "UDF"
? "Test for Type('UDF') - should be 'U': ", Type( v1 )
v2 := "UDF_STATIC"
? "Test for Type('UDF_STATIC') - should be 'U': ", Type( v2 )
v1a := "UDF:=1"
? "Test for Type('UDF:=1') - should be 'N': ", Type( v1a )
v2a := "UDF_STATIC:=1"
? "Test for Type('UDF_STATIC:=1') - should be 'N': ", Type( v2a )
? "=== after the assignment ==="
v1 := "UDF"
? "Test for Type('UDF') - should be 'N': ", Type( v1 )
v2 := "UDF_STATIC"
? "Test for Type('UDF_STATIC') - should be 'N': ", Type( v2 )
v1 := "UDF()"
? "Test for Type('UDF()') - should be 'UI': ", Type( v1 )
v2 := "UDF_STATIC()"
? "Test for Type('UDF_STATIC()') - should be 'U': ", Type( v2 )
? "=== declared public variable ==="
PUBLIC UDF2, UDF2_STATIC
v1 := "UDF2()"
? "Test for Type('UDF2()') - should be 'UI': ", Type( v1 )
v2 := "UDF2_STATIC()"
? "Test for Type('UDF2_STATIC()') - should be 'U': ", Type( v2 )
v1 := "UDF2"
? "Test for Type('UDF') - should be 'L': ", Type( v1 )
v2 := "UDF2_STATIC"
? "Test for Type('UDF_STATIC') - should be 'L': ", Type( v2 )
?
RETURN
STATIC FUNCTION UDF_STATIC()
RETURN "udf_static"
FUNCTION UDF()
RETURN "udf"
STATIC FUNCTION UDF2_STATIC()
RETURN "udf2_static"
FUNCTION UDF2()
RETURN "udf2"