Skip to content

Commit

Permalink
Merge branch 'master' of github.com:JuliaLang/julia
Browse files Browse the repository at this point in the history
* 'master' of github.com:JuliaLang/julia:
  use uninitialized arrays in find(). fix array type in nonzeros().
  warning instead of error for const redefinition. fixes issue #258.
  • Loading branch information
StefanKarpinski committed Nov 15, 2011
2 parents 3f1d1af + 7ce362e commit 6486728
Show file tree
Hide file tree
Showing 6 changed files with 44 additions and 28 deletions.
10 changes: 5 additions & 5 deletions j/abstractarray.j
Original file line number Diff line number Diff line change
Expand Up @@ -1393,7 +1393,7 @@ end

function find{T}(A::AbstractArray{T})
nnzA = nnz(A)
I = zeros(Size, nnzA)
I = Array(Size, nnzA)
z = zero(T)
count = 1
for i=1:length(A)
Expand All @@ -1409,8 +1409,8 @@ findn(A::AbstractVector) = find(A)

function findn{T}(A::AbstractMatrix{T})
nnzA = nnz(A)
I = zeros(Size, nnzA)
J = zeros(Size, nnzA)
I = Array(Size, nnzA)
J = Array(Size, nnzA)
z = zero(T)
count = 1
for j=1:size(A,2), i=1:size(A,1)
Expand Down Expand Up @@ -1439,7 +1439,7 @@ global findn
function findn{T}(A::AbstractArray{T})
ndimsA = ndims(A)
nnzA = nnz(A)
I = ntuple(ndimsA, x->zeros(Size, nnzA))
I = ntuple(ndimsA, x->Array(Size, nnzA))
ranges = ntuple(ndims(A), d->(1:size(A,d)))

if is(findn_cache,nothing)
Expand All @@ -1454,7 +1454,7 @@ end

function nonzeros{T}(A::AbstractArray{T})
nnzA = nnz(A)
V = zeros(Size, nnzA)
V = Array(T, nnzA)
z = zero(T)
count = 1
for i=1:length(A)
Expand Down
11 changes: 7 additions & 4 deletions src/builtins.c
Original file line number Diff line number Diff line change
Expand Up @@ -932,8 +932,10 @@ JL_CALLABLE(jl_f_new_struct_fields)
if (!jl_is_struct_type(t))
jl_error("you can't do that.");
jl_struct_type_t *st = (jl_struct_type_t*)t;
if (st->types != NULL)
jl_error("you can't do that.");
if (st->types != NULL) {
// type already exists. redefinition ignored.
return (jl_value_t*)jl_nothing;
}
check_type_tuple(ftypes, st->name->name, "type definition");
jl_tuple_t *fnames = st->names;

Expand Down Expand Up @@ -992,9 +994,10 @@ JL_CALLABLE(jl_f_new_tag_type_super)
{
JL_NARGS(new_tag_type_super, 2, 2);
JL_TYPECHK(new_tag_type_super, tag_type, args[1]);
jl_tag_type_t *tt = (jl_tag_type_t*)args[0];
jl_value_t *super = args[1];
check_supertype(super, ((jl_sym_t*)args[0])->name);
((jl_tag_type_t*)args[0])->super = (jl_tag_type_t*)super;
check_supertype(super, tt->name->name->name);
tt->super = (jl_tag_type_t*)super;
return (jl_value_t*)jl_nothing;
}

Expand Down
33 changes: 20 additions & 13 deletions src/codegen.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -981,15 +981,19 @@ static void emit_assignment(jl_value_t *l, jl_value_t *r, jl_codectx_t *ctx)
jl_binding_t *bnd=NULL;
Value *bp = var_binding_pointer(s, &bnd, ctx);
if (bnd) {
builder.CreateCall(jlcheckassign_func, literal_pointer_val((void*)bnd));
builder.CreateCall2(jlcheckassign_func,
literal_pointer_val((void*)bnd),
boxed(emit_expr(r, ctx, true)));
}
else {
const Type *vt = bp->getType();
if (vt->isPointerTy() && vt->getContainedType(0)!=jl_pvalue_llvmt)
builder.CreateStore(emit_unbox(vt->getContainedType(0), vt,
emit_unboxed(r, ctx)),
bp);
else
builder.CreateStore(boxed(emit_expr(r, ctx, true)), bp);
}
const Type *vt = bp->getType();
if (vt->isPointerTy() && vt->getContainedType(0)!=jl_pvalue_llvmt)
builder.CreateStore(emit_unbox(vt->getContainedType(0), vt,
emit_unboxed(r, ctx)),
bp);
else
builder.CreateStore(boxed(emit_expr(r, ctx, true)), bp);
}

// --- convert expression to code ---
Expand Down Expand Up @@ -1849,15 +1853,18 @@ static void init_julia_llvm_env(Module *m)
jl_ExecutionEngine->addGlobalMapping(jlgetbindingp_func,
(void*)&jl_get_bindingp);

std::vector<const Type *> args_1ptr(0);
args_1ptr.push_back(T_pint8);
std::vector<const Type *> args_2ptrs(0);
args_2ptrs.push_back(T_pint8);
args_2ptrs.push_back(jl_pvalue_llvmt);
jlcheckassign_func =
Function::Create(FunctionType::get(T_void, args_1ptr, false),
Function::Create(FunctionType::get(T_void, args_2ptrs, false),
Function::ExternalLinkage,
"jl_check_assignment", jl_Module);
"jl_checked_assignment", jl_Module);
jl_ExecutionEngine->addGlobalMapping(jlcheckassign_func,
(void*)&jl_check_assignment);
(void*)&jl_checked_assignment);

std::vector<const Type *> args_1ptr(0);
args_1ptr.push_back(T_pint8);
jldeclareconst_func =
Function::Create(FunctionType::get(T_void, args_1ptr, false),
Function::ExternalLinkage,
Expand Down
3 changes: 1 addition & 2 deletions src/interpreter.c
Original file line number Diff line number Diff line change
Expand Up @@ -100,8 +100,7 @@ static jl_value_t *eval(jl_value_t *e, jl_value_t **locals, size_t nl)
}
jl_binding_t *b = jl_get_binding(jl_system_module, (jl_sym_t*)sym);
jl_value_t *rhs = eval(args[1], locals, nl);
jl_check_assignment(b);
b->value = rhs;
jl_checked_assignment(b, rhs);
return (jl_value_t*)jl_nothing;
}
else if (ex->head == new_sym) {
Expand Down
2 changes: 1 addition & 1 deletion src/julia.h
Original file line number Diff line number Diff line change
Expand Up @@ -711,7 +711,7 @@ DLLEXPORT int jl_boundp(jl_module_t *m, jl_sym_t *var);
DLLEXPORT jl_value_t *jl_get_global(jl_module_t *m, jl_sym_t *var);
DLLEXPORT void jl_set_global(jl_module_t *m, jl_sym_t *var, jl_value_t *val);
DLLEXPORT void jl_set_const(jl_module_t *m, jl_sym_t *var, jl_value_t *val);
void jl_check_assignment(jl_binding_t *b);
void jl_checked_assignment(jl_binding_t *b, jl_value_t *rhs);
void jl_declare_constant(jl_binding_t *b);
jl_module_t *jl_add_module(jl_module_t *m, jl_module_t *child);
jl_module_t *jl_get_module(jl_module_t *m, jl_sym_t *name);
Expand Down
13 changes: 10 additions & 3 deletions src/module.c
Original file line number Diff line number Diff line change
Expand Up @@ -90,10 +90,17 @@ int jl_is_const(jl_sym_t *var)
return bp->constp;
}

void jl_check_assignment(jl_binding_t *b)
void jl_checked_assignment(jl_binding_t *b, jl_value_t *rhs)
{
if (b->constp && b->value != NULL)
jl_errorf("cannot redefine constant %s", b->name->name);
if (b->constp && b->value != NULL) {
//jl_errorf("cannot redefine constant %s", b->name->name);
ios_printf(ios_stderr,
"Warning: redefinition of constant %s ignored\n",
b->name->name);
}
else {
b->value = rhs;
}
}

void jl_declare_constant(jl_binding_t *b)
Expand Down

0 comments on commit 6486728

Please sign in to comment.