Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 54 additions & 0 deletions crates/llmbc/src/opcode.rs
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,47 @@ pub enum Op {
/// Pop a List, push reversed List.
ListReverse,

// String built-ins (0x9A+)
/// Pop two strings (string, sep), push List<String>.
StringSplit,

/// Pop three strings (string, from, to), push String.
StringReplace,

/// Pop a String and two Ints (start, end), push String slice.
StringSlice,

/// Pop a String, push Option<Int>.
IntParse,

/// Pop a String, push Option<Float>.
FloatParse,

/// Pop a Bool, push String ("true" or "false").
BoolToString,

// Map built-ins (0xA0+)
/// Pop a Map and a String key, push Option<Value>.
MapGet,

/// Pop a Map, a String key, and a Value; push new Map with key set.
MapSet,

/// Pop a Map and a String key; push new Map with key removed.
MapRemove,

/// Pop a Map and a String key; push Bool.
MapContainsKey,

/// Pop a Map; push List<String> of keys.
MapKeys,

/// Pop a Map; push List of values.
MapValues,

/// Pop a Map; push Int length.
MapLen,

/// No operation.
Nop,

Expand Down Expand Up @@ -250,6 +291,19 @@ impl Op {
Op::ListAppend => 0x97,
Op::ListConcat => 0x98,
Op::ListReverse => 0x99,
Op::StringSplit => 0x9A,
Op::StringReplace => 0x9B,
Op::StringSlice => 0x9C,
Op::IntParse => 0x9D,
Op::FloatParse => 0x9E,
Op::BoolToString => 0x9F,
Op::MapGet => 0xA0,
Op::MapSet => 0xA1,
Op::MapRemove => 0xA2,
Op::MapContainsKey => 0xA3,
Op::MapKeys => 0xA4,
Op::MapValues => 0xA5,
Op::MapLen => 0xA6,
Op::Nop => 0xFE,
Op::Halt => 0xFF,
}
Expand Down
75 changes: 75 additions & 0 deletions crates/llmc/src/codegen.rs
Original file line number Diff line number Diff line change
Expand Up @@ -390,6 +390,81 @@ impl Emitter {
fe.code.push(Op::ListReverse);
return Ok(());
}
"__builtin_string_split" if args.len() == 2 => {
self.emit_expr(&args[0], fe)?;
self.emit_expr(&args[1], fe)?;
fe.code.push(Op::StringSplit);
return Ok(());
}
"__builtin_string_replace" if args.len() == 3 => {
self.emit_expr(&args[0], fe)?;
self.emit_expr(&args[1], fe)?;
self.emit_expr(&args[2], fe)?;
fe.code.push(Op::StringReplace);
return Ok(());
}
"__builtin_string_slice" if args.len() == 3 => {
self.emit_expr(&args[0], fe)?;
self.emit_expr(&args[1], fe)?;
self.emit_expr(&args[2], fe)?;
fe.code.push(Op::StringSlice);
return Ok(());
}
"__builtin_int_parse" if args.len() == 1 => {
self.emit_expr(&args[0], fe)?;
fe.code.push(Op::IntParse);
return Ok(());
}
"__builtin_float_parse" if args.len() == 1 => {
self.emit_expr(&args[0], fe)?;
fe.code.push(Op::FloatParse);
return Ok(());
}
"__builtin_bool_to_string" if args.len() == 1 => {
self.emit_expr(&args[0], fe)?;
fe.code.push(Op::BoolToString);
return Ok(());
}
"__builtin_map_get" if args.len() == 2 => {
self.emit_expr(&args[0], fe)?;
self.emit_expr(&args[1], fe)?;
fe.code.push(Op::MapGet);
return Ok(());
}
"__builtin_map_set" if args.len() == 3 => {
self.emit_expr(&args[0], fe)?;
self.emit_expr(&args[1], fe)?;
self.emit_expr(&args[2], fe)?;
fe.code.push(Op::MapSet);
return Ok(());
}
"__builtin_map_remove" if args.len() == 2 => {
self.emit_expr(&args[0], fe)?;
self.emit_expr(&args[1], fe)?;
fe.code.push(Op::MapRemove);
return Ok(());
}
"__builtin_map_contains_key" if args.len() == 2 => {
self.emit_expr(&args[0], fe)?;
self.emit_expr(&args[1], fe)?;
fe.code.push(Op::MapContainsKey);
return Ok(());
}
"__builtin_map_keys" if args.len() == 1 => {
self.emit_expr(&args[0], fe)?;
fe.code.push(Op::MapKeys);
return Ok(());
}
"__builtin_map_values" if args.len() == 1 => {
self.emit_expr(&args[0], fe)?;
fe.code.push(Op::MapValues);
return Ok(());
}
"__builtin_map_len" if args.len() == 1 => {
self.emit_expr(&args[0], fe)?;
fe.code.push(Op::MapLen);
return Ok(());
}
// 0.3-S14: builtin `step_input(name)` reads a
// workflow step's resolved upstream output.
// Emits `Op::CapCall(StepInput, 1)` which
Expand Down
13 changes: 13 additions & 0 deletions crates/llmc/src/typeck.rs
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,19 @@ impl TypeChecker {
functions.insert("__builtin_list_append".to_string(), 2);
functions.insert("__builtin_list_concat".to_string(), 2);
functions.insert("__builtin_list_reverse".to_string(), 1);
functions.insert("__builtin_string_split".to_string(), 2);
functions.insert("__builtin_string_replace".to_string(), 3);
functions.insert("__builtin_string_slice".to_string(), 3);
functions.insert("__builtin_int_parse".to_string(), 1);
functions.insert("__builtin_float_parse".to_string(), 1);
functions.insert("__builtin_bool_to_string".to_string(), 1);
functions.insert("__builtin_map_get".to_string(), 2);
functions.insert("__builtin_map_set".to_string(), 3);
functions.insert("__builtin_map_remove".to_string(), 2);
functions.insert("__builtin_map_contains_key".to_string(), 2);
functions.insert("__builtin_map_keys".to_string(), 1);
functions.insert("__builtin_map_values".to_string(), 1);
functions.insert("__builtin_map_len".to_string(), 1);
// 0.3-S14: read a workflow step's resolved input value at
// runtime. Compiles to `Op::CapCall(StepInput, 1)` which
// dispatches through the gateway's StepInputHandler. Returns
Expand Down
Loading
Loading