Improved thread creation on Linux
This commit is contained in:
parent
d0bcd8cf9f
commit
00be603b8f
@ -1,5 +1,4 @@
|
|||||||
import io
|
import io
|
||||||
import sys
|
|
||||||
import thread
|
import thread
|
||||||
|
|
||||||
main() {
|
main() {
|
||||||
@ -12,5 +11,4 @@ main() {
|
|||||||
work() {
|
work() {
|
||||||
io.out("[ ] start\n")
|
io.out("[ ] start\n")
|
||||||
io.out("[x] end\n")
|
io.out("[x] end\n")
|
||||||
sys.exit(0)
|
|
||||||
}
|
}
|
@ -1,9 +1,22 @@
|
|||||||
import sys
|
import sys
|
||||||
|
|
||||||
|
const clone {
|
||||||
|
vm 0x100
|
||||||
|
fs 0x200
|
||||||
|
files 0x400
|
||||||
|
sighand 0x800
|
||||||
|
parent 0x8000
|
||||||
|
thread 0x10000
|
||||||
|
io 0x80000000
|
||||||
|
}
|
||||||
|
|
||||||
create(func *Any) -> Int {
|
create(func *Any) -> Int {
|
||||||
size := 4096
|
size := 4096
|
||||||
stack := sys.mmap(0, size, 0x1|0x2, 0x02|0x20|0x100|0x20000)
|
stack := sys.mmap(0, size, 0x1|0x2, 0x02|0x20|0x100|0x20000)
|
||||||
rip := stack + size - 8
|
stack += size
|
||||||
store(rip, 8, func)
|
stack -= 8
|
||||||
return sys.clone(0x100|0x200|0x400|0x800|0x8000|0x10000|0x80000000, rip)
|
store(stack, 8, _exit)
|
||||||
|
stack -= 8
|
||||||
|
store(stack, 8, func)
|
||||||
|
return sys.clone(clone.vm|clone.fs|clone.files|clone.sighand|clone.parent|clone.thread|clone.io, stack)
|
||||||
}
|
}
|
@ -21,6 +21,7 @@ func (r *Result) finalize() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
final.Call("main.main")
|
final.Call("main.main")
|
||||||
|
final.Label(asm.LABEL, "_exit")
|
||||||
|
|
||||||
switch config.TargetOS {
|
switch config.TargetOS {
|
||||||
case config.Linux:
|
case config.Linux:
|
||||||
|
@ -26,6 +26,11 @@ func (f *Function) ExpressionToMemory(node *expression.Expression, memory asm.Me
|
|||||||
return types.AnyPointer, nil
|
return types.AnyPointer, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if name == "_exit" {
|
||||||
|
f.MemoryLabel(asm.STORE, memory, "_exit")
|
||||||
|
return types.AnyPointer, nil
|
||||||
|
}
|
||||||
|
|
||||||
return nil, errors.New(&errors.UnknownIdentifier{Name: name}, f.File, node.Token.Position)
|
return nil, errors.New(&errors.UnknownIdentifier{Name: name}, f.File, node.Token.Position)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -27,6 +27,23 @@ func (f *Function) Fold(expr *expression.Expression) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if expr.Token.Kind == token.Period {
|
||||||
|
left := expr.Children[0]
|
||||||
|
leftText := left.Token.Text(f.File.Bytes)
|
||||||
|
right := expr.Children[1]
|
||||||
|
rightText := right.Token.Text(f.File.Bytes)
|
||||||
|
constant, isConst := f.Constants[f.Package+"."+leftText+"."+rightText]
|
||||||
|
|
||||||
|
if !isConst {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
value, err := f.ToNumber(constant.Value)
|
||||||
|
expr.Value = value
|
||||||
|
expr.IsFolded = true
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
canFold := true
|
canFold := true
|
||||||
|
|
||||||
for _, child := range expr.Children {
|
for _, child := range expr.Children {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user