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
+		}
 	}
 }