]> Nishi Git Mirror - gwion.git/commitdiff
:art: global string
authorJérémie Astor <astor.jeremie@wanadoo.fr>
Tue, 26 Nov 2019 03:42:12 +0000 (04:42 +0100)
committerJérémie Astor <astor.jeremie@wanadoo.fr>
Tue, 26 Nov 2019 03:42:12 +0000 (04:42 +0100)
include/env/env.h
src/lib/string.c
src/oo/env_utils.c
src/parse/check.c

index 89e6084784692006f97bc92b415338369669ad2d..21e7823260bc678d887b71dfa136e9f328174a45 100644 (file)
@@ -51,4 +51,5 @@ ANN m_bool already_defined(const Env env, const Symbol s, const loc_t pos);
 ANN m_bool type_engine_check_prog(const Env, const Ast);
 ANN m_bool traverse_func_template(const Env, const Func_Def);
 ANN2(1,3) void env_err(const Env, const loc_t pos, const m_str fmt, ...);
+ANN Value global_string(const Env env, const m_str str);
 #endif
index 829a73c1ce6516cb85d07d7f36c3b60d56a41f0b..d0fb29da8cf389d895644fd1e78cda679ff7e4fe 100644 (file)
@@ -170,12 +170,12 @@ static CTOR(string_ctor) {
   STRING(o) = "";
 }
 
-ANN Type check_prim_str(const Env, const m_str *);
 ID_CHECK(check_funcpp) {
   ((Exp_Primary*)prim)->prim_type = ae_prim_str;
   ((Exp_Primary*)prim)->d.str = env->func ? env->func->name : env->class_def ?
     env->class_def->name : env->name;
-  return check_prim_str(env, &prim->d.str);
+  ((Exp_Primary*)prim)->value = global_string(env, prim->d.str);
+  return prim->value->type;
 }
 
 static GACK(gack_string) {
index 97dbe7406833294ae8b452fd1ef24fc0adc35a8f..039576ef476ba3578784b4f021d51e7714d06bf5 100644 (file)
@@ -92,3 +92,15 @@ ANN Value mk_class(const Env env, const Type base) {
   nspc_add_value_front(base->e->owner, sym, v);
   return v;
 }
+
+ANN Value global_string(const Env env, const m_str str) {
+  char c[strlen(str) + 8];
+  sprintf(c, "%s:string", str);
+  const Symbol sym = insert_symbol(c);
+  const Value v = nspc_lookup_value0(env->global_nspc, sym);
+  if(v)
+    return v;
+  const Value value = new_value(env->gwion->mp, env->gwion->type[et_string], s_name(sym));
+  nspc_add_value_front(env->global_nspc, sym, value);
+  return value;
+}
index 8b4dfe648f98699d11eb6ad68f50bab3827b52f3..e4bd38ea08dfc119fd59a93a50a79a15c0118634 100644 (file)
@@ -250,22 +250,9 @@ ANN static Type prim_id_non_res(const Env env, const Symbol *data) {
   return v->type;
 }
 
-ANN static inline Value prim_str_value(const Env env, const Symbol sym) {
-  const Value v = nspc_lookup_value0(env->global_nspc, sym);
-  if(v)
-    return v;
-  const Value value = new_value(env->gwion->mp, env->gwion->type[et_string], s_name(sym));
-  nspc_add_value_front(env->global_nspc, sym, value);
-  return value;
-}
-
 ANN Type check_prim_str(const Env env, const m_str *data) {
-  if(!prim_self(data)->value) {
-    const m_str str = *data;
-    char c[strlen(str) + 8];
-    sprintf(c, "%s:string", str);
-    prim_self(data)->value = prim_str_value(env, insert_symbol(c));
-  }
+  if(!prim_self(data)->value)
+    prim_self(data)->value = global_string(env, *data);
   return env->gwion->type[et_string];// prim->value
 }