MIRROR: javascript for ๐Ÿœ's, a tiny runtime with big ambitions
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

use prototype pattern for Observable instances

+19 -11
+1
include/ant.h
··· 78 78 79 79 jsval_t js_getcurrentfunc(struct js *); 80 80 jsval_t js_get(struct js *, jsval_t, const char *); 81 + jsval_t js_getprop_proto(struct js *, jsval_t, const char *); 81 82 bool js_iter(struct js *js, jsval_t iterable, bool (*callback)(struct js *js, jsval_t value, void *udata), void *udata); 82 83 83 84 uint64_t js_sym_id(jsval_t sym);
+6
src/ant.c
··· 22178 22178 return off == 0 ? js_mkundef() : resolveprop(js, mkval(T_PROP, off)); 22179 22179 } 22180 22180 22181 + jsval_t js_getprop_proto(struct js *js, jsval_t obj, const char *key) { 22182 + size_t key_len = strlen(key); 22183 + jsoff_t off = lkp_proto(js, obj, key, key_len); 22184 + return off == 0 ? js_mkundef() : resolveprop(js, mkval(T_PROP, off)); 22185 + } 22186 + 22181 22187 typedef struct { 22182 22188 bool (*callback)(struct js *js, jsval_t value, void *udata); 22183 22189 void *udata;
+12 -11
src/modules/observable.c
··· 298 298 return js_mkerr_typed(js, JS_ERR_TYPE, "Observable subscriber must be a function"); 299 299 } 300 300 301 + jsval_t proto = js_get_ctor_proto(js, "Observable", 10); 301 302 jsval_t observable = js_mkobj(js); 303 + 304 + js_set_proto(js, observable, proto); 302 305 js_set_slot(js, observable, SLOT_OBSERVABLE_SUBSCRIBER, subscriber); 303 - js_set(js, observable, "subscribe", js_mkfun(js_observable_subscribe)); 304 - js_set(js, observable, get_observable_sym_key(), js_mkfun(js_observable_symbol_observable)); 305 - js_set(js, observable, get_toStringTag_sym_key(), js_mkstr(js, "Observable", 10)); 306 306 307 307 return observable; 308 308 } ··· 423 423 return js_mkerr_typed(js, JS_ERR_TYPE, "Cannot convert null or undefined to observable"); 424 424 } 425 425 426 - jsval_t observableMethod = js_get(js, x, get_observable_sym_key()); 426 + jsval_t observableMethod = js_getprop_proto(js, x, get_observable_sym_key()); 427 427 428 428 if (is_callable(observableMethod)) { 429 429 jsval_t observable = js_call_with_this(js, observableMethod, x, NULL, 0); ··· 468 468 jsval_t global = js_glob(js); 469 469 470 470 jsval_t observable_ctor = js_mkobj(js); 471 - js_set_slot(js, observable_ctor, SLOT_CFUNC, js_mkfun(js_observable_constructor)); 472 - js_set(js, observable_ctor, "of", js_mkfun(js_observable_of)); 473 - js_set(js, observable_ctor, "from", js_mkfun(js_observable_from)); 474 - 475 471 jsval_t observable_proto = js_mkobj(js); 472 + 476 473 js_set(js, observable_proto, "subscribe", js_mkfun(js_observable_subscribe)); 477 474 js_set(js, observable_proto, get_observable_sym_key(), js_mkfun(js_observable_symbol_observable)); 478 - js_set(js, observable_proto, "constructor", js_obj_to_func(observable_ctor)); 479 475 js_set(js, observable_proto, get_toStringTag_sym_key(), js_mkstr(js, "Observable", 10)); 480 476 481 - js_set(js, observable_ctor, "prototype", observable_proto); 482 - js_setprop_nonconfigurable(js, observable_ctor, "prototype", 9, observable_proto); 477 + js_set_slot(js, observable_ctor, SLOT_CFUNC, js_mkfun(js_observable_constructor)); 478 + js_mkprop_fast(js, observable_ctor, "prototype", 9, observable_proto); 479 + js_mkprop_fast(js, observable_ctor, "name", 4, ANT_STRING("Observable")); 480 + js_set_descriptor(js, observable_ctor, "name", 4, 0); 481 + js_set(js, observable_ctor, "of", js_mkfun(js_observable_of)); 482 + js_set(js, observable_ctor, "from", js_mkfun(js_observable_from)); 483 483 484 484 jsval_t Observable = js_obj_to_func(observable_ctor); 485 + js_set(js, observable_proto, "constructor", Observable); 485 486 js_set(js, global, "Observable", Observable); 486 487 }