Skip to content

Commit 263fc65

Browse files
committed
define socket api
1 parent fb96062 commit 263fc65

File tree

4 files changed

+85
-3
lines changed

4 files changed

+85
-3
lines changed

example/test.gila

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,11 @@ dll = load_gila_abi_dll("./gila_socket/target/debug/gila_socket.dll")
88

99

1010

11+
socket = dll.create_socket(80)
12+
dll.listen_socket(socket)
13+
conn = dll.accept_socket(socket)
1114

12-
res = dll.create_socket(12)
13-
print(res)
15+
16+
17+
18+
print(socket)

gila_socket/src/socket.rs

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,47 @@ pub extern "C" fn create_socket(
1212
println!("create_socket port={:?}", port);
1313
return Object::I64(12);
1414
}
15+
16+
#[no_mangle]
17+
pub extern "C" fn listen_socket(
18+
shared_execution_context: &mut SharedExecutionContext,
19+
execution_context: &mut ProcessContext,
20+
args: Vec<Object>,
21+
) -> Object {
22+
let port = &args[0];
23+
println!("listen_socket port={:?}", port);
24+
return Object::I64(12);
25+
}
26+
27+
#[no_mangle]
28+
pub extern "C" fn accept_socket(
29+
shared_execution_context: &mut SharedExecutionContext,
30+
execution_context: &mut ProcessContext,
31+
args: Vec<Object>,
32+
) -> Object {
33+
let socket = &args[0];
34+
println!("accept_socket socket={:?}", socket);
35+
return Object::I64(12);
36+
}
37+
38+
#[no_mangle]
39+
pub extern "C" fn send_socket(
40+
shared_execution_context: &mut SharedExecutionContext,
41+
execution_context: &mut ProcessContext,
42+
args: Vec<Object>,
43+
) -> Object {
44+
let socket = &args[0];
45+
println!("send_socket socket={:?}", socket);
46+
return Object::I64(12);
47+
}
48+
49+
#[no_mangle]
50+
pub extern "C" fn close_socket(
51+
shared_execution_context: &mut SharedExecutionContext,
52+
execution_context: &mut ProcessContext,
53+
args: Vec<Object>,
54+
) -> Object {
55+
let socket = &args[0];
56+
println!("closing socket={:?}", socket);
57+
return Object::I64(12);
58+
}

src/codegen.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,14 @@ impl BytecodeGenerator<'_> {
347347
load_gila_abi_dll_perm_slot,
348348
);
349349

350+
let load_c_abi_dll_perm_slot = alloc_perm_slot!(self);
351+
self.codegen_context.chunks[self.codegen_context.current_chunk_pointer]
352+
.variable_map
353+
.insert(
354+
Type::IDENTIFIER(Rc::new("load_c_abi_dll".to_string())),
355+
load_c_abi_dll_perm_slot,
356+
);
357+
350358
let __platform___reg = alloc_perm_slot!(self);
351359
self.codegen_context.chunks[self.codegen_context.current_chunk_pointer]
352360
.variable_map

src/execution.rs

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -776,6 +776,16 @@ fn native_open_windows(
776776
return Object::I64(0);
777777
}
778778

779+
fn native_load_c_abi_dll(
780+
shared_execution_context: &mut SharedExecutionContext,
781+
execution_context: &mut ProcessContext,
782+
args: Vec<Object>,
783+
) -> Object {
784+
let path = args[0].as_string(shared_execution_context);
785+
let dll = shared_execution_context.load_gila_abi_dll(path.s.to_string());
786+
Object::GILA_ABI_DLL(dll)
787+
}
788+
779789
pub struct ExecutionEngine<'a> {
780790
pub config: &'a Config,
781791
pub running: bool,
@@ -844,6 +854,20 @@ impl<'a> ExecutionEngine<'a> {
844854
self.environment.stack_frames[self.environment.stack_frame_pointer].stack[2] =
845855
Object::GC_REF(alloc);
846856

857+
let alloc_res = self.shared_execution_context.heap.alloc(
858+
GCRefData::GILA_ABI_FUNCTION_OBJECT(GilaABIFunctionObject::RUST_CALL_CONVENTION(
859+
native_load_c_abi_dll,
860+
)),
861+
config,
862+
);
863+
if alloc_res.is_err() {
864+
return Err(alloc_res.err().unwrap());
865+
}
866+
let alloc = alloc_res.unwrap();
867+
self.environment.stack_frames[self.environment.stack_frame_pointer].stack[3] =
868+
Object::GC_REF(alloc);
869+
870+
///
847871
let alloc_res = self.shared_execution_context.heap.alloc(
848872
GCRefData::STRING(StringObject {
849873
s: Rc::new(env::consts::OS.to_owned()),
@@ -854,7 +878,7 @@ impl<'a> ExecutionEngine<'a> {
854878
return Err(alloc_res.err().unwrap());
855879
}
856880
let alloc = alloc_res.unwrap();
857-
self.environment.stack_frames[self.environment.stack_frame_pointer].stack[3] =
881+
self.environment.stack_frames[self.environment.stack_frame_pointer].stack[4] =
858882
Object::GC_REF(alloc);
859883

860884
Ok(())
@@ -1456,6 +1480,7 @@ impl<'a> ExecutionEngine<'a> {
14561480
let result = unsafe {
14571481
native_fn.invoke(self.shared_execution_context, self.environment, args)
14581482
};
1483+
println!("got result {:?}", result);
14591484
stack_set!(self, destination, result);
14601485
increment_ip!(self);
14611486
}

0 commit comments

Comments
 (0)