static entity_t *record_builtin_function(builtin_kind_t kind, symbol_t *symbol, type_t *function_type) { entity_t *entity = create_builtin_function(kind, symbol, function_type); record_entity(entity, /*is_definition=*/false); return entity; }
static entity_t *create_gnu_builtin_libc(const char *name, type_t *type) { obstack_printf(&symbol_obstack, "__builtin_%s", name); symbol_t *symbol = finalize_symbol_string(); entity_t *entity = create_builtin_function(BUILTIN_LIBC, symbol, type); entity->function.actual_name = symbol_table_insert(name); return entity; }
static entity_t *create_builtin_firm(ir_builtin_kind kind, const char *name, type_t *type) { symbol_t *symbol = symbol_table_insert(name); entity_t *entity = create_builtin_function(BUILTIN_FIRM, symbol, type); entity->function.b.firm_builtin_kind = kind; return entity; }
static entity_t *create_gnu_builtin(builtin_kind_t kind, const char *name, type_t *type) { obstack_printf(&symbol_obstack, "__builtin_%s", name); symbol_t *symbol = finalize_symbol_string(); entity_t *entity = create_builtin_function(kind, symbol, type); return entity; }
static entity_t *create_gnu_builtin_firm(ir_builtin_kind kind, const char *name, type_t *type) { obstack_printf(&symbol_obstack, "__builtin_%s", name); symbol_t *symbol = finalize_symbol_string(); entity_t *entity = create_builtin_function(BUILTIN_FIRM, symbol, type); entity->function.b.firm_builtin_kind = kind; return entity; }
static entity_t *create_gnu_builtin_chk(const char *name, unsigned chk_arg_pos, type_t *type) { obstack_printf(&symbol_obstack, "__builtin___%s_chk", name); symbol_t *symbol = finalize_symbol_string(); entity_t *entity = create_builtin_function(BUILTIN_LIBC_CHECK, symbol, type); entity->function.actual_name = symbol_table_insert(name); entity->function.b.chk_arg_pos = chk_arg_pos; return entity; }
HRESULT init_error_constr(script_ctx_t *ctx, DispatchEx *object_prototype) { static const WCHAR ErrorW[] = {'E','r','r','o','r',0}; static const WCHAR EvalErrorW[] = {'E','v','a','l','E','r','r','o','r',0}; static const WCHAR RangeErrorW[] = {'R','a','n','g','e','E','r','r','o','r',0}; static const WCHAR ReferenceErrorW[] = {'R','e','f','e','r','e','n','c','e','E','r','r','o','r',0}; static const WCHAR RegExpErrorW[] = {'R','e','g','E','x','p','E','r','r','o','r',0}; static const WCHAR SyntaxErrorW[] = {'S','y','n','t','a','x','E','r','r','o','r',0}; static const WCHAR TypeErrorW[] = {'T','y','p','e','E','r','r','o','r',0}; static const WCHAR URIErrorW[] = {'U','R','I','E','r','r','o','r',0}; static const WCHAR *names[] = {ErrorW, EvalErrorW, RangeErrorW, ReferenceErrorW, RegExpErrorW, SyntaxErrorW, TypeErrorW, URIErrorW}; DispatchEx **constr_addr[] = {&ctx->error_constr, &ctx->eval_error_constr, &ctx->range_error_constr, &ctx->reference_error_constr, &ctx->regexp_error_constr, &ctx->syntax_error_constr, &ctx->type_error_constr, &ctx->uri_error_constr}; static builtin_invoke_t constr_val[] = {ErrorConstr_value, EvalErrorConstr_value, RangeErrorConstr_value, ReferenceErrorConstr_value, RegExpErrorConstr_value, SyntaxErrorConstr_value, TypeErrorConstr_value, URIErrorConstr_value}; ErrorInstance *err; INT i; VARIANT v; HRESULT hres; for(i=0; i < sizeof(names)/sizeof(names[0]); i++) { hres = alloc_error(ctx, i==0 ? object_prototype : NULL, NULL, &err); if(FAILED(hres)) return hres; V_VT(&v) = VT_BSTR; V_BSTR(&v) = SysAllocString(names[i]); if(!V_BSTR(&v)) { jsdisp_release(&err->dispex); return E_OUTOFMEMORY; } hres = jsdisp_propput_name(&err->dispex, nameW, &v, NULL/*FIXME*/, NULL/*FIXME*/); if(SUCCEEDED(hres)) hres = create_builtin_function(ctx, constr_val[i], names[i], NULL, PROPF_CONSTR|1, &err->dispex, constr_addr[i]); jsdisp_release(&err->dispex); VariantClear(&v); if(FAILED(hres)) return hres; } return S_OK; }
HRESULT create_array_constr(script_ctx_t *ctx, jsdisp_t *object_prototype, jsdisp_t **ret) { ArrayInstance *array; HRESULT hres; static const WCHAR ArrayW[] = {'A','r','r','a','y',0}; hres = alloc_array(ctx, object_prototype, &array); if(FAILED(hres)) return hres; hres = create_builtin_function(ctx, ArrayConstr_value, ArrayW, NULL, PROPF_CONSTR|1, &array->dispex, ret); jsdisp_release(&array->dispex); return hres; }
HRESULT create_activex_constr(script_ctx_t *ctx, jsdisp_t **ret) { jsdisp_t *prototype; HRESULT hres; static const WCHAR ActiveXObjectW[] = {'A','c','t','i','v','e','X','O','b','j','e','c','t',0}; hres = create_object(ctx, NULL, &prototype); if(FAILED(hres)) return hres; hres = create_builtin_function(ctx, ActiveXObject_value, ActiveXObjectW, NULL, PROPF_CONSTR|1, prototype, ret); jsdisp_release(prototype); return hres; }
HRESULT create_number_constr(script_ctx_t *ctx, jsdisp_t *object_prototype, jsdisp_t **ret) { NumberInstance *number; HRESULT hres; static const WCHAR NumberW[] = {'N','u','m','b','e','r',0}; hres = alloc_number(ctx, object_prototype, &number); if(FAILED(hres)) return hres; V_VT(&number->num) = VT_I4; hres = create_builtin_function(ctx, NumberConstr_value, NumberW, NULL, PROPF_CONSTR|1, &number->dispex, ret); jsdisp_release(&number->dispex); return hres; }
HRESULT create_builtin_constructor(script_ctx_t *ctx, builtin_invoke_t value_proc, const WCHAR *name, const builtin_info_t *builtin_info, DWORD flags, jsdisp_t *prototype, jsdisp_t **ret) { jsdisp_t *constr; HRESULT hres; hres = create_builtin_function(ctx, value_proc, name, builtin_info, flags, prototype, &constr); if(FAILED(hres)) return hres; hres = set_constructor_prop(ctx, constr, prototype); if(FAILED(hres)) { jsdisp_release(constr); return hres; } *ret = constr; return S_OK; }
static HRESULT prop_get(DispatchEx *This, dispex_prop_t *prop, LCID lcid, DISPPARAMS *dp, VARIANT *retv, jsexcept_t *ei, IServiceProvider *caller) { HRESULT hres; switch(prop->type) { case PROP_BUILTIN: if(prop->u.p->flags & PROPF_METHOD) { DispatchEx *obj; hres = create_builtin_function(This->ctx, prop->u.p->invoke, prop->u.p->flags, NULL, &obj); if(FAILED(hres)) break; prop->type = PROP_VARIANT; V_VT(&prop->u.var) = VT_DISPATCH; V_DISPATCH(&prop->u.var) = (IDispatch*)_IDispatchEx_(obj); hres = VariantCopy(retv, &prop->u.var); }else { hres = prop->u.p->invoke(This, lcid, DISPATCH_PROPERTYGET, dp, retv, ei, caller); } break; case PROP_PROTREF: hres = prop_get(This->prototype, This->prototype->props+prop->u.ref, lcid, dp, retv, ei, caller); break; case PROP_VARIANT: hres = VariantCopy(retv, &prop->u.var); break; default: ERR("type %d\n", prop->type); return E_FAIL; } if(FAILED(hres)) { TRACE("fail %08x\n", hres); return hres; } TRACE("%s ret %s\n", debugstr_w(prop->name), debugstr_variant(retv)); return hres; }