Skip to content

Commit

Permalink
feat: refactor schema optional mapping and support internal schema pa…
Browse files Browse the repository at this point in the history
…rtial eval.
  • Loading branch information
Peefy committed Feb 7, 2023
1 parent edd89e6 commit eceaa50
Show file tree
Hide file tree
Showing 29 changed files with 270 additions and 133 deletions.
4 changes: 2 additions & 2 deletions kclvm/capi/src/service/service.rs
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,8 @@ impl KclvmService {
/// use kclvm_capi::model::gpyrpc::*;
/// let serv = &KclvmService { plugin_agent: 0 };
/// let args = &ExecProgram_Args {
/// work_dir: "./src/testdata".to_string(),
/// k_filename_list: vec!["./src/testdata".to_string()],
/// work_dir: ".".to_string(),
/// k_filename_list: vec!["./src/testdata/test.k".to_string()],
/// ..Default::default()
/// };
/// let exec_result = serv.exec_program(args).unwrap();
Expand Down
17 changes: 8 additions & 9 deletions kclvm/compiler/src/codegen/llvm/node.rs
Original file line number Diff line number Diff line change
Expand Up @@ -666,15 +666,6 @@ impl<'ctx> TypedResultWalker<'ctx> for LLVMCodeGenContext<'ctx> {
],
);
}
self.build_void_call(
&ApiFunc::kclvm_schema_optional_check.name(),
&[
schema_value,
attr_optional_mapping,
schema_name_native_str,
schema_config_meta,
],
);
{
let index_sign_key_name = if let Some(index_signature) = &schema_stmt.index_signature {
if let Some(key_name) = &index_signature.node.key_name {
Expand Down Expand Up @@ -735,11 +726,13 @@ impl<'ctx> TypedResultWalker<'ctx> for LLVMCodeGenContext<'ctx> {
&[
schema_value,
schema_config,
schema_config_meta,
schema_name_native_str,
schema_pkgpath_native_str,
is_sub_schema,
record_instance,
instance_pkgpath,
attr_optional_mapping,
],
);
// Schema constructor function returns a schema
Expand Down Expand Up @@ -1933,6 +1926,12 @@ impl<'ctx> TypedResultWalker<'ctx> for LLVMCodeGenContext<'ctx> {
pkgpath,
],
);
// Check the required attributes only when the values of all attributes
// in the final schema are solved.
let is_in_schema = self.schema_stack.borrow().len() > 0;
if !is_in_schema {
self.build_void_call(&ApiFunc::kclvm_schema_optional_check.name(), &[schema]);
}
utils::update_ctx_filename(self, &schema_expr.config);
Ok(schema)
}
Expand Down
10 changes: 0 additions & 10 deletions kclvm/compiler/src/codegen/llvm/utils.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
// Copyright 2021 The KCL Authors. All rights reserved.

use inkwell::values::BasicValueEnum;
use kclvm_ast::ast;
use kclvm_runtime::ApiFunc;
use std::str;
Expand Down Expand Up @@ -60,12 +59,3 @@ pub fn update_ctx_current_line(gen: &LLVMCodeGenContext) {
],
);
}

/// Runtime debug print value
#[allow(dead_code)]
pub fn runtime_print_value<'ctx>(gen: &'ctx LLVMCodeGenContext, value: BasicValueEnum<'ctx>) {
gen.build_void_call(
ApiFunc::kclvm_debug_print_value_json_string.name().as_str(),
&[value],
);
}
1 change: 1 addition & 0 deletions kclvm/makefile
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ COVER_REPORT_FILE_PATH:=$(PWD)/target/llvm-cov/html/index.html
# Generate runtime libraries when the runtime code is changed.
gen-runtime-api:
make -C ./runtime gen-api-spec
make fmt

# Install the wasm target
install-rustc-wasm:
Expand Down
Binary file modified kclvm/runtime/src/_kclvm.bc
Binary file not shown.
18 changes: 2 additions & 16 deletions kclvm/runtime/src/_kclvm.h
Original file line number Diff line number Diff line change
Expand Up @@ -282,20 +282,6 @@ kclvm_value_ref_t* kclvm_datetime_ticks(kclvm_context_t* _ctx, kclvm_value_ref_t

kclvm_value_ref_t* kclvm_datetime_today(kclvm_context_t* _ctx, kclvm_value_ref_t* _args, kclvm_value_ref_t* _kwargs);

void kclvm_debug_hello();

void kclvm_debug_invoke_func(void* fn_ptr);

void kclvm_debug_print(int8_t* cs);

void kclvm_debug_print_str_list(int32_t len, int8_t** ss);

void kclvm_debug_print_type(kclvm_type_t* p);

void kclvm_debug_print_value(kclvm_value_ref_t* p);

void kclvm_debug_print_value_json_string(kclvm_value_ref_t* p);

void kclvm_default_collection_insert_int_pointer(kclvm_value_ref_t* p, kclvm_char_t* key, uint64_t* ptr);

void kclvm_default_collection_insert_value(kclvm_value_ref_t* p, kclvm_char_t* key, kclvm_value_ref_t* value);
Expand Down Expand Up @@ -488,7 +474,7 @@ kclvm_value_ref_t* kclvm_schema_get_value(kclvm_value_ref_t* p, kclvm_char_t* ke

kclvm_value_ref_t* kclvm_schema_instances(kclvm_context_t* ctx, kclvm_value_ref_t* args, kclvm_value_ref_t* kwargs);

kclvm_value_ref_t* kclvm_schema_optional_check(kclvm_value_ref_t* p, kclvm_value_ref_t* v, kclvm_char_t* schema_name, kclvm_value_ref_t* config_meta);
kclvm_value_ref_t* kclvm_schema_optional_check(kclvm_value_ref_t* p);

void kclvm_schema_value_check(kclvm_value_ref_t* schema_value, kclvm_value_ref_t* schema_config, kclvm_value_ref_t* _config_meta, kclvm_char_t* schema_name, kclvm_value_ref_t* index_sign_value, kclvm_char_t* _key_name, kclvm_char_t* key_type, kclvm_char_t* _value_type, kclvm_bool_t _any_other, kclvm_bool_t is_relaxed);

Expand Down Expand Up @@ -722,7 +708,7 @@ void kclvm_value_remove_item(kclvm_value_ref_t* a, kclvm_value_ref_t* b);

kclvm_value_ref_t* kclvm_value_schema_function(uint64_t* fn_ptr, uint64_t* check_fn_ptr, kclvm_char_t* tpe);

kclvm_value_ref_t* kclvm_value_schema_with_config(kclvm_value_ref_t* schema_dict, kclvm_value_ref_t* config, kclvm_char_t* name, kclvm_char_t* pkgpath, kclvm_value_ref_t* is_sub_schema, kclvm_value_ref_t* record_instance, kclvm_value_ref_t* instance_pkgpath);
kclvm_value_ref_t* kclvm_value_schema_with_config(kclvm_value_ref_t* schema_dict, kclvm_value_ref_t* config, kclvm_value_ref_t* config_meta, kclvm_char_t* name, kclvm_char_t* pkgpath, kclvm_value_ref_t* is_sub_schema, kclvm_value_ref_t* record_instance, kclvm_value_ref_t* instance_pkgpath, kclvm_value_ref_t* optional_mapping);

kclvm_value_ref_t* kclvm_value_slice(kclvm_value_ref_t* x, kclvm_value_ref_t* a, kclvm_value_ref_t* b, kclvm_value_ref_t* step);

Expand Down
18 changes: 2 additions & 16 deletions kclvm/runtime/src/_kclvm.ll
Original file line number Diff line number Diff line change
Expand Up @@ -230,20 +230,6 @@ declare %kclvm_value_ref_t* @kclvm_datetime_ticks(%kclvm_context_t* %_ctx, %kclv

declare %kclvm_value_ref_t* @kclvm_datetime_today(%kclvm_context_t* %_ctx, %kclvm_value_ref_t* %_args, %kclvm_value_ref_t* %_kwargs);

declare void @kclvm_debug_hello();

declare void @kclvm_debug_invoke_func(i8* %fn_ptr);

declare void @kclvm_debug_print(i8* %cs);

declare void @kclvm_debug_print_str_list(i32 %len, i8** %ss);

declare void @kclvm_debug_print_type(%kclvm_type_t* %p);

declare void @kclvm_debug_print_value(%kclvm_value_ref_t* %p);

declare void @kclvm_debug_print_value_json_string(%kclvm_value_ref_t* %p);

declare void @kclvm_default_collection_insert_int_pointer(%kclvm_value_ref_t* %p, %kclvm_char_t* %key, i64* %ptr);

declare void @kclvm_default_collection_insert_value(%kclvm_value_ref_t* %p, %kclvm_char_t* %key, %kclvm_value_ref_t* %value);
Expand Down Expand Up @@ -436,7 +422,7 @@ declare %kclvm_value_ref_t* @kclvm_schema_get_value(%kclvm_value_ref_t* %p, %kcl

declare %kclvm_value_ref_t* @kclvm_schema_instances(%kclvm_context_t* %ctx, %kclvm_value_ref_t* %args, %kclvm_value_ref_t* %kwargs);

declare %kclvm_value_ref_t* @kclvm_schema_optional_check(%kclvm_value_ref_t* %p, %kclvm_value_ref_t* %v, %kclvm_char_t* %schema_name, %kclvm_value_ref_t* %config_meta);
declare %kclvm_value_ref_t* @kclvm_schema_optional_check(%kclvm_value_ref_t* %p);

declare void @kclvm_schema_value_check(%kclvm_value_ref_t* %schema_value, %kclvm_value_ref_t* %schema_config, %kclvm_value_ref_t* %_config_meta, %kclvm_char_t* %schema_name, %kclvm_value_ref_t* %index_sign_value, %kclvm_char_t* %_key_name, %kclvm_char_t* %key_type, %kclvm_char_t* %_value_type, %kclvm_bool_t %_any_other, %kclvm_bool_t %is_relaxed);

Expand Down Expand Up @@ -670,7 +656,7 @@ declare void @kclvm_value_remove_item(%kclvm_value_ref_t* %a, %kclvm_value_ref_t

declare %kclvm_value_ref_t* @kclvm_value_schema_function(i64* %fn_ptr, i64* %check_fn_ptr, %kclvm_char_t* %tpe);

declare %kclvm_value_ref_t* @kclvm_value_schema_with_config(%kclvm_value_ref_t* %schema_dict, %kclvm_value_ref_t* %config, %kclvm_char_t* %name, %kclvm_char_t* %pkgpath, %kclvm_value_ref_t* %is_sub_schema, %kclvm_value_ref_t* %record_instance, %kclvm_value_ref_t* %instance_pkgpath);
declare %kclvm_value_ref_t* @kclvm_value_schema_with_config(%kclvm_value_ref_t* %schema_dict, %kclvm_value_ref_t* %config, %kclvm_value_ref_t* %config_meta, %kclvm_char_t* %name, %kclvm_char_t* %pkgpath, %kclvm_value_ref_t* %is_sub_schema, %kclvm_value_ref_t* %record_instance, %kclvm_value_ref_t* %instance_pkgpath, %kclvm_value_ref_t* %optional_mapping);

declare %kclvm_value_ref_t* @kclvm_value_slice(%kclvm_value_ref_t* %x, %kclvm_value_ref_t* %a, %kclvm_value_ref_t* %b, %kclvm_value_ref_t* %step);

Expand Down
7 changes: 0 additions & 7 deletions kclvm/runtime/src/_kclvm.rs
Original file line number Diff line number Diff line change
Expand Up @@ -127,13 +127,6 @@ pub enum ApiFunc {
kclvm_datetime_now,
kclvm_datetime_ticks,
kclvm_datetime_today,
kclvm_debug_hello,
kclvm_debug_invoke_func,
kclvm_debug_print,
kclvm_debug_print_str_list,
kclvm_debug_print_type,
kclvm_debug_print_value,
kclvm_debug_print_value_json_string,
kclvm_default_collection_insert_int_pointer,
kclvm_default_collection_insert_value,
kclvm_dict_clear,
Expand Down
36 changes: 4 additions & 32 deletions kclvm/runtime/src/_kclvm_api_spec.rs
Original file line number Diff line number Diff line change
Expand Up @@ -267,8 +267,8 @@
// api-spec(llvm): declare %kclvm_value_ref_t* @kclvm_value_Schema();

// api-spec: kclvm_value_schema_with_config
// api-spec(c): kclvm_value_ref_t* kclvm_value_schema_with_config(kclvm_value_ref_t* schema_dict, kclvm_value_ref_t* config, kclvm_char_t* name, kclvm_char_t* pkgpath, kclvm_value_ref_t* is_sub_schema, kclvm_value_ref_t* record_instance, kclvm_value_ref_t* instance_pkgpath);
// api-spec(llvm): declare %kclvm_value_ref_t* @kclvm_value_schema_with_config(%kclvm_value_ref_t* %schema_dict, %kclvm_value_ref_t* %config, %kclvm_char_t* %name, %kclvm_char_t* %pkgpath, %kclvm_value_ref_t* %is_sub_schema, %kclvm_value_ref_t* %record_instance, %kclvm_value_ref_t* %instance_pkgpath);
// api-spec(c): kclvm_value_ref_t* kclvm_value_schema_with_config(kclvm_value_ref_t* schema_dict, kclvm_value_ref_t* config, kclvm_value_ref_t* config_meta, kclvm_char_t* name, kclvm_char_t* pkgpath, kclvm_value_ref_t* is_sub_schema, kclvm_value_ref_t* record_instance, kclvm_value_ref_t* instance_pkgpath, kclvm_value_ref_t* optional_mapping);
// api-spec(llvm): declare %kclvm_value_ref_t* @kclvm_value_schema_with_config(%kclvm_value_ref_t* %schema_dict, %kclvm_value_ref_t* %config, %kclvm_value_ref_t* %config_meta, %kclvm_char_t* %name, %kclvm_char_t* %pkgpath, %kclvm_value_ref_t* %is_sub_schema, %kclvm_value_ref_t* %record_instance, %kclvm_value_ref_t* %instance_pkgpath, %kclvm_value_ref_t* %optional_mapping);

// api-spec: kclvm_value_Function
// api-spec(c): kclvm_value_ref_t* kclvm_value_Function(uint64_t* fn_ptr, kclvm_value_ref_t* closure, kclvm_char_t* external_name);
Expand Down Expand Up @@ -771,8 +771,8 @@
// api-spec(llvm): declare void @kclvm_schema_do_check_with_index_sign_attr(%kclvm_context_t* %ctx, %kclvm_value_ref_t* %args, %kclvm_value_ref_t* %kwargs, i64* %check_fn_ptr, %kclvm_char_t* %attr_name);

// api-spec: kclvm_schema_optional_check
// api-spec(c): kclvm_value_ref_t* kclvm_schema_optional_check(kclvm_value_ref_t* p, kclvm_value_ref_t* v, kclvm_char_t* schema_name, kclvm_value_ref_t* config_meta);
// api-spec(llvm): declare %kclvm_value_ref_t* @kclvm_schema_optional_check(%kclvm_value_ref_t* %p, %kclvm_value_ref_t* %v, %kclvm_char_t* %schema_name, %kclvm_value_ref_t* %config_meta);
// api-spec(c): kclvm_value_ref_t* kclvm_schema_optional_check(kclvm_value_ref_t* p);
// api-spec(llvm): declare %kclvm_value_ref_t* @kclvm_schema_optional_check(%kclvm_value_ref_t* %p);

// api-spec: kclvm_schema_default_settings
// api-spec(c): void kclvm_schema_default_settings(kclvm_value_ref_t* schema_value, kclvm_value_ref_t* config_value, kclvm_char_t* runtime_type);
Expand Down Expand Up @@ -1134,34 +1134,6 @@
// api-spec(c): void kclvm_assert(kclvm_value_ref_t* value, kclvm_value_ref_t* msg);
// api-spec(llvm): declare void @kclvm_assert(%kclvm_value_ref_t* %value, %kclvm_value_ref_t* %msg);

// api-spec: kclvm_debug_hello
// api-spec(c): void kclvm_debug_hello();
// api-spec(llvm): declare void @kclvm_debug_hello();

// api-spec: kclvm_debug_print
// api-spec(c): void kclvm_debug_print(int8_t* cs);
// api-spec(llvm): declare void @kclvm_debug_print(i8* %cs);

// api-spec: kclvm_debug_print_str_list
// api-spec(c): void kclvm_debug_print_str_list(int32_t len, int8_t** ss);
// api-spec(llvm): declare void @kclvm_debug_print_str_list(i32 %len, i8** %ss);

// api-spec: kclvm_debug_print_type
// api-spec(c): void kclvm_debug_print_type(kclvm_type_t* p);
// api-spec(llvm): declare void @kclvm_debug_print_type(%kclvm_type_t* %p);

// api-spec: kclvm_debug_print_value
// api-spec(c): void kclvm_debug_print_value(kclvm_value_ref_t* p);
// api-spec(llvm): declare void @kclvm_debug_print_value(%kclvm_value_ref_t* %p);

// api-spec: kclvm_debug_print_value_json_string
// api-spec(c): void kclvm_debug_print_value_json_string(kclvm_value_ref_t* p);
// api-spec(llvm): declare void @kclvm_debug_print_value_json_string(%kclvm_value_ref_t* %p);

// api-spec: kclvm_debug_invoke_func
// api-spec(c): void kclvm_debug_invoke_func(void* fn_ptr);
// api-spec(llvm): declare void @kclvm_debug_invoke_func(i8* %fn_ptr);

// api-spec: kclvm_builtin_option_init
// api-spec(c): void kclvm_builtin_option_init(kclvm_context_t* ctx, int8_t* key, int8_t* value);
// api-spec(llvm): declare void @kclvm_builtin_option_init(%kclvm_context_t* %ctx, i8* %key, i8* %value);
Expand Down
4 changes: 4 additions & 0 deletions kclvm/runtime/src/api/kclvm.rs
Original file line number Diff line number Diff line change
Expand Up @@ -252,6 +252,10 @@ pub struct SchemaValue {
pub pkgpath: String,
pub config: Box<DictValue>,
pub config_keys: Vec<String>,
/// schema config meta information including filename, line and column.
pub config_meta: ValueRef,
/// This map stores which attributes of the schema are optional and which are required.
pub optional_mapping: ValueRef,
}

#[derive(PartialEq, Eq, Clone, Default, Debug)]
Expand Down
27 changes: 15 additions & 12 deletions kclvm/runtime/src/value/api.rs
Original file line number Diff line number Diff line change
Expand Up @@ -261,15 +261,18 @@ pub extern "C" fn kclvm_value_Schema() -> *mut kclvm_value_ref_t {
pub extern "C" fn kclvm_value_schema_with_config(
schema_dict: *const kclvm_value_ref_t,
config: *const kclvm_value_ref_t,
config_meta: *const kclvm_value_ref_t,
name: *const kclvm_char_t,
pkgpath: *const kclvm_char_t,
is_sub_schema: *const kclvm_value_ref_t,
record_instance: *const kclvm_value_ref_t,
instance_pkgpath: *const kclvm_value_ref_t,
optional_mapping: *const kclvm_value_ref_t,
) -> *mut kclvm_value_ref_t {
let schema_dict = ptr_as_ref(schema_dict);
// Config dict
let config = ptr_as_ref(config);
let config_meta = ptr_as_ref(config_meta);
let config_keys: Vec<String> = config
.as_dict_ref()
.values
Expand All @@ -285,7 +288,9 @@ pub extern "C" fn kclvm_value_schema_with_config(
let record_instance = ptr_as_ref(record_instance);
let instance_pkgpath = ptr_as_ref(instance_pkgpath);
let instance_pkgpath = instance_pkgpath.as_str();
let schema = schema_dict.dict_to_schema(name, pkgpath, &config_keys);
let optional_mapping = ptr_as_ref(optional_mapping);
let schema =
schema_dict.dict_to_schema(name, pkgpath, &config_keys, config_meta, optional_mapping);
// Runtime context
let ctx = Context::current_context();
if record_instance.is_truthy()
Expand Down Expand Up @@ -2030,7 +2035,13 @@ pub extern "C" fn kclvm_schema_instances(
let names: Vec<&str> = runtime_type.rsplit('.').collect();
let name = names[0];
let pkgpath = names[1];
let v = v.dict_to_schema(name, pkgpath, &[]);
let v = v.dict_to_schema(
name,
pkgpath,
&[],
&ValueRef::dict(None),
&ValueRef::dict(None),
);
list.list_append(&v);
}
}
Expand Down Expand Up @@ -2135,21 +2146,13 @@ pub extern "C" fn kclvm_schema_do_check_with_index_sign_attr(
#[runtime_fn]
pub extern "C" fn kclvm_schema_optional_check(
p: *const kclvm_value_ref_t,
v: *const kclvm_value_ref_t,
schema_name: *const kclvm_char_t,
config_meta: *const kclvm_value_ref_t,
) -> *const kclvm_value_ref_t {
let p = ptr_as_ref(p);
let v = ptr_as_ref(v);
let schema_name = c2str(schema_name);
let config_meta = ptr_as_ref(config_meta);

let ctx = Context::current_context_mut();
if ctx.cfg.disable_schema_check {
return kclvm_value_None();
if !ctx.cfg.disable_schema_check {
p.schema_check_attr_optional(true);
}

p.schema_check_attr_optional(v, schema_name, config_meta);
kclvm_value_None()
}

Expand Down
2 changes: 2 additions & 0 deletions kclvm/runtime/src/value/val_clone.rs
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,8 @@ impl ValueRef {
pkgpath: v.pkgpath.clone(),
config: Box::new(dict.as_dict_ref().clone()),
config_keys: v.config_keys.clone(),
config_meta: v.config_meta.clone(),
optional_mapping: v.optional_mapping.clone(),
})))),
};
}
Expand Down
2 changes: 2 additions & 0 deletions kclvm/runtime/src/value/val_plan.rs
Original file line number Diff line number Diff line change
Expand Up @@ -285,6 +285,8 @@ impl ValueRef {
attr_map: IndexMap::default(),
}),
config_keys: vec![],
config_meta: v.config_meta.clone(),
optional_mapping: v.optional_mapping.clone(),
})))),
};
for (key, val) in v.config.values.iter() {
Expand Down
Loading

0 comments on commit eceaa50

Please sign in to comment.