Ignore:
Timestamp:
Jan 21, 2018, 12:10:09 AM (6 years ago)
Author:
coas-nagasima
Message:

prototoolに関連するプロジェクトをnewlibからmuslを使うよう変更・更新
ntshellをnewlibの下位の実装から、muslのsyscallの実装に変更・更新
以下のOSSをアップデート
・mruby-1.3.0
・musl-1.1.18
・onigmo-6.1.3
・tcc-0.9.27
以下のOSSを追加
・openssl-1.1.0e
・curl-7.57.0
・zlib-1.2.11
以下のmrbgemsを追加
・iij/mruby-digest
・iij/mruby-env
・iij/mruby-errno
・iij/mruby-iijson
・iij/mruby-ipaddr
・iij/mruby-mock
・iij/mruby-require
・iij/mruby-tls-openssl

Location:
EcnlProtoTool/trunk/mruby-1.3.0
Files:
1 edited
1 moved

Legend:

Unmodified
Added
Removed
  • EcnlProtoTool/trunk/mruby-1.3.0/src/hash.c

    r321 r331  
    55*/
    66
    7 #include "mruby.h"
    8 #include "mruby/array.h"
    9 #include "mruby/class.h"
    10 #include "mruby/hash.h"
    11 #include "mruby/khash.h"
    12 #include "mruby/string.h"
    13 #include "mruby/variable.h"
     7#include <mruby.h>
     8#include <mruby/array.h>
     9#include <mruby/class.h>
     10#include <mruby/hash.h>
     11#include <mruby/khash.h>
     12#include <mruby/string.h>
     13#include <mruby/variable.h>
    1414
    1515/* a function to get hash value of a float number */
     
    9292}
    9393
    94 typedef struct {
    95   mrb_value v;
    96   mrb_int n;
    97 } mrb_hash_value;
    98 
    99 KHASH_DECLARE(ht, mrb_value, mrb_hash_value, TRUE)
    10094KHASH_DEFINE (ht, mrb_value, mrb_hash_value, TRUE, mrb_hash_ht_hash_func, mrb_hash_ht_hash_equal)
    10195
     
    10599mrb_hash_ht_key(mrb_state *mrb, mrb_value key)
    106100{
    107   if (mrb_string_p(key) && !RSTR_FROZEN_P(mrb_str_ptr(key))) {
     101  if (mrb_string_p(key) && !MRB_FROZEN_P(mrb_str_ptr(key))) {
    108102    key = mrb_str_dup(mrb, key);
    109     RSTR_SET_FROZEN_FLAG(mrb_str_ptr(key));
     103    MRB_SET_FROZEN_FLAG(mrb_str_ptr(key));
    110104  }
    111105  return key;
     
    147141
    148142MRB_API mrb_value
    149 mrb_hash_new_capa(mrb_state *mrb, int capa)
     143mrb_hash_new_capa(mrb_state *mrb, mrb_int capa)
    150144{
    151145  struct RHash *h;
     
    166160}
    167161
     162static mrb_value mrb_hash_default(mrb_state *mrb, mrb_value hash);
     163static mrb_value hash_default(mrb_state *mrb, mrb_value hash, mrb_value key);
     164
    168165MRB_API mrb_value
    169166mrb_hash_get(mrb_state *mrb, mrb_value hash, mrb_value key)
     
    171168  khash_t(ht) *h = RHASH_TBL(hash);
    172169  khiter_t k;
     170  mrb_sym mid;
    173171
    174172  if (h) {
     
    178176  }
    179177
    180   /* not found */
    181   if (MRB_RHASH_PROCDEFAULT_P(hash)) {
    182     return mrb_funcall(mrb, RHASH_PROCDEFAULT(hash), "call", 2, hash, key);
    183   }
    184   return RHASH_IFNONE(hash);
     178  mid = mrb_intern_lit(mrb, "default");
     179  if (mrb_func_basic_p(mrb, hash, mid, mrb_hash_default)) {
     180    return hash_default(mrb, hash, key);
     181  }
     182  /* xxx mrb_funcall_tailcall(mrb, hash, "default", 1, key); */
     183  return mrb_funcall_argv(mrb, hash, mid, 1, &key);
    185184}
    186185
     
    234233  khash_t(ht) *h, *ret_h;
    235234  khiter_t k, ret_k;
     235  mrb_value ifnone, vret;
    236236
    237237  h = RHASH_TBL(hash);
     
    239239  ret->ht = kh_init(ht, mrb);
    240240
    241   if (kh_size(h) > 0) {
     241  if (h && kh_size(h) > 0) {
    242242    ret_h = ret->ht;
    243243
     
    247247        ret_k = kh_put(ht, mrb, ret_h, KEY(kh_key(h, k)));
    248248        mrb_gc_arena_restore(mrb, ai);
    249         kh_val(ret_h, ret_k) = kh_val(h, k);
     249        kh_val(ret_h, ret_k).v = kh_val(h, k).v;
     250        kh_val(ret_h, ret_k).n = kh_size(ret_h)-1;
    250251      }
    251252    }
    252253  }
    253254
    254   return mrb_obj_value(ret);
     255  if (MRB_RHASH_DEFAULT_P(hash)) {
     256    ret->flags |= MRB_HASH_DEFAULT;
     257  }
     258  if (MRB_RHASH_PROCDEFAULT_P(hash)) {
     259    ret->flags |= MRB_HASH_PROC_DEFAULT;
     260  }
     261  vret = mrb_obj_value(ret);
     262  ifnone = RHASH_IFNONE(hash);
     263  if (!mrb_nil_p(ifnone)) {
     264      mrb_iv_set(mrb, vret, mrb_intern_lit(mrb, "ifnone"), ifnone);
     265  }
     266  return vret;
    255267}
    256268
     
    275287mrb_hash_modify(mrb_state *mrb, mrb_value hash)
    276288{
     289  if (MRB_FROZEN_P(mrb_hash_ptr(hash))) {
     290    mrb_raise(mrb, E_RUNTIME_ERROR, "can't modify frozen hash");
     291  }
    277292  mrb_hash_tbl(mrb, hash);
    278293}
     
    330345    ifnone = block;
    331346  }
    332   mrb_iv_set(mrb, hash, mrb_intern_lit(mrb, "ifnone"), ifnone);
     347  if (!mrb_nil_p(ifnone)) {
     348    RHASH(hash)->flags |= MRB_HASH_DEFAULT;
     349    mrb_iv_set(mrb, hash, mrb_intern_lit(mrb, "ifnone"), ifnone);
     350  }
    333351  return hash;
    334352}
     
    357375}
    358376
     377static mrb_value
     378hash_default(mrb_state *mrb, mrb_value hash, mrb_value key)
     379{
     380  if (MRB_RHASH_DEFAULT_P(hash)) {
     381    if (MRB_RHASH_PROCDEFAULT_P(hash)) {
     382      return mrb_funcall(mrb, RHASH_PROCDEFAULT(hash), "call", 2, hash, key);
     383    }
     384    else {
     385      return RHASH_IFNONE(hash);
     386    }
     387  }
     388  return mrb_nil_value();
     389}
     390
    359391/* 15.2.13.4.5  */
    360392/*
     
    386418
    387419  mrb_get_args(mrb, "|o?", &key, &given);
    388   if (MRB_RHASH_PROCDEFAULT_P(hash)) {
    389     if (!given) return mrb_nil_value();
    390     return mrb_funcall(mrb, RHASH_PROCDEFAULT(hash), "call", 2, hash, key);
    391   }
    392   else {
    393     return RHASH_IFNONE(hash);
    394   }
     420  if (MRB_RHASH_DEFAULT_P(hash)) {
     421    if (MRB_RHASH_PROCDEFAULT_P(hash)) {
     422      if (!given) return mrb_nil_value();
     423      return mrb_funcall(mrb, RHASH_PROCDEFAULT(hash), "call", 2, hash, key);
     424    }
     425    else {
     426      return RHASH_IFNONE(hash);
     427    }
     428  }
     429  return mrb_nil_value();
    395430}
    396431
     
    424459  mrb_hash_modify(mrb, hash);
    425460  mrb_iv_set(mrb, hash, mrb_intern_lit(mrb, "ifnone"), ifnone);
    426   RHASH(hash)->flags &= ~(MRB_HASH_PROC_DEFAULT);
    427 
     461  RHASH(hash)->flags &= ~MRB_HASH_PROC_DEFAULT;
     462  if (!mrb_nil_p(ifnone)) {
     463    RHASH(hash)->flags |= MRB_HASH_DEFAULT;
     464  }
     465  else {
     466    RHASH(hash)->flags &= ~MRB_HASH_DEFAULT;
     467  }
    428468  return ifnone;
    429469}
     
    475515  mrb_hash_modify(mrb, hash);
    476516  mrb_iv_set(mrb, hash, mrb_intern_lit(mrb, "ifnone"), ifnone);
    477   RHASH(hash)->flags |= MRB_HASH_PROC_DEFAULT;
     517  if (!mrb_nil_p(ifnone)) {
     518    RHASH(hash)->flags |= MRB_HASH_PROC_DEFAULT;
     519    RHASH(hash)->flags |= MRB_HASH_DEFAULT;
     520  }
     521  else {
     522    RHASH(hash)->flags &= ~MRB_HASH_DEFAULT;
     523    RHASH(hash)->flags &= ~MRB_HASH_PROC_DEFAULT;
     524  }
    478525
    479526  return ifnone;
     
    530577
    531578  mrb_get_args(mrb, "o", &key);
     579  mrb_hash_modify(mrb, self);
    532580  return mrb_hash_delete_key(mrb, self, key);
    533581}
     
    568616  }
    569617
    570   if (MRB_RHASH_PROCDEFAULT_P(hash)) {
    571     return mrb_funcall(mrb, RHASH_PROCDEFAULT(hash), "call", 2, hash, mrb_nil_value());
    572   }
    573   else {
    574     return RHASH_IFNONE(hash);
    575   }
     618  if (MRB_RHASH_DEFAULT_P(hash)) {
     619    if (MRB_RHASH_PROCDEFAULT_P(hash)) {
     620      return mrb_funcall(mrb, RHASH_PROCDEFAULT(hash), "call", 2, hash, mrb_nil_value());
     621    }
     622    else {
     623      return RHASH_IFNONE(hash);
     624    }
     625  }
     626  return mrb_nil_value();
    576627}
    577628
     
    593644  khash_t(ht) *h = RHASH_TBL(hash);
    594645
     646  mrb_hash_modify(mrb, hash);
    595647  if (h) kh_clear(ht, mrb, h);
    596648  return hash;
     
    700752  khash_t(ht) *h = RHASH_TBL(hash);
    701753  khiter_t k;
     754  mrb_int end;
    702755  mrb_value ary;
    703756  mrb_value *p;
     
    705758  if (!h || kh_size(h) == 0) return mrb_ary_new(mrb);
    706759  ary = mrb_ary_new_capa(mrb, kh_size(h));
    707   mrb_ary_set(mrb, ary, kh_size(h)-1, mrb_nil_value());
     760  end = kh_size(h)-1;
     761  mrb_ary_set(mrb, ary, end, mrb_nil_value());
    708762  p = mrb_ary_ptr(ary)->ptr;
    709763  for (k = kh_begin(h); k != kh_end(h); k++) {
     
    712766      mrb_hash_value hv = kh_value(h, k);
    713767
    714       p[hv.n] = kv;
     768      if (hv.n <= end) {
     769        p[hv.n] = kv;
     770      }
     771      else {
     772        p[end] = kv;
     773      }
    715774    }
    716775  }
     
    731790 */
    732791
    733 static mrb_value
     792MRB_API mrb_value
    734793mrb_hash_values(mrb_state *mrb, mrb_value hash)
    735794{
Note: See TracChangeset for help on using the changeset viewer.