Mercurial > repos > tabletprog
diff modules/os.tp @ 315:f987bb2a1911
WIP native compiler work
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Sat, 14 Mar 2015 12:10:51 -0700 |
parents | d1dc2d70bdfd |
children |
line wrap: on
line diff
--- a/modules/os.tp Sat Mar 14 12:10:40 2015 -0700 +++ b/modules/os.tp Sat Mar 14 12:10:51 2015 -0700 @@ -121,5 +121,118 @@ intret num!: (sleep: (secs num)) intret } + + llMessage: execv withVars: { + opath <- object ptr + path <- string ptr + eargs <- object ptr + oarglen <- object ptr + arglen <- obj_int32 ptr + i <- int32_t + oi <- obj_int32 ptr + oarg <- object ptr + arg <- string ptr + cargs <- (char ptr) ptr + } andCode: :opath eargs { + path <- (mcall: string 1 opath) castTo: (string ptr) + oarglen <- mcall: length 1 eargs + arglen <- (mcall: int32 1 oarglen) castTo: (obj_int32 ptr) + cargs <- GC_MALLOC_ATOMIC: (sizeof: (char ptr)) * ((arglen num) + 1) + i <- 0 + while: { i < (arglen num) } do: { + oi <- make_object: (addr_of: obj_int32_meta) NULL 0 + oi num!: i + oarg <- mcall: get 2 eargs oi + arg <- (mcall: string 1 oarg) castTo: (string ptr) + cargs set: i (arg data) + i <- i + 1 + } + cargs set: i NULL + i <- execv: (path data) cargs + oi <- make_object: (addr_of: obj_int32_meta) NULL 0 + oi num!: i + oi + } + + llMessage: execvp withVars: { + opath <- object ptr + path <- string ptr + eargs <- object ptr + oarglen <- object ptr + arglen <- obj_int32 ptr + i <- int32_t + oi <- obj_int32 ptr + oarg <- object ptr + arg <- string ptr + cargs <- (char ptr) ptr + } andCode: :opath eargs { + path <- (mcall: string 1 opath) castTo: (string ptr) + oarglen <- mcall: length 1 eargs + arglen <- (mcall: int32 1 oarglen) castTo: (obj_int32 ptr) + cargs <- GC_MALLOC_ATOMIC: (sizeof: (char ptr)) * ((arglen num) + 1) + i <- 0 + while: { i < (arglen num) } do: { + oi <- make_object: (addr_of: obj_int32_meta) NULL 0 + oi num!: i + oarg <- mcall: get 2 eargs oi + arg <- (mcall: string 1 oarg) castTo: (string ptr) + cargs set: i (arg data) + i <- i + 1 + } + cargs set: i NULL + i <- execvp: (path data) cargs + oi <- make_object: (addr_of: obj_int32_meta) NULL 0 + oi num!: i + oi + } + + llMessage: execve withVars: { + opath <- object ptr + path <- string ptr + eargs <- object ptr + env <- object ptr + oarglen <- object ptr + arglen <- obj_int32 ptr + i <- int32_t + oi <- obj_int32 ptr + oarg <- object ptr + arg <- string ptr + cargs <- (char ptr) ptr + cenv <- (char ptr) ptr + } andCode: :opath eargs env { + path <- (mcall: string 1 opath) castTo: (string ptr) + oarglen <- mcall: length 1 eargs + arglen <- (mcall: int32 1 oarglen) castTo: (obj_int32 ptr) + cargs <- GC_MALLOC_ATOMIC: (sizeof: (char ptr)) * ((arglen num) + 1) + i <- 0 + while: { i < (arglen num) } do: { + oi <- make_object: (addr_of: obj_int32_meta) NULL 0 + oi num!: i + oarg <- mcall: get 2 eargs oi + arg <- (mcall: string 1 oarg) castTo: (string ptr) + cargs set: i (arg data) + i <- i + 1 + } + cargs set: i NULL + + oarglen <- mcall: length 1 eargs + arglen <- (mcall: int32 1 oarglen) castTo: (obj_int32 ptr) + cenv <- GC_MALLOC_ATOMIC: (sizeof: (char ptr)) * ((arglen num) + 1) + i <- 0 + while: { i < (arglen num) } do: { + oi <- make_object: (addr_of: obj_int32_meta) NULL 0 + oi num!: i + oarg <- mcall: get 2 env oi + arg <- (mcall: string 1 oarg) castTo: (string ptr) + cenv set: i (arg data) + i <- i + 1 + } + cenv set: i NULL + + i <- execve: (path data) cargs cenv + oi <- make_object: (addr_of: obj_int32_meta) NULL 0 + oi num!: i + oi + } } }