On Fri, Mar 11, 2016 at 12:24 PM, Julia Tylors <[email protected]> wrote:
> Maybe the code generated should be looking something like this :
>
>
> GenSym(0) =
> ((top(getfield))((top(getfield))(Transmission,:Download),:download_task))(Val{symbol("##7731")},x,y,v1,v2)
> #s222 = (top(start))(GenSym(0))
> GenSym(1) = (top(indexed_next))(GenSym(0),1,#s222)
> v3 = (top(getfield))(GenSym(1),1)
> #s222 = (top(getfield))(GenSym(1),2)
> GenSym(2) = (top(indexed_next))(GenSym(0),2,#s222)
> v4 = (top(getfield))(GenSym(2),1)
> #s222 = (top(getfield))(GenSym(2),2)
>
> I am kind of confused, can somebody offer some solution to my problem?
> Thanks
>
FWIW, you should never generate `GenSym()`'s yourself. And you also
shouldn't use `expand` in the macro.
>
> On Thursday, March 10, 2016 at 11:50:47 PM UTC-8, Julia Tylors wrote:
>>
>> Now the generated code looks like this:
>>
>> AST(:($(Expr(:lambda, Any[:x,:y],
>> Any[Any[Any[:x,:Any,1],Any[:y,:Any,1],Any[:v1,:Any,7],Any[:v2,:Any,7]],Any[],0,Any[]],
>> :(begin # none, line 2:
>> NewvarNode(:v1)
>> NewvarNode(:v2)
>> v1 = 2.1
>> v2 = 2.2
>> (v1,v2) =
>> ((top(getfield))((top(getfield))(Transmission,:Download),:download_task))(Val{symbol("##7731")},x,y,v1,v2)
>> return v1 + v2
>> end)))))
>>
>> however, when i call test(1.1,2.2), it gives me the following error:
>>
>> signal (11): Segmentation fault
>> var_binding_pointer at codegen.cpp:2858
>> emit_assignment at codegen.cpp:3052
>> emit_function at codegen.cpp:4697
>> jl_eh_restore_state at julia.h:1410
>> jl_compile at codegen.cpp:812
>> jl_trampoline_compile_function at builtins.c:1025
>> jl_apply at gf.c:1709
>> do_call at interpreter.c:66
>> eval at interpreter.c:213
>> jl_toplevel_eval_flex at toplevel.c:544
>> jl_eh_restore_state at julia.h:1410
>> eval_user_input at ./REPL.jl:62
>> unknown function (ip: 0x7f52402a9497)
>> jl_apply at gf.c:1711
>> anonymous at ./REPL.jl:85
>> start_task at task.c:246
>> unknown function (ip: (nil))
>> Segmentation fault
>>
>>
>>
>>
>>
>> On Thursday, March 10, 2016 at 10:07:05 PM UTC-8, Julia Tylors wrote:
>>>
>>> I fixed it, It should have been like this:
>>>
>>> (:v1,:v2) =
>>> ((top(getfield))((top(getfield))(Staged,:Runtime),:kernel_call))(Val{symbol("##7731")},x,y,v1,v2)
>>>
>>> On Thursday, March 10, 2016 at 3:48:49 PM UTC-8, Yichao Yu wrote:
>>>>
>>>> On Thu, Mar 10, 2016 at 6:04 PM, Julia Tylors <[email protected]>
>>>> wrote:
>>>> >
>>>> >
>>>> > Hi fellows, I have a problem which i can't solve.
>>>> >
>>>> > I have a function test(x,y) which has the ast as follows:
>>>> > (test.env.defs.func.code)
>>>> >
>>>> >
>>>> > :($(Expr(:method, :test,
>>>> > :((top(svec))((top(apply_type))(Tuple,Any,Any),(top(svec))())),
>>>> > AST(:($(Expr(:lambda, Any[:x,:y],
>>>> >
>>>> > Any[Any[Any[:x,:Any,1],Any[:y,:Any,1],Any[:v1,:Any,7],Any[:v2,:Any,7]],Any[],0,Any[]],
>>>> > :(begin # none, line 2:
>>>> > NewvarNode(:v1)
>>>> > NewvarNode(:v2)
>>>> > v1 = 2.1
>>>> > v2 = 2.2
>>>> > $(Expr(:(=), :v1, :v2,
>>>> >
>>>> > :(((top(getfield))((top(getfield))(Transmission,:Download),:download_task))(Val{symbol("##7775")},x,y,v1,v2))))
>>>> > return v1 + v2
>>>> > end))))), false)))
>>>> >
>>>> >
>>>>
>>>> Can you show how you generated `test`?
>>>>
>>>> >
>>>> > when i call test(1.1,2.2), it returns 4.4 but it should have returned
>>>> > v1 = 1.1*2.2 = 2.42
>>>> > v2 = 2.2*2.1 = 4.62
>>>> >
>>>> > so the result should be v1+v2 , 7.04
>>>> >
>>>> > Here is the download_task function.
>>>> > @generated function download_task{id}(::Type{Val{id}}, args...)
>>>> > println("Download Task $id for argument types $args")
>>>> > :((args[1] * args[2]), (args[2] * args[3]))
>>>> > end
>>>> >
>>>> > I am suspicious about the part in bold
>>>> >
>>>> > $(Expr(:(=), :v1, :v2,
>>>> >
>>>> > :(((top(getfield))((top(getfield))(Transmission,:Download),:download_task))(Val{symbol("##7775")},x,y,v1,v2))))
>>>> >
>>>> > this part doesn't get executed! Or somewhat expanded wrong. I am not
>>>> > totally
>>>> > sure.
>>>> > Anyone with a better understanding , please help me out.!
>>>> >
>>>> > Thanks