solid_object *solid_get_namespace(solid_object *ns, solid_object *name) { if (ns->type != T_INSTANCE) { debug("ns->type: %d", ns->type); log_err("Namespace is not an instance"); exit(1); } else { hash_map *h = (hash_map *) ns->data; solid_object *ret = get_hash(h, solid_get_str_value(name)); if (ret == NULL) { log_err("Variable \"%s\" not in namespace", solid_get_str_value(name)); exit(1); } return ret; } }
void solid_set_namespace(solid_object *ns, solid_object *name, solid_object *o) { if (ns->type != T_INSTANCE) { debug("ns->type: %d", ns->type); log_err("Namespace is not an instance"); exit(1); } else { hash_map *h = (hash_map *) ns->data; set_hash(h, solid_get_str_value(name), (void *) o); } }
int solid_namespace_has(solid_object *ns, solid_object *name) { if (ns->type != T_INSTANCE) { debug("ns->type: %d", ns->type); log_err("Namespace is not an instance"); exit(1); } else { hash_map *h = (hash_map *) ns->data; solid_object *ret = get_hash(h, solid_get_str_value(name)); if (ret == NULL) { return 0; } return 1; } }
void solid_import(solid_vm *vm) { char *input = solid_get_str_value(solid_pop_stack(vm)); char *dot = strrchr(input, '.'); char *extension; if (!dot || dot == input) { extension = ""; } extension = dot + 1; if (strcmp(extension, "sol") == 0) { solid_object *func = solid_parse_tree(solid_parse_file(input)); solid_call_func(vm, func); } else if (strcmp(extension, "so") == 0) { void *handle = dlopen(input, RTLD_LAZY); void (*init)(solid_vm *); if (handle == NULL) { log_err("Loading external library %s failed with error %s", input, dlerror()); } dlerror(); *(void **) (&init) = dlsym(handle, "solid_init"); init(vm); //dlclose(handle); } }
void solid_compile(solid_vm *vm) { vm->regs[255] = solid_parse_tree(solid_parse_expr(solid_get_str_value(solid_pop_stack(vm)))); }