diff --git a/pkg/codegen/prelude_prn.go b/pkg/codegen/prelude_prn.go index 43542f7..d034a57 100644 --- a/pkg/codegen/prelude_prn.go +++ b/pkg/codegen/prelude_prn.go @@ -67,7 +67,9 @@ func prnScalar( } else if pointerElemTy, isPtr := rootTy.(*types.PointerType); isPtr { if isStr := rootTy.Equal(types.I8Ptr); isStr { - ctx.block.NewCall(ctx.internal.Cstd.Printf, formatStr, value) + _, nonNullBlock, endBlock := genNilBlock(ctx, types.NewPointer(pointerElemTy), n, value) + nonNullBlock.NewCall(ctx.internal.Cstd.Printf, formatStr, value) + ctx.block = endBlock } else { _, nonNullBlock, endBlock := genNilBlock(ctx, types.NewPointer(pointerElemTy), n, value) diff --git a/script/test-full.sh b/script/test-full.sh index 881eca3..3aa5d04 100755 --- a/script/test-full.sh +++ b/script/test-full.sh @@ -285,6 +285,12 @@ testexec(){ assertexec '(defschema Person {:name :: string :age :: int :isMale :: bool :height :: double :v :: [int]}) (def main :: int (fn [] (let [node :: Person {:age 20 :name "richard" :isMale true :height 5.8 :v [4 3 2]}] (prn (get node :name)) (prn (get node :age)) (prn (get node :isMale)) (prn (get node :height)) (prn (get node :v)) )))' "richard\\\n20\\\ntrue\\\n5.8\\\n[4 3 2]\\\n" assertexec '(defschema Person {:name ::string :next ::Person})(def main ::int (fn [] (let [node ::Person {:name "richard" :next {:name "rebecca" :next {:name "andre" :next {:name "bob"}}}}] (prn (get node :name)) (prn (get (get node :next) :name)) (prn (get (get (get node :next) :next) :name)) (prn (get (get (get (get node :next) :next) :next) :name)))))' "richard\\\nrebecca\\\nandre\\\nbob\\\n" assertexec '(defschema Country {:name ::string})(defschema Person {:name ::string :country ::Country})(def main ::int (fn [] (let [c ::Country {:name "deutsch"} person ::Person {:name "mike" :country c}] (prn (get (get person :country) :name)))))' "deutsch\\\n" + # null access + assertexec '(defschema Person {:name :: string :age :: int :isMale :: bool :height :: double :v :: [int]}) (def main :: int (fn [] (let [node :: Person {:name "richard" :isMale true :height 5.8 :v [4 3 2]}] (prn (get node :age)))))' "0\\\n" + assertexec '(defschema Person {:name :: string :age :: int :isMale :: bool :height :: double :v :: [int]}) (def main :: int (fn [] (let [node :: Person {:age 20 :isMale true :height 5.8 :v [4 3 2]}] (prn (get node :name)))))' "nil\\\n" + assertexec '(defschema Person {:name :: string :age :: int :isMale :: bool :height :: double :v :: [int]}) (def main :: int (fn [] (let [node :: Person {:age 20 :name "richard" :height 5.8 :v [4 3 2]}] (prn (get node :isMale)))))' "false\\\n" + assertexec '(defschema Person {:name :: string :age :: int :isMale :: bool :height :: double :v :: [int]}) (def main :: int (fn [] (let [node :: Person {:age 20 :name "richard" :isMale true :v [4 3 2]}] (prn (get node :height)))))' "0\\\n" + assertexec '(defschema Person {:name :: string :age :: int :isMale :: bool :height :: double :v :: [int]}) (def main :: int (fn [] (let [node :: Person {:age 20 :name "richard" :isMale true :height 5.8 }] (prn (get node :v)))))' "nil\\\n" ############# # Prelude functions